mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
d997b0cc12
commit
2d96f78cb1
|
@ -13,8 +13,6 @@ uses
|
|||
sys_tty;
|
||||
|
||||
var
|
||||
deci_tty:array[0..11] of t_tty;
|
||||
|
||||
dev_console:p_cdev;
|
||||
|
||||
procedure ttyconsdev_init(); //SYSINIT(tty, SI_SUB_DRIVERS, SI_ORDER_FIRST, ttyconsdev_init, nil);
|
||||
|
@ -375,6 +373,10 @@ end;
|
|||
|
||||
procedure ttyconsdev_init();
|
||||
begin
|
||||
tty_init(@std_tty[ 0],'[Input]:' ,nil);
|
||||
tty_init(@std_tty[ 1],'[Output]:',nil);
|
||||
tty_init(@std_tty[ 2],'[Error]:' ,nil);
|
||||
//
|
||||
tty_init(@deci_tty[ 0],'[stdin]:' ,nil);
|
||||
tty_init(@deci_tty[ 1],'[stdout]:',nil);
|
||||
tty_init(@deci_tty[ 2],'[stderr]:',nil);
|
||||
|
@ -402,6 +404,8 @@ begin
|
|||
tty_makedev(@deci_tty[ 9],'deci_ttya0' ,[]);
|
||||
tty_makedev(@deci_tty[10],'deci_ttyb0' ,[]);
|
||||
tty_makedev(@deci_tty[11],'deci_ttyc0' ,[]);
|
||||
//
|
||||
md_init_tty;
|
||||
end;
|
||||
|
||||
|
||||
|
|
|
@ -60,6 +60,9 @@ procedure threadinit; //SYSINIT
|
|||
function kthread_add (func,arg:Pointer;newtdp:pp_kthread;name:PChar):Integer;
|
||||
procedure kthread_exit();
|
||||
|
||||
var
|
||||
init_tty_cb:Tprocedure;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
|
@ -348,10 +351,35 @@ end;
|
|||
|
||||
procedure before_start(td:p_kthread);
|
||||
begin
|
||||
//init this
|
||||
ipi_sigreturn; //switch
|
||||
InitThread(td^.td_ustack.stack-td^.td_ustack.sttop);
|
||||
|
||||
if (init_tty_cb<>nil) then
|
||||
begin
|
||||
init_tty_cb();
|
||||
end;
|
||||
|
||||
//switch
|
||||
ipi_sigreturn;
|
||||
end;
|
||||
|
||||
procedure before_start_kern(td:p_kthread);
|
||||
type
|
||||
t_cb=procedure(arg:QWORD);
|
||||
begin
|
||||
InitThread(td^.td_ustack.stack-td^.td_ustack.sttop);
|
||||
|
||||
if (init_tty_cb<>nil) then
|
||||
begin
|
||||
init_tty_cb();
|
||||
end;
|
||||
|
||||
//call
|
||||
t_cb(td^.td_frame.tf_rip)(td^.td_frame.tf_rdi);
|
||||
|
||||
kthread_exit();
|
||||
end;
|
||||
|
||||
|
||||
procedure thread0_param(td:p_kthread);
|
||||
begin
|
||||
td^.td_base_user_pri:=700;
|
||||
|
@ -378,6 +406,8 @@ var
|
|||
newtd:p_kthread;
|
||||
stack:stack_t;
|
||||
|
||||
wrap:Pointer;
|
||||
|
||||
n:Integer;
|
||||
begin
|
||||
Result:=0;
|
||||
|
@ -446,10 +476,16 @@ begin
|
|||
newtd^.td_ustack.sttop:=stack_base;
|
||||
//user stack
|
||||
|
||||
|
||||
//seh wrapper
|
||||
wrap:=@before_start;
|
||||
seh_wrapper_before(newtd,wrap);
|
||||
//seh wrapper
|
||||
|
||||
n:=cpu_thread_create(newtd,
|
||||
stack_base,
|
||||
stack_size,
|
||||
@before_start,
|
||||
wrap,
|
||||
Pointer(newtd));
|
||||
|
||||
if (n<>0) then
|
||||
|
@ -506,7 +542,8 @@ begin
|
|||
//jit wrapper
|
||||
|
||||
//seh wrapper
|
||||
seh_wrapper(newtd);
|
||||
wrap:=@before_start;
|
||||
seh_wrapper_after(newtd,wrap);
|
||||
//seh wrapper
|
||||
|
||||
if (td<>nil) then
|
||||
|
@ -555,6 +592,8 @@ var
|
|||
newtd:p_kthread;
|
||||
stack:stack_t;
|
||||
|
||||
wrap:Pointer;
|
||||
|
||||
n:Integer;
|
||||
begin
|
||||
Result:=0;
|
||||
|
@ -582,11 +621,16 @@ begin
|
|||
newtd^.td_ustack.sttop:=newtd^.td_kstack.sttop;
|
||||
//user stack
|
||||
|
||||
//seh wrapper
|
||||
wrap:=@before_start_kern;
|
||||
seh_wrapper_before(newtd,wrap);
|
||||
//seh wrapper
|
||||
|
||||
n:=cpu_thread_create(newtd,
|
||||
stack.ss_sp,
|
||||
stack.ss_size,
|
||||
func,
|
||||
arg);
|
||||
wrap,
|
||||
Pointer(newtd));
|
||||
|
||||
if (n<>0) then
|
||||
begin
|
||||
|
@ -601,7 +645,8 @@ begin
|
|||
//jit wrapper
|
||||
|
||||
//seh wrapper
|
||||
seh_wrapper(newtd);
|
||||
wrap:=@before_start_kern;
|
||||
seh_wrapper_after(newtd,wrap);
|
||||
//seh wrapper
|
||||
|
||||
if (td<>nil) then
|
||||
|
@ -731,6 +776,8 @@ begin
|
|||
//free
|
||||
thread_dec_ref(td);
|
||||
|
||||
DoneThread;
|
||||
|
||||
cpu_sched_throw;
|
||||
end;
|
||||
|
||||
|
|
|
@ -32,7 +32,8 @@ function cpu_thread_finished(td:p_kthread):Boolean;
|
|||
function cpuset_setaffinity(td:p_kthread;new:Ptruint):Integer;
|
||||
function cpu_set_priority(td:p_kthread;prio:Integer):Integer;
|
||||
|
||||
procedure seh_wrapper(td:p_kthread);
|
||||
procedure seh_wrapper_before(td:p_kthread;var func:Pointer);
|
||||
procedure seh_wrapper_after (td:p_kthread;func:Pointer);
|
||||
|
||||
implementation
|
||||
|
||||
|
@ -332,12 +333,15 @@ asm
|
|||
.seh_handler __FPC_default_handler,@except,@unwind
|
||||
end;
|
||||
|
||||
procedure seh_wrapper(td:p_kthread);
|
||||
procedure seh_wrapper_before(td:p_kthread;var func:Pointer);
|
||||
begin
|
||||
td^.td_teb^.jitcall:=Pointer(td^.td_frame.tf_rip);
|
||||
td^.td_frame.tf_rip:=QWORD(@main_wrapper);
|
||||
func:=@main_wrapper;
|
||||
end;
|
||||
|
||||
procedure seh_wrapper_after(td:p_kthread;func:Pointer);
|
||||
begin
|
||||
td^.td_teb^.jitcall:=func;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
|
|
@ -125,7 +125,6 @@ begin
|
|||
|
||||
msleep_td(0);
|
||||
until false;
|
||||
kthread_exit();
|
||||
end;
|
||||
|
||||
procedure md_callout_reset(c:p_callout);
|
||||
|
|
|
@ -12,11 +12,15 @@ uses
|
|||
subr_uio,
|
||||
sys_tty;
|
||||
|
||||
function ttydisc_read_poll (tp:p_tty):QWORD;
|
||||
function ttydisc_write_poll(tp:p_tty):QWORD;
|
||||
function ttydisc_read_poll (tp:p_tty):QWORD;
|
||||
function ttydisc_write_poll(tp:p_tty):QWORD;
|
||||
|
||||
function ttydisc_read (tp:p_tty;uio:p_uio;ioflag:Integer):Integer;
|
||||
function ttydisc_write(tp:p_tty;uio:p_uio;ioflag:Integer):Integer;
|
||||
function ttydisc_read (tp:p_tty;uio:p_uio;ioflag:Integer):Integer;
|
||||
function ttydisc_write(tp:p_tty;uio:p_uio;ioflag:Integer):Integer;
|
||||
|
||||
function ttycrt_write(tp:p_tty;iov_base:Pointer;iov_len:qword):Integer;
|
||||
|
||||
procedure md_init_tty;
|
||||
|
||||
implementation
|
||||
|
||||
|
@ -76,7 +80,7 @@ end;
|
|||
|
||||
function ttydisc_write(tp:p_tty;uio:p_uio;ioflag:Integer):Integer;
|
||||
var
|
||||
LEN:QWORD;
|
||||
MAX,LEN,OFS:QWORD;
|
||||
BLK:IO_STATUS_BLOCK;
|
||||
OFFSET:Int64;
|
||||
PTR:Pointer;
|
||||
|
@ -86,26 +90,81 @@ begin
|
|||
BLK:=Default(IO_STATUS_BLOCK);
|
||||
OFFSET:=Int64(FILE_WRITE_TO_END_OF_FILE_L);
|
||||
//tty name
|
||||
LEN:=tp^.t_nlen;
|
||||
Move(tp^.t_name^,BUF,LEN);
|
||||
PTR:=@BUF[LEN];
|
||||
LEN:=uio^.uio_resid+LEN;
|
||||
OFS:=tp^.t_nlen;
|
||||
Move(tp^.t_name^,BUF,OFS);
|
||||
PTR:=@BUF[OFS];
|
||||
MAX:=Length(BUF)-OFS;
|
||||
LEN:=uio^.uio_resid+OFS;
|
||||
//text
|
||||
while (LEN<>0) do
|
||||
begin
|
||||
if (len>Length(BUF)) then len:=Length(BUF);
|
||||
if (LEN>MAX) then LEN:=MAX;
|
||||
//
|
||||
Result:=uiomove(PTR, len, uio);
|
||||
Result:=uiomove(PTR, LEN-OFS, uio);
|
||||
if (Result<>0) then Break;
|
||||
//
|
||||
NtWriteFile(tp^.t_wr_handle,0,nil,nil,@BLK,@BUF,LEN,@OFFSET,nil);
|
||||
//
|
||||
PTR:=@BUF[0];
|
||||
MAX:=Length(BUF);
|
||||
LEN:=uio^.uio_resid;
|
||||
OFS:=0;
|
||||
end;
|
||||
end;
|
||||
|
||||
function ttycrt_write(tp:p_tty;iov_base:Pointer;iov_len:qword):Integer;
|
||||
var
|
||||
MAX,LEN,OFS:QWORD;
|
||||
BLK:IO_STATUS_BLOCK;
|
||||
OFFSET:Int64;
|
||||
PTR:Pointer;
|
||||
BUF:array[0..1023] of AnsiChar;
|
||||
begin
|
||||
Result:=0;
|
||||
//init
|
||||
BLK:=Default(IO_STATUS_BLOCK);
|
||||
OFFSET:=Int64(FILE_WRITE_TO_END_OF_FILE_L);
|
||||
//tty name
|
||||
OFS:=tp^.t_nlen;
|
||||
Move(tp^.t_name^,BUF,OFS);
|
||||
PTR:=@BUF[OFS];
|
||||
MAX:=Length(BUF)-OFS;
|
||||
LEN:=iov_len+OFS;
|
||||
//text
|
||||
while (LEN<>0) do
|
||||
begin
|
||||
if (LEN>MAX) then LEN:=MAX;
|
||||
//
|
||||
MAX:=LEN-OFS;
|
||||
Move(iov_base^,PTR^,MAX);
|
||||
Inc(iov_base,MAX);
|
||||
Dec(iov_len ,MAX);
|
||||
//
|
||||
NtWriteFile(tp^.t_wr_handle,0,nil,nil,@BLK,@BUF,LEN,@OFFSET,nil);
|
||||
//
|
||||
PTR:=@BUF[0];
|
||||
MAX:=Length(BUF);
|
||||
LEN:=iov_len;
|
||||
OFS:=0;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure md_init_tty;
|
||||
var
|
||||
i:Integer;
|
||||
begin
|
||||
For i:=0 to High(std_tty) do
|
||||
begin
|
||||
std_tty[i].t_rd_handle:=GetStdHandle(STD_INPUT_HANDLE);
|
||||
std_tty[i].t_wr_handle:=GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
end;
|
||||
|
||||
For i:=0 to High(deci_tty) do
|
||||
begin
|
||||
deci_tty[i].t_rd_handle:=GetStdHandle(STD_INPUT_HANDLE);
|
||||
deci_tty[i].t_wr_handle:=GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
unit sys_crt;
|
||||
|
||||
{$mode ObjFPC}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
vuio,
|
||||
sys_tty;
|
||||
|
||||
Procedure sys_tty_init;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
md_tty,
|
||||
kern_thread;
|
||||
|
||||
Procedure CrtOutWrite(var t:TextRec);
|
||||
var
|
||||
tp:p_tty;
|
||||
Begin
|
||||
tp:=PPointer(@t.UserData)^;
|
||||
if (tp=nil) then Exit;
|
||||
|
||||
ttycrt_write(tp,t.Bufptr,t.BufPos);
|
||||
|
||||
t.BufPos:=0;
|
||||
end;
|
||||
|
||||
Procedure CrtClose(Var F:TextRec);
|
||||
Begin
|
||||
F.Mode:=fmClosed;
|
||||
end;
|
||||
|
||||
Procedure CrtOpenOut(Var F:TextRec);
|
||||
Begin
|
||||
F.InOutFunc:=@CrtOutWrite;
|
||||
F.FlushFunc:=@CrtOutWrite;
|
||||
F.CloseFunc:=@CrtClose;
|
||||
end;
|
||||
|
||||
procedure AssignTTY(var F:Text;tp:p_tty);
|
||||
begin
|
||||
Assign(F,'');
|
||||
//
|
||||
TextRec(F).OpenFunc :=@CrtOpenOut;
|
||||
//
|
||||
PPointer(@TextRec(F).UserData)^:=tp;
|
||||
end;
|
||||
|
||||
Procedure sys_tty_init;
|
||||
begin
|
||||
AssignTTY(Output ,@std_tty[ 1]);
|
||||
AssignTTY(StdOut ,@std_tty[ 1]);
|
||||
AssignTTY(ErrOutput,@std_tty[ 2]);
|
||||
AssignTTY(StdErr ,@std_tty[ 2]);
|
||||
//
|
||||
Rewrite(Output);
|
||||
Rewrite(StdOut);
|
||||
Rewrite(ErrOutput);
|
||||
Rewrite(StdErr);
|
||||
end;
|
||||
|
||||
initialization
|
||||
init_tty_cb:=@sys_tty_init;
|
||||
|
||||
end.
|
||||
|
|
@ -59,7 +59,6 @@ begin
|
|||
vnlru_proc;
|
||||
pause('sys_daemon',hz);
|
||||
until false;
|
||||
kthread_exit();
|
||||
end;
|
||||
|
||||
procedure sys_daemon_init;
|
||||
|
|
|
@ -34,6 +34,10 @@ procedure tty_unlock(tp:p_tty);
|
|||
procedure tty_init(tp:p_tty;name:PChar;mutex:p_mtx);
|
||||
procedure tty_fini(tp:p_tty);
|
||||
|
||||
var
|
||||
std_tty :array[0..2 ] of t_tty;
|
||||
deci_tty:array[0..11] of t_tty;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
|
|
|
@ -795,6 +795,10 @@
|
|||
<Filename Value="..\sys_tty.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit>
|
||||
<Unit>
|
||||
<Filename Value="..\sys_crt.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
|
|
|
@ -105,6 +105,7 @@ uses
|
|||
md_exception,
|
||||
systm,
|
||||
dev_tty,
|
||||
sys_crt,
|
||||
ps4_libSceSystemService,
|
||||
ps4_libSceIpmi,
|
||||
ps4_libSceDialogs,
|
||||
|
@ -371,12 +372,6 @@ begin
|
|||
|
||||
//readln;
|
||||
|
||||
For i:=0 to High(deci_tty) do
|
||||
begin
|
||||
deci_tty[i].t_rd_handle:=GetStdHandle(STD_INPUT_HANDLE);
|
||||
deci_tty[i].t_wr_handle:=GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
end;
|
||||
|
||||
//fs guest host
|
||||
err:=vfs_mount_mkdir('ufs','/app0' ,'/' ,nil,0);
|
||||
err:=vfs_mount_mkdir('ufs','/system','/system',nil,0);
|
||||
|
@ -537,7 +532,6 @@ var
|
|||
|
||||
calloutp:p_callout;
|
||||
begin
|
||||
|
||||
writeln('Get_SEH:0x',HexStr(Get_SEH));
|
||||
|
||||
//writeln('copyin:',copyin(mem2+64*1024*4-(sizeof(ucontext_t) div 2),@uctx,sizeof(ucontext_t)));
|
||||
|
|
|
@ -1809,9 +1809,13 @@ begin
|
|||
Assert(ma^.v<>nil, 'kernel_mount nil ma^.v');
|
||||
Assert((ma^.len and 1)=0, 'kernel_mount odd ma^.len (%d)');
|
||||
|
||||
auio.uio_iov:=ma^.v;
|
||||
auio.uio_iov :=ma^.v;
|
||||
auio.uio_iovcnt:=ma^.len;
|
||||
auio.uio_offset:=0;
|
||||
auio.uio_resid :=0;
|
||||
auio.uio_segflg:=UIO_SYSSPACE;
|
||||
auio.uio_rw :=UIO_READ;
|
||||
auio.uio_td :=nil;
|
||||
|
||||
error:=ma^.error;
|
||||
if (error=0) then
|
||||
|
|
Loading…
Reference in New Issue