mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
325e173d22
commit
8220721563
|
@ -87,7 +87,6 @@ function fdesc_allocvp(ftype:fdntype;fd_fd,ix:Integer;mp:p_mount;vpp:pp_vnode):
|
|||
implementation
|
||||
|
||||
uses
|
||||
sysutils,
|
||||
errno,
|
||||
time,
|
||||
vfile,
|
||||
|
@ -192,7 +191,9 @@ loop:
|
|||
VI_LOCK(vp);
|
||||
mtx_unlock(fdesc_hashmtx);
|
||||
if (vget(vp, LK_EXCLUSIVE or LK_INTERLOCK)<>0) then
|
||||
begin
|
||||
goto loop;
|
||||
end;
|
||||
vpp^:=vp;
|
||||
Exit(0);
|
||||
end;
|
||||
|
@ -259,7 +260,9 @@ loop:
|
|||
vput(vp);
|
||||
{ If we didn't get it, return no vnode. }
|
||||
if (error<>0) then
|
||||
begin
|
||||
vp2:=nil;
|
||||
end;
|
||||
vpp^:=vp2;
|
||||
Exit(error);
|
||||
end;
|
||||
|
@ -348,7 +351,9 @@ begin
|
|||
}
|
||||
error:=fget(fd, 0, @fp);
|
||||
if (error<>0) then
|
||||
begin
|
||||
goto bad;
|
||||
end;
|
||||
|
||||
{ Check if we're looking up ourselves. }
|
||||
if (VTOFDESC(dvp)^.fd_ix=FD_DESC + fd) then
|
||||
|
@ -387,7 +392,9 @@ begin
|
|||
end;
|
||||
|
||||
if (error<>0) then
|
||||
begin
|
||||
goto bad;
|
||||
end;
|
||||
vpp^:=fvp;
|
||||
Exit(0);
|
||||
|
||||
|
@ -483,7 +490,9 @@ begin
|
|||
* Can't mess with the root vnode
|
||||
}
|
||||
if (VTOFDESC(ap^.a_vp)^.fd_type=_Froot) then
|
||||
begin
|
||||
Exit(EACCES);
|
||||
end;
|
||||
|
||||
fd:=VTOFDESC(ap^.a_vp)^.fd_fd;
|
||||
|
||||
|
@ -539,7 +548,9 @@ begin
|
|||
dp:=@d;
|
||||
|
||||
if (VTOFDESC(ap^.a_vp)^.fd_type<>_Froot) then
|
||||
begin
|
||||
Assert(False,'fdesc_readdir: not dir');
|
||||
end;
|
||||
|
||||
if (ap^.a_ncookies<>nil) then
|
||||
ap^.a_ncookies^:=0;
|
||||
|
@ -550,7 +561,10 @@ begin
|
|||
(off < 0) or
|
||||
((off mod UIO_MX)<>0) or
|
||||
(uio^.uio_resid < UIO_MX) then
|
||||
begin
|
||||
Exit(EINVAL);
|
||||
end;
|
||||
|
||||
i:=off div UIO_MX;
|
||||
|
||||
error:=0;
|
||||
|
@ -577,10 +591,12 @@ begin
|
|||
begin
|
||||
tmp:=fget_unlocked(fcnt); //check exists
|
||||
if (tmp=nil) then
|
||||
begin
|
||||
goto _break;
|
||||
end;
|
||||
fdrop(tmp);
|
||||
|
||||
dp^.d_name :=IntToStr(fcnt);
|
||||
Str(fcnt,dp^.d_name);
|
||||
dp^.d_namlen:=strlen(dp^.d_name);
|
||||
dp^.d_reclen:=UIO_MX;
|
||||
dp^.d_type :=DT_CHR;
|
||||
|
@ -597,7 +613,9 @@ begin
|
|||
FILEDESC_SUNLOCK(@fd_table);
|
||||
error:=uiomove(dp, UIO_MX, uio);
|
||||
if (error<>0) then
|
||||
begin
|
||||
goto done;
|
||||
end;
|
||||
FILEDESC_SLOCK(@fd_table);
|
||||
end;
|
||||
Inc(i);
|
||||
|
|
|
@ -24,7 +24,8 @@ uses
|
|||
vcapability,
|
||||
vselinfo,
|
||||
vpoll,
|
||||
vstat;
|
||||
vstat,
|
||||
trap;
|
||||
|
||||
//TASKQUEUE_DEFINE_THREAD(kqueue);
|
||||
|
||||
|
@ -119,7 +120,9 @@ uses
|
|||
vsys_generic,
|
||||
kern_proc,
|
||||
kern_callout,
|
||||
kern_timeout;
|
||||
kern_timeout,
|
||||
kern_named_id,
|
||||
kern_namedobj;
|
||||
|
||||
//static MALLOC_DEFINE(M_KQUEUE, 'kqueue', 'memory for kqueue system');
|
||||
|
||||
|
@ -974,9 +977,11 @@ function kern_kevent(fd:Integer;
|
|||
label
|
||||
done_norel,
|
||||
done;
|
||||
type
|
||||
t_keva=array[0..KQ_NEVENTS-1] of t_kevent;
|
||||
var
|
||||
td:p_kthread;
|
||||
keva:array[0..KQ_NEVENTS-1] of t_kevent;
|
||||
keva:t_keva;
|
||||
kevp,changes:p_kevent;
|
||||
kq:p_kqueue;
|
||||
fp:p_file;
|
||||
|
@ -991,7 +996,20 @@ begin
|
|||
error:=kqueue_acquire(fp, @kq);
|
||||
if (error<>0) then goto done_norel;
|
||||
|
||||
//cache
|
||||
if (kq^.kq_name[0]=#0) and (kq^.kq_name[1]<>#1) then
|
||||
begin
|
||||
get_obj_name(Pointer(fd),$107,@kq^.kq_name);
|
||||
if (kq^.kq_name[0]=#0) then
|
||||
begin
|
||||
kq^.kq_name[1]:=#1;
|
||||
end;
|
||||
end;
|
||||
|
||||
Writeln('kern_kevent:',kq^.kq_name);
|
||||
|
||||
nerrors:=0;
|
||||
keva:=Default(t_keva);
|
||||
|
||||
while (nchanges > 0) do
|
||||
begin
|
||||
|
@ -1026,6 +1044,7 @@ begin
|
|||
end;
|
||||
Dec(nchanges,n);
|
||||
end;
|
||||
|
||||
if (nerrors<>0) then
|
||||
begin
|
||||
td^.td_retval[0]:=nerrors;
|
||||
|
@ -1147,9 +1166,13 @@ begin
|
|||
|
||||
if (sysfilt_ops[not filt].fop=nil) then
|
||||
begin
|
||||
Writeln(stderr,'kqueue_fo_find:',filt);
|
||||
Writeln(stderr,'kqueue filterops not found:',EVFILT_NAME(filt));
|
||||
sysfilt_ops[not filt].fop:=@null_filtops;
|
||||
end else
|
||||
begin
|
||||
Writeln('kqueue_fo_find:',EVFILT_NAME(filt));
|
||||
end;
|
||||
|
||||
mtx_unlock(filterops_lock);
|
||||
|
||||
Exit(sysfilt_ops[not filt].fop);
|
||||
|
@ -1270,7 +1293,9 @@ findkn:
|
|||
begin
|
||||
if (kev^.ident=kn^.kn_id) and
|
||||
(kev^.filter=kn^.kn_filter) then
|
||||
begin
|
||||
break;
|
||||
end;
|
||||
kn:=SLIST_NEXT(kn,@kn^.kn_link);
|
||||
end;
|
||||
end;
|
||||
|
@ -1296,7 +1321,7 @@ findkn:
|
|||
end;
|
||||
|
||||
{
|
||||
* kn now contains the matching knote, or nil if no match
|
||||
* kn now contains the matching knote, or null if no match
|
||||
}
|
||||
if (kn=nil) then
|
||||
begin
|
||||
|
|
|
@ -55,6 +55,7 @@ end;
|
|||
Procedure id_release(d:p_id_desc);
|
||||
begin
|
||||
if (d=nil) then Exit;
|
||||
Assert(d^.refs>0);
|
||||
if (System.InterlockedDecrement(d^.refs)=0) then
|
||||
if (d^.free<>nil) then
|
||||
begin
|
||||
|
|
|
@ -6,11 +6,13 @@ unit kern_namedobj;
|
|||
interface
|
||||
|
||||
uses
|
||||
mqueue,
|
||||
kern_named_id;
|
||||
|
||||
type
|
||||
p_namedobj=^t_namedobj;
|
||||
t_namedobj=packed object(t_id_named_desc)
|
||||
link:TAILQ_ENTRY;
|
||||
objp:Pointer;
|
||||
end;
|
||||
|
||||
|
@ -19,6 +21,8 @@ var
|
|||
|
||||
procedure named_table_init; //SYSINIT
|
||||
|
||||
function get_obj_name(objp:Pointer;objt:Integer;name:PChar):Boolean;
|
||||
|
||||
function sys_namedobj_create(name:PChar;objp:Pointer;objt:Integer):Integer;
|
||||
function sys_namedobj_delete(id,objt:Integer):Integer;
|
||||
|
||||
|
@ -31,18 +35,66 @@ implementation
|
|||
uses
|
||||
errno,
|
||||
systm,
|
||||
kern_thr;
|
||||
kern_thr,
|
||||
kern_rwlock;
|
||||
|
||||
var
|
||||
namedobj_list:TAILQ_HEAD=(tqh_first:nil;tqh_last:@namedobj_list.tqh_first);
|
||||
namedobj_lock:Pointer;
|
||||
|
||||
procedure named_table_init;
|
||||
begin
|
||||
id_table_init(@named_table,1);
|
||||
end;
|
||||
|
||||
procedure namedobj_add(data:p_namedobj);
|
||||
begin
|
||||
rw_wlock(namedobj_lock);
|
||||
TAILQ_INSERT_TAIL(@namedobj_list,data,@data^.link);
|
||||
rw_wunlock(namedobj_lock);
|
||||
end;
|
||||
|
||||
procedure namedobj_rem(data:p_namedobj);
|
||||
begin
|
||||
rw_wlock(namedobj_lock);
|
||||
TAILQ_REMOVE(@namedobj_list,data,@data^.link);
|
||||
rw_wunlock(namedobj_lock);
|
||||
end;
|
||||
|
||||
procedure namedobj_free(data:pointer);
|
||||
begin
|
||||
namedobj_rem(data);
|
||||
FreeMem(data);
|
||||
end;
|
||||
|
||||
function get_obj_name(objp:Pointer;objt:Integer;name:PChar):Boolean;
|
||||
var
|
||||
entry:p_namedobj;
|
||||
begin
|
||||
Result:=False;
|
||||
objt:=Word(objt) or NAMED_OBJT;
|
||||
|
||||
rw_rlock(namedobj_lock);
|
||||
|
||||
entry:=TAILQ_FIRST(@namedobj_list);
|
||||
while (entry<>nil) do
|
||||
begin
|
||||
if (entry^.objp=objp) and
|
||||
(entry^.objt=objt) then
|
||||
begin
|
||||
Result:=True;
|
||||
|
||||
copystr(entry^.name,name,SizeOf(entry^.name),nil);
|
||||
|
||||
Break;
|
||||
end;
|
||||
|
||||
entry:=TAILQ_NEXT(entry,@entry^.link);
|
||||
end;
|
||||
|
||||
rw_runlock(namedobj_lock);
|
||||
end;
|
||||
|
||||
function sys_namedobj_create(name:PChar;objp:Pointer;objt:Integer):Integer;
|
||||
var
|
||||
td:p_kthread;
|
||||
|
@ -68,11 +120,14 @@ begin
|
|||
obj^.name:=name;
|
||||
obj^.objp:=objp;
|
||||
|
||||
namedobj_add(obj);
|
||||
|
||||
if not id_name_new(@named_table,obj,@key) then
|
||||
begin
|
||||
namedobj_free(obj);
|
||||
Exit(EAGAIN);
|
||||
end;
|
||||
|
||||
id_release(obj);
|
||||
|
||||
td^.td_retval[0]:=key;
|
||||
|
|
|
@ -355,6 +355,16 @@ begin
|
|||
ipi_sigreturn; //switch
|
||||
end;
|
||||
|
||||
procedure thread0_param(td:p_kthread);
|
||||
begin
|
||||
td^.td_base_user_pri:=700;
|
||||
td^.td_lend_user_pri:=1023;
|
||||
td^.td_base_pri :=68;
|
||||
td^.td_priority :=68;
|
||||
td^.td_pri_class :=10;
|
||||
td^.td_user_pri :=700;
|
||||
end;
|
||||
|
||||
function create_thread(td :p_kthread; //calling thread
|
||||
ctx :p_mcontext_t;
|
||||
start_func:Pointer;
|
||||
|
@ -432,6 +442,8 @@ begin
|
|||
newtd:=thread_alloc;
|
||||
if (newtd=nil) then Exit(ENOMEM);
|
||||
|
||||
thread0_param(newtd);
|
||||
|
||||
//user stack
|
||||
newtd^.td_ustack.stack:=stack_base+stack_size;
|
||||
newtd^.td_ustack.sttop:=stack_base;
|
||||
|
@ -563,6 +575,8 @@ begin
|
|||
newtd:=thread_alloc;
|
||||
if (newtd=nil) then Exit(ENOMEM);
|
||||
|
||||
thread0_param(newtd);
|
||||
|
||||
stack.ss_sp :=newtd^.td_kstack.sttop;
|
||||
stack.ss_size:=(ptruint(newtd^.td_kstack.stack)-ptruint(newtd^.td_kstack.sttop));
|
||||
|
||||
|
|
|
@ -228,6 +228,7 @@ type
|
|||
{$IF sizeof(t_kevent_copyops)<>24}{$STOP sizeof(t_kevent_copyops)<>24}{$ENDIF}
|
||||
|
||||
procedure EV_SET(kevp:p_kevent;a:PtrUint;b:SmallInt;c:Word;d:DWORD;e:Ptrint;f:Pointer);
|
||||
function EVFILT_NAME(i:Integer):RawByteString;
|
||||
|
||||
implementation
|
||||
|
||||
|
@ -241,6 +242,36 @@ begin
|
|||
(kevp)^.udata :=(f);
|
||||
end;
|
||||
|
||||
function EVFILT_NAME(i:Integer):RawByteString;
|
||||
begin
|
||||
Result:='';
|
||||
case i of
|
||||
EVFILT_READ :Result:='EVFILT_READ';
|
||||
EVFILT_WRITE :Result:='EVFILT_WRITE';
|
||||
EVFILT_AIO :Result:='EVFILT_AIO';
|
||||
EVFILT_VNODE :Result:='EVFILT_VNODE';
|
||||
EVFILT_PROC :Result:='EVFILT_PROC';
|
||||
EVFILT_SIGNAL :Result:='EVFILT_SIGNAL';
|
||||
EVFILT_TIMER :Result:='EVFILT_TIMER';
|
||||
EVFILT_FS :Result:='EVFILT_FS';
|
||||
EVFILT_LIO :Result:='EVFILT_LIO';
|
||||
EVFILT_USER :Result:='EVFILT_USER';
|
||||
EVFILT_POLLING :Result:='EVFILT_POLLING';
|
||||
EVFILT_DISPLAY :Result:='EVFILT_DISPLAY';
|
||||
EVFILT_GRAPHICS_CORE :Result:='EVFILT_GRAPHICS_CORE';
|
||||
EVFILT_HRTIMER :Result:='EVFILT_HRTIMER';
|
||||
EVFILT_UVD_TRAP :Result:='EVFILT_UVD_TRAP';
|
||||
EVFILT_VCE_TRAP :Result:='EVFILT_VCE_TRAP';
|
||||
EVFILT_SDMA_TRAP :Result:='EVFILT_SDMA_TRAP';
|
||||
EVFILT_REG_EV :Result:='EVFILT_REG_EV';
|
||||
EVFILT_GPU_EXCEPTION :Result:='EVFILT_GPU_EXCEPTION';
|
||||
EVFILT_GPU_SYSTEM_EXCEPTION:Result:='EVFILT_GPU_SYSTEM_EXCEPTION';
|
||||
EVFILT_GPU_DBGGC_EV :Result:='EVFILT_GPU_DBGGC_EV';
|
||||
EVFILT_CPUMODE :Result:='EVFILT_CPUMODE';
|
||||
else
|
||||
Str(i,Result);
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
|
|
@ -1189,6 +1189,7 @@ begin
|
|||
fp:=AllocMem(SizeOf(t_file));
|
||||
if (fp=nil) then Exit(ENOMEM);
|
||||
|
||||
fp^.desc.refs:=1;
|
||||
fp^.desc.free:=@_fdrop;
|
||||
fp^.f_ops :=@badfileops;
|
||||
fp^.f_data :=nil;
|
||||
|
|
|
@ -913,6 +913,7 @@ begin
|
|||
|
||||
Exit(error);
|
||||
end;
|
||||
|
||||
td^.td_dupfd:=0;
|
||||
vfslocked:=NDHASGIANT(@nd);
|
||||
NDFREE(@nd, NDF_ONLY_PNBUF);
|
||||
|
@ -1006,8 +1007,10 @@ success:
|
|||
fdrop(fp);
|
||||
td^.td_retval[0]:=indx;
|
||||
Exit(0);
|
||||
|
||||
bad:
|
||||
VFS_UNLOCK_GIANT(vfslocked);
|
||||
|
||||
bad_unlocked:
|
||||
if (indx<>-1) then
|
||||
begin
|
||||
|
|
Loading…
Reference in New Issue