diff --git a/sys/dev/dev_dce.pas b/sys/dev/dev_dce.pas index 5fee4fae..f648d403 100644 --- a/sys/dev/dev_dce.pas +++ b/sys/dev/dev_dce.pas @@ -21,7 +21,7 @@ uses systm, trap, vm, - vm_object, + sys_vm_object, vm_pager, kern_event, kern_mtx, @@ -712,8 +712,8 @@ begin begin knlist_remove(@g_video_out_event_flip,kn,0) end; - //$0051:Result:=8; - //$0058:Result:=12; + // $0051:Result:=8; + // $0058:Result:=12; else; end; diff --git a/sys/dev/dev_dmem.pas b/sys/dev/dev_dmem.pas index f7ca2c65..095ee987 100644 --- a/sys/dev/dev_dmem.pas +++ b/sys/dev/dev_dmem.pas @@ -19,7 +19,7 @@ uses vm, dmem_map, kern_dmem, - vm_object, + sys_vm_object, trap; type diff --git a/sys/fs/devfs/devfs_devs.pas b/sys/fs/devfs/devfs_devs.pas index 7857ab37..f2f12077 100644 --- a/sys/fs/devfs/devfs_devs.pas +++ b/sys/fs/devfs/devfs_devs.pas @@ -46,8 +46,7 @@ uses kern_sx, vfs_vnops, vfs_subr, - vnode_if, - devfs_vnops; + vnode_if; var devfs_desc:t_id_desc=(free:nil;refs:0); diff --git a/sys/fs/fdescfs/fdesc_vnops.pas b/sys/fs/fdescfs/fdesc_vnops.pas index f092ec3d..521c9bba 100644 --- a/sys/fs/fdescfs/fdesc_vnops.pas +++ b/sys/fs/fdescfs/fdesc_vnops.pas @@ -467,8 +467,6 @@ begin vap^.va_size :=0; vap^.va_rdev :=makedev(0, vap^.va_fileid); end; - else - Assert(False,'fdesc_getattr'); end; vp^.v_type:=vap^.va_type; diff --git a/sys/kern/kern_dmem.pas b/sys/kern/kern_dmem.pas index d45808a5..bd32314e 100644 --- a/sys/kern/kern_dmem.pas +++ b/sys/kern/kern_dmem.pas @@ -6,7 +6,7 @@ unit kern_dmem; interface uses - vm_object, + sys_vm_object, dmem_map, rmem_map; diff --git a/sys/kern/kern_event.inc b/sys/kern/kern_event.inc deleted file mode 100644 index e14077c0..00000000 --- a/sys/kern/kern_event.inc +++ /dev/null @@ -1,34 +0,0 @@ - - -procedure knote(list:p_knlist;hint:QWORD;lockflags:Integer); external; - -procedure KNOTE_LOCKED(list:p_knlist;hint:QWORD); inline; -begin - knote(list, hint, KNF_LISTLOCKED); -end; - -procedure KNOTE_UNLOCKED(list:p_knlist;hint:QWORD); inline; -begin - knote(list, hint, 0); -end; - -procedure knlist_add (knl:p_knlist;kn:p_knote;islocked:Integer); external; -procedure knlist_remove(knl:p_knlist;kn:p_knote;islocked:Integer); external; - -procedure knlist_destroy (knl:p_knlist); external; -procedure knlist_cleardel(knl:p_knlist;islocked,killkn:Integer); external; - -procedure knlist_clear(knl:p_knlist;islocked:Integer); inline; -begin - knlist_cleardel(knl, islocked, 0) -end; - -procedure knlist_init(knl:p_knlist;lock,kl_lock,kl_unlock,kl_assert_locked,kl_assert_unlocked:Pointer); external; -procedure knlist_init_mtx(knl:p_knlist;lock:p_mtx); external; - -function M_KNLIST_EMPTY(list:p_knlist):Boolean; inline; -begin - Result:=SLIST_EMPTY(@list^.kl_list); -end; - - diff --git a/sys/kern/kern_event.pas b/sys/kern/kern_event.pas index 3a549d5a..c6f4d451 100644 --- a/sys/kern/kern_event.pas +++ b/sys/kern/kern_event.pas @@ -24,8 +24,7 @@ uses vcapability, vselinfo, vpoll, - vstat, - trap; + vstat; //TASKQUEUE_DEFINE_THREAD(kqueue); @@ -121,7 +120,6 @@ uses kern_proc, kern_callout, kern_timeout, - kern_named_id, kern_namedobj; //static MALLOC_DEFINE(M_KQUEUE, 'kqueue', 'memory for kqueue system'); @@ -2519,7 +2517,7 @@ end; * lock. This prevents a race where a new fd comes along and occupies the * entry and we attach a knote to the fd. } -procedure knote_fdclose(fd:Integer); +procedure knote_fdclose(fd:Integer); public; label again; var diff --git a/sys/kern/kern_exec.pas b/sys/kern/kern_exec.pas index 026b2f1c..f1e9aac2 100644 --- a/sys/kern/kern_exec.pas +++ b/sys/kern/kern_exec.pas @@ -40,7 +40,7 @@ uses vmparam, vm_map, vm_mmap, - vm_object, + sys_vm_object, vm_pager, vnamei, vfs_lookup, @@ -53,7 +53,7 @@ uses kern_descrip, vfs_cache, vnode_if, - _resource, + sys_resource, kern_resource, sys_event, kern_event, @@ -856,9 +856,6 @@ end; function dynlib_proc_initialize_step2(imgp:p_image_params):Integer; var obj,tail:p_lib_info; - - init_proc_addr:Pointer; - fini_proc_addr:Pointer; begin Result:=0; @@ -887,9 +884,6 @@ begin dynlibs_info.sym_zero.st_shndx:=SHN_UNDEF; dynlibs_info.sym_zero.st_value:=-Int64(obj^.relocbase); - init_proc_addr:=obj^.init_proc_addr; - fini_proc_addr:=obj^.fini_proc_addr; - obj^.fini_proc_addr:=nil; obj^.init_proc_addr:=nil; diff --git a/sys/kern/kern_exit.pas b/sys/kern/kern_exit.pas index 7d35df51..0ecdfdf6 100644 --- a/sys/kern/kern_exit.pas +++ b/sys/kern/kern_exit.pas @@ -6,7 +6,7 @@ unit kern_exit; interface uses - _resource; + sys_resource; const WCOREFLAG=&0200; diff --git a/sys/kern/kern_ksched.pas b/sys/kern/kern_ksched.pas index 17cc71ce..bf7ac8f3 100644 --- a/sys/kern/kern_ksched.pas +++ b/sys/kern/kern_ksched.pas @@ -40,7 +40,6 @@ uses errno, systm, kern_thr, - kern_rtprio, kern_proc, md_proc; diff --git a/sys/kern/kern_proc.pas b/sys/kern/kern_proc.pas index e69f8d3d..014a29cc 100644 --- a/sys/kern/kern_proc.pas +++ b/sys/kern/kern_proc.pas @@ -80,10 +80,6 @@ uses // -procedure knlist_init_mtx(knl:p_knlist;lock:p_mtx); external; - -// - function pargs_alloc(len:Integer):p_pargs; begin Result:=AllocMem(sizeof(t_pargs) + len); diff --git a/sys/kern/kern_resource.pas b/sys/kern/kern_resource.pas index 306a3e58..5601e8a3 100644 --- a/sys/kern/kern_resource.pas +++ b/sys/kern/kern_resource.pas @@ -8,7 +8,7 @@ interface uses vmparam, kern_param, - _resource; + sys_resource; function lim_max(which:Integer):QWORD; function lim_cur(which:Integer):QWORD; diff --git a/sys/kern/kern_rtld.pas b/sys/kern/kern_rtld.pas index 1d485d84..8a19590e 100644 --- a/sys/kern/kern_rtld.pas +++ b/sys/kern/kern_rtld.pas @@ -10,7 +10,7 @@ uses kern_param, kern_thr, vnode, - vm_object, + sys_vm_object, vuio, elf64, kern_authinfo; diff --git a/sys/kern/kern_rtprio.pas b/sys/kern/kern_rtprio.pas index c66492dd..19439620 100644 --- a/sys/kern/kern_rtprio.pas +++ b/sys/kern/kern_rtprio.pas @@ -63,7 +63,7 @@ begin thread_unlock(td); end; -procedure pri_to_rtp(td:p_kthread;rtp:p_rtprio); +procedure pri_to_rtp(td:p_kthread;rtp:p_rtprio); public; begin thread_lock(td); diff --git a/sys/kern/kern_sig.pas b/sys/kern/kern_sig.pas index 406bd583..8e541fa8 100644 --- a/sys/kern/kern_sig.pas +++ b/sys/kern/kern_sig.pas @@ -132,12 +132,6 @@ uses sched_ule, subr_sleepqueue; -// - -{$I kern_event.inc} - -// - const max_pending_per_proc=128; @@ -490,7 +484,7 @@ begin end; end; -Function sigonstack(sp:size_t):Integer; +Function sigonstack(sp:size_t):Integer; public; var td:p_kthread; begin @@ -685,7 +679,7 @@ Function kern_sigprocmask(td:p_kthread; _set:p_sigset_t; oset:p_sigset_t; flags:Integer - ):Integer; + ):Integer; public; label _out; var @@ -867,10 +861,7 @@ begin tv:=0; end; - //PROC_UNLOCK; // Result:=msleep(@p_sigacts,@p_proc.p_mtx,PPAUSE or PCATCH,'sigwait',tvtohz(tv)); - //Result:=msleep_td(tvtohz(tv)); - //PROC_LOCK; // if (timeout<>nil) then begin @@ -1472,7 +1463,7 @@ begin tdsigwakeup(td,sig,action,intrval); end; -procedure tdsignal(td:p_kthread;sig:Integer); +procedure tdsignal(td:p_kthread;sig:Integer); public; var ksi:ksiginfo_t; begin @@ -1603,7 +1594,7 @@ begin reschedule_signals(unblocked,0); end; -function sigdeferstop:Integer; +function sigdeferstop:Integer; public; var td:p_kthread; begin @@ -1615,7 +1606,7 @@ begin Result:=1; end; -procedure sigallowstop; +procedure sigallowstop; public; var td:p_kthread; begin @@ -1739,7 +1730,7 @@ begin Result:=1; end; -procedure sigexit(td:p_kthread;sig:Integer); +procedure sigexit(td:p_kthread;sig:Integer); public; begin exit1(W_EXITCODE(0,sig)); // NOTREACHED @@ -1747,7 +1738,7 @@ end; // -procedure ast; +procedure ast; public; var td:p_kthread; flags,sig:Integer; diff --git a/sys/kern/kern_stub.pas b/sys/kern/kern_stub.pas index 6728de4a..a9a9bc3b 100644 --- a/sys/kern/kern_stub.pas +++ b/sys/kern/kern_stub.pas @@ -49,7 +49,7 @@ uses vmparam, vm_map, vm_mmap, - vm_object; + sys_vm_object; var {$IFDEF chunk_alloc} diff --git a/sys/kern/kern_synch.pas b/sys/kern/kern_synch.pas index 2234e4fa..5eef072b 100644 --- a/sys/kern/kern_synch.pas +++ b/sys/kern/kern_synch.pas @@ -140,7 +140,7 @@ begin Result:=(tsleep(@pause_wchan, 0, wmesg, timo)); end; -procedure wakeup(ident:Pointer); +procedure wakeup(ident:Pointer); public; begin sleepq_lock(ident); sleepq_broadcast(ident,SLEEPQ_SLEEP,0,0); diff --git a/sys/kern/kern_thr.pas b/sys/kern/kern_thr.pas index c4e0dd7b..2af10598 100644 --- a/sys/kern/kern_thr.pas +++ b/sys/kern/kern_thr.pas @@ -252,6 +252,23 @@ type function curkthread:p_kthread; procedure set_curkthread(td:p_kthread); +const + SIG_ALTERABLE=$80000000; + SIG_STI_LOCK =$40000000; + + NOT_PCB_FULL_IRET=not PCB_FULL_IRET; + NOT_SIG_ALTERABLE=not SIG_ALTERABLE; + NOT_SIG_STI_LOCK =not SIG_STI_LOCK; + + TDF_AST=TDF_ASTPENDING or TDF_NEEDRESCHED; + +procedure sig_sta; assembler; +procedure sig_cla; assembler; +procedure sig_sti; assembler; +procedure sig_cli; assembler; + +procedure set_pcb_flags(td:p_kthread;f:Integer); + function TD_IS_SLEEPING(td:p_kthread):Boolean; function TD_ON_SLEEPQ(td:p_kthread):Boolean; function TD_IS_SUSPENDED(td:p_kthread):Boolean; @@ -288,6 +305,9 @@ function curthread_pflags_set(flags:Integer):Integer; procedure curthread_pflags_restore(save:Integer); procedure curthread_set_pcb_onfault(v:Pointer); +procedure thread_lock(td:p_kthread); external; +procedure thread_unlock(td:p_kthread); external; + implementation function curkthread:p_kthread; assembler; nostackframe; @@ -300,6 +320,31 @@ asm movqq td,%gs:teb.thread end; +procedure sig_sta; assembler; nostackframe; +asm + lock orl SIG_ALTERABLE,%gs:teb.iflag +end; + +procedure sig_cla; assembler; nostackframe; +asm + lock andl NOT_SIG_ALTERABLE,%gs:teb.iflag +end; + +procedure sig_sti; assembler; nostackframe; +asm + lock orl SIG_STI_LOCK,%gs:teb.iflag +end; + +procedure sig_cli; assembler; nostackframe; +asm + lock andl NOT_SIG_STI_LOCK,%gs:teb.iflag +end; + +procedure set_pcb_flags(td:p_kthread;f:Integer); +begin + td^.pcb_flags:=f or (td^.pcb_flags and PCB_IS_JIT); +end; + function TD_IS_SLEEPING(td:p_kthread):Boolean; begin Result:=(td^.td_inhibitors and TDI_SLEEPING)<>0; diff --git a/sys/kern/kern_thread.pas b/sys/kern/kern_thread.pas index bdf4915d..db000469 100644 --- a/sys/kern/kern_thread.pas +++ b/sys/kern/kern_thread.pas @@ -84,11 +84,9 @@ procedure umtx_thread_fini(td:p_kthread); external; function kern_umtx_wake(td:p_kthread;umtx:Pointer;n_wake,priv:Integer):Integer; external; function umtx_copyin_timeout(addr:Pointer;tsp:p_timespec):Integer; external; -function sleepq_alloc:Pointer; external; +function sleepq_alloc:Pointer; external; procedure sleepq_free(sq:Pointer); external; -function rtp_to_pri(rtp:p_rtprio;td:p_kthread):Integer; external; - procedure switch_to_jit(td:p_kthread); external; function msleep(ident :Pointer; diff --git a/sys/kern/kern_umtx.pas b/sys/kern/kern_umtx.pas index 7e9b8f5b..f1cc6957 100644 --- a/sys/kern/kern_umtx.pas +++ b/sys/kern/kern_umtx.pas @@ -94,6 +94,9 @@ uses kern_thread, sched_ule; +var + size_of_umtx_q:Integer=SizeOf(umtx_q); public; + type p_umtxq_hamt=^umtxq_hamt; umtxq_hamt=packed record diff --git a/sys/kern/machdep.pas b/sys/kern/machdep.pas index 5ab7bc9a..d58a86e4 100644 --- a/sys/kern/machdep.pas +++ b/sys/kern/machdep.pas @@ -53,7 +53,6 @@ uses errno, systm, kern_psl, - kern_sig, trap, md_context; diff --git a/sys/kern/subr_dynlib.pas b/sys/kern/subr_dynlib.pas index ad268161..f8b61ce2 100644 --- a/sys/kern/subr_dynlib.pas +++ b/sys/kern/subr_dynlib.pas @@ -361,7 +361,7 @@ uses vmparam, vm_map, vm_mmap, - vm_object, + sys_vm_object, vm_pager, vuio, vstat, diff --git a/sys/kern/subr_sleepqueue.pas b/sys/kern/subr_sleepqueue.pas index 427d0857..56d5aa40 100644 --- a/sys/kern/subr_sleepqueue.pas +++ b/sys/kern/subr_sleepqueue.pas @@ -70,21 +70,15 @@ implementation uses errno, + signal, signalvar, kern_proc, sched_ule; // -procedure ps_mtx_lock; external; -procedure ps_mtx_unlock; external; -Function cursig(td:p_kthread;stop_allowed:Integer):Integer; external; - function mi_switch(flags:Integer):Integer; external; -procedure thread_lock(td:p_kthread); external; -procedure thread_unlock(td:p_kthread); external; - // var diff --git a/sys/kern/systm.pas b/sys/kern/systm.pas index e744e633..a0ff91bf 100644 --- a/sys/kern/systm.pas +++ b/sys/kern/systm.pas @@ -5,9 +5,6 @@ unit systm; interface -uses - kern_param; - function copystr(from,_to:pchar;maxlen:ptruint;lencopied:pptruint):Integer; function copyin(udaddr,kaddr:Pointer;len:ptruint):Integer; function copyin_nofault(udaddr,kaddr:Pointer;len:ptruint):Integer; diff --git a/sys/kern/trap.pas b/sys/kern/trap.pas index 25d00c0c..6abd95d5 100644 --- a/sys/kern/trap.pas +++ b/sys/kern/trap.pas @@ -89,23 +89,12 @@ const 'DTrace pid return trap' // 32 T_DTRACE_RET ); - SIG_ALTERABLE=$80000000; - SIG_STI_LOCK =$40000000; - -procedure set_pcb_flags(td:p_kthread;f:Integer); - procedure _sig_lock; procedure _sig_unlock; procedure sig_lock; procedure sig_unlock; -procedure sig_sta; -procedure sig_cla; - -procedure sig_sti; -procedure sig_cli; - procedure print_backtrace(var f:text;rip,rbp:Pointer;skipframes:sizeint); procedure print_backtrace_td(var f:text); @@ -120,12 +109,6 @@ function IS_TRAP_FUNC(rip:qword):Boolean; function trap(frame:p_trapframe):Integer; function trap_pfault(frame:p_trapframe;usermode:Boolean):Integer; -const - NOT_PCB_FULL_IRET=not PCB_FULL_IRET; - NOT_SIG_ALTERABLE=not SIG_ALTERABLE; - NOT_SIG_STI_LOCK =not SIG_STI_LOCK; - TDF_AST=TDF_ASTPENDING or TDF_NEEDRESCHED; - implementation uses @@ -139,7 +122,6 @@ uses md_context, md_thread, signal, - kern_sig, kern_proc, kern_named_id, subr_dynlib, @@ -222,31 +204,6 @@ asm popq %rbp end; -procedure sig_sta; assembler; nostackframe; -asm - lock orl SIG_ALTERABLE,%gs:teb.iflag -end; - -procedure sig_cla; assembler; nostackframe; -asm - lock andl NOT_SIG_ALTERABLE,%gs:teb.iflag -end; - -procedure sig_sti; assembler; nostackframe; -asm - lock orl SIG_STI_LOCK,%gs:teb.iflag -end; - -procedure sig_cli; assembler; nostackframe; -asm - lock andl NOT_SIG_STI_LOCK,%gs:teb.iflag -end; - -procedure set_pcb_flags(td:p_kthread;f:Integer); -begin - td^.pcb_flags:=f or (td^.pcb_flags and PCB_IS_JIT); -end; - function fuptr(var base:Pointer):Pointer; begin Result:=nil; diff --git a/sys/md/md_context.pas b/sys/md/md_context.pas index 241293ed..b0021925 100644 --- a/sys/md/md_context.pas +++ b/sys/md/md_context.pas @@ -106,23 +106,6 @@ uses // -Function sigonstack(sp:size_t):Integer; -var - td:p_kthread; -begin - Result:=0; - - td:=curkthread; - if (td=nil) then Exit; - - if ((td^.td_pflags and TDP_ALTSTACK)<>0) then - begin - Result:=ord((sp-size_t(td^.td_sigstk.ss_sp))0) then Exit; //header - size:=SizeOf(kthread)+SizeOf(umtx_q); + size:=SizeOf(kthread)+size_of_umtx_q; size:=System.Align(size,4*1024); R:=NtAllocateVirtualMemory( diff --git a/sys/md/md_vnops.pas b/sys/md/md_vnops.pas index 32f716c6..cd8f6b8e 100644 --- a/sys/md/md_vnops.pas +++ b/sys/md/md_vnops.pas @@ -2255,18 +2255,16 @@ begin td:=curkthread; if (td=nil) then Exit(-1); + ioin:=nil; case uio^.uio_rw of UIO_READ :ioin:=@td^.td_ru.ru_inblock; UIO_WRITE:ioin:=@td^.td_ru.ru_oublock; - else - Exit(EINVAL); end; + iocb:=nil; case uio^.uio_rw of UIO_READ :iocb:=@NtReadFile; UIO_WRITE:iocb:=@NtWriteFile; - else - Exit(EINVAL); end; append:=(uio^.uio_rw=UIO_WRITE) and ((ioflag and IO_APPEND)<>0); diff --git a/sys/md/vm_pmap.pas b/sys/md/vm_pmap.pas index 1e96facd..1918099a 100644 --- a/sys/md/vm_pmap.pas +++ b/sys/md/vm_pmap.pas @@ -10,7 +10,7 @@ uses windows, vm, vmparam, - vm_object; + sys_vm_object; {$DEFINE GPU_REMAP} diff --git a/sys/rtprio.pas b/sys/rtprio.pas index 3f7fec0f..088f7a01 100644 --- a/sys/rtprio.pas +++ b/sys/rtprio.pas @@ -5,6 +5,9 @@ unit rtprio; interface +uses + kern_thr; + const PRI_ITHD =1; // Interrupt thread. PRI_REALTIME =2; // Real time process. @@ -46,6 +49,9 @@ type function PRI_BASE(P:Word):Word; function RTP_PRIO_BASE(P:Word):Word; +function rtp_to_pri(rtp:p_rtprio;td:p_kthread):Integer; external; +procedure pri_to_rtp(td:p_kthread;rtp:p_rtprio); external; + implementation function PRI_BASE(P:Word):Word; diff --git a/sys/signal.pas b/sys/signal.pas index bfa08aaa..fdf67b69 100644 --- a/sys/signal.pas +++ b/sys/signal.pas @@ -232,6 +232,26 @@ function _SIG_VALID_32(sig:Integer):Boolean; inline; function _SIG_WORD(sig:Integer):DWORD; inline; function _SIG_BIT(sig:Integer):DWORD; inline; +procedure ps_mtx_lock; external; +procedure ps_mtx_unlock; external; + +function sigdeferstop:Integer; external; +procedure sigallowstop; external; + +Function sigonstack(sp:size_t):Integer; external; +Function cursig(td:Pointer;stop_allowed:Integer):Integer; external; +procedure tdsignal(td:Pointer;sig:Integer); external; +procedure sigexit(td:Pointer;sig:Integer); external; + +procedure ast; external; + +Function kern_sigprocmask(td:Pointer; + how:Integer; + _set:p_sigset_t; + oset:p_sigset_t; + flags:Integer + ):Integer; external; + function _get_sig_str(signum:Integer):RawByteString; implementation diff --git a/sys/sys_event.pas b/sys/sys_event.pas index d47716b5..fe262f37 100644 --- a/sys/sys_event.pas +++ b/sys/sys_event.pas @@ -227,11 +227,55 @@ type end; {$IF sizeof(t_kevent_copyops)<>24}{$STOP sizeof(t_kevent_copyops)<>24}{$ENDIF} +procedure knote(list:p_knlist;hint:QWORD;lockflags:Integer); external; + +procedure knlist_add (knl:p_knlist;kn:p_knote;islocked:Integer); external; +procedure knlist_remove(knl:p_knlist;kn:p_knote;islocked:Integer); external; + +procedure knote_fdclose(fd:Integer); external; + +procedure knlist_init(knl:p_knlist;lock,kl_lock,kl_unlock,kl_assert_locked,kl_assert_unlocked:Pointer); external; +procedure knlist_init_mtx(knl:p_knlist;lock:Pointer); external; + +procedure knlist_destroy (knl:p_knlist); external; +procedure knlist_cleardel(knl:p_knlist;islocked,killkn:Integer); external; + +// + +procedure KNOTE_LOCKED (list:p_knlist;hint:QWORD); +procedure KNOTE_UNLOCKED(list:p_knlist;hint:QWORD); + +procedure knlist_clear(knl:p_knlist;islocked:Integer); + +function M_KNLIST_EMPTY(list:p_knlist):Boolean; + +// + 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 +procedure KNOTE_LOCKED(list:p_knlist;hint:QWORD); +begin + knote(list, hint, KNF_LISTLOCKED); +end; + +procedure KNOTE_UNLOCKED(list:p_knlist;hint:QWORD); +begin + knote(list, hint, 0); +end; + +procedure knlist_clear(knl:p_knlist;islocked:Integer); +begin + knlist_cleardel(knl, islocked, 0) +end; + +function M_KNLIST_EMPTY(list:p_knlist):Boolean; +begin + Result:=SLIST_EMPTY(@list^.kl_list); +end; + procedure EV_SET(kevp:p_kevent;a:PtrUint;b:SmallInt;c:Word;d:DWORD;e:Ptrint;f:Pointer); begin (kevp)^.ident :=(a); diff --git a/sys/_resource.pas b/sys/sys_resource.pas similarity index 99% rename from sys/_resource.pas rename to sys/sys_resource.pas index 86aa11cf..aa0849a0 100644 --- a/sys/_resource.pas +++ b/sys/sys_resource.pas @@ -1,4 +1,4 @@ -unit _resource; +unit sys_resource; {$mode ObjFPC}{$H+} {$CALLING SysV_ABI_CDecl} diff --git a/sys/sys_umtx.pas b/sys/sys_umtx.pas index 272ff92d..e7d7d435 100644 --- a/sys/sys_umtx.pas +++ b/sys/sys_umtx.pas @@ -25,7 +25,6 @@ implementation uses errno, syscalls, - kern_umtx, trap; procedure umtx_init(var umtx:umtx); inline; @@ -86,7 +85,7 @@ end; function _umtx_op_err(obj:Pointer;op:Integer;val:QWORD;uaddr1,uaddr2:Pointer):Integer; assembler; nostackframe; asm - movq sys__umtx_op,%rax + movq $454,%rax call fast_syscall end; diff --git a/sys/test/kern_jit_dynamic.pas b/sys/test/kern_jit_dynamic.pas index a59aad8e..6aebb2fc 100644 --- a/sys/test/kern_jit_dynamic.pas +++ b/sys/test/kern_jit_dynamic.pas @@ -126,8 +126,7 @@ implementation uses sysutils, vmparam, - vm_pmap, - trap; + vm_pmap; // @@ -204,11 +203,11 @@ label var node:t_jit_dynamic.p_entry_point; jctx:p_jctx; - jit_state:Boolean; + //jit_state:Boolean; begin if (td=nil) then Exit; - jit_state:=((td^.pcb_flags and PCB_IS_JIT)<>0); + //jit_state:=((td^.pcb_flags and PCB_IS_JIT)<>0); if not is_guest_addr(td^.td_frame.tf_rip) then begin @@ -506,7 +505,7 @@ var curr:Pointer; next:Pointer; - F:THandle; + //F:THandle; begin if (ctx.builder.GetMemSize=0) then Exit; diff --git a/sys/test/project1.lpi b/sys/test/project1.lpi index db591856..761aa9b4 100644 --- a/sys/test/project1.lpi +++ b/sys/test/project1.lpi @@ -478,10 +478,6 @@ - - - - @@ -763,10 +759,6 @@ - - - - @@ -783,6 +775,18 @@ + + + + + + + + + + + + @@ -792,7 +796,7 @@ - + diff --git a/sys/test/project1.lpr b/sys/test/project1.lpr index 796bc799..858e4468 100644 --- a/sys/test/project1.lpr +++ b/sys/test/project1.lpr @@ -74,7 +74,7 @@ uses ufs, vmount, kern_prot, - _resource, + sys_resource, kern_resource, md_proc, kern_ksched, diff --git a/sys/vfs/kern_conf.pas b/sys/vfs/kern_conf.pas index 13b27665..758f3ef9 100644 --- a/sys/vfs/kern_conf.pas +++ b/sys/vfs/kern_conf.pas @@ -15,7 +15,7 @@ uses vnode, time, vm, - vm_object, + sys_vm_object, kern_mtx; const @@ -344,7 +344,9 @@ begin end; dev_unlock(); if (flag<>0) then + begin devfs_free(dev); + end; end; function dev_refthread(dev:p_cdev;ref:PInteger):p_cdevsw; diff --git a/sys/vfs/kern_descrip.pas b/sys/vfs/kern_descrip.pas index a0e983fa..1e2b21f8 100644 --- a/sys/vfs/kern_descrip.pas +++ b/sys/vfs/kern_descrip.pas @@ -132,15 +132,20 @@ uses errno, systm, vfiledesc, - sys_capability, - vfs_subr, vfs_vnops, vnode_if, - _resource, + sys_resource, kern_resource, kern_mtx, - kern_conf, - kern_event; + kern_conf; + +// + +function cap_funwrap(fp_cap:p_file;rights:cap_rights_t;fpp:pp_file):Integer; external; +function cap_rights(fp_cap:p_file):cap_rights_t; external; +function cap_funwrap_mmap(fp_cap:p_file;rights:cap_rights_t;maxprotp:PByte;fpp:pp_file):Integer; external; + +// function badfo_readwrite(fp:p_file;uio:p_uio;flags:Integer):Integer; begin diff --git a/sys/vfs/subr_uio.pas b/sys/vfs/subr_uio.pas index 136db5d0..0611dc0d 100644 --- a/sys/vfs/subr_uio.pas +++ b/sys/vfs/subr_uio.pas @@ -94,7 +94,6 @@ begin Move(iov^.iov_base^, cp^, cnt); end; UIO_NOCOPY:; - else; end; Inc(iov^.iov_base ,cnt); diff --git a/sys/vfs/sys_capability.pas b/sys/vfs/sys_capability.pas index 487c8dc1..1a673ae1 100644 --- a/sys/vfs/sys_capability.pas +++ b/sys/vfs/sys_capability.pas @@ -112,7 +112,9 @@ end; function cap_check(c:p_capability;rights:cap_rights_t):Integer; begin if ((c^.cap_rights or rights)<>c^.cap_rights) then + begin Exit(ENOTCAPABLE); + end; Exit(0); end; @@ -121,7 +123,7 @@ end; * any other way, as we want to keep all capability permission evaluation in * this one file. } -function cap_rights(fp_cap:p_file):cap_rights_t; +function cap_rights(fp_cap:p_file):cap_rights_t; public; var c:p_capability; begin @@ -131,7 +133,7 @@ begin Exit(c^.cap_rights); end; -function cap_funwrap(fp_cap:p_file;rights:cap_rights_t;fpp:pp_file):Integer; +function cap_funwrap(fp_cap:p_file;rights:cap_rights_t;fpp:pp_file):Integer; public; var c:p_capability; error:Integer; @@ -145,7 +147,9 @@ begin c:=fp_cap^.f_data; error:=cap_check(c, rights); if (error<>0) then + begin Exit(error); + end; fpp^:=c^.cap_object; Exit(0); end; @@ -155,7 +159,7 @@ end; * capability and check CAP_MMAP, but also Exita bitmask representing the * maximum mapping rights the capability allows on the object. } -function cap_funwrap_mmap(fp_cap:p_file;rights:cap_rights_t;maxprotp:PByte;fpp:pp_file):Integer; +function cap_funwrap_mmap(fp_cap:p_file;rights:cap_rights_t;maxprotp:PByte;fpp:pp_file):Integer; public; var c:p_capability; maxprot:Byte; @@ -174,11 +178,17 @@ begin fpp^:=c^.cap_object; maxprot:=0; if (c^.cap_rights and CAP_READ)<>0 then + begin maxprot:=maxprot or VM_PROT_READ; + end; if (c^.cap_rights and CAP_WRITE)<>0 then + begin maxprot:=maxprot or VM_PROT_WRITE; + end; if (c^.cap_rights and CAP_MAPEXEC)<>0 then + begin maxprot:=maxprot or VM_PROT_EXECUTE; + end; maxprotp^:=maxprot; Exit(0); end; @@ -193,7 +203,9 @@ var error:Integer; begin if ((rights or CAP_MASK_VALID)<>CAP_MASK_VALID) then + begin Exit(EINVAL); + end; { * If a new capability is being derived from an existing capability, @@ -204,7 +216,9 @@ begin begin cp_old:=fp^.f_data; if ((cp_old^.cap_rights or rights)<>cp_old^.cap_rights) then + begin Exit(ENOTCAPABLE); + end; end; { @@ -212,7 +226,9 @@ begin } error:=falloc(@fcapp, capfdp, fp^.f_flag); if (error<>0) then + begin Exit(error); + end; { * Rather than nesting capabilities, directly reference the object an @@ -225,6 +241,7 @@ begin fp_object:=p_capability(fp^.f_data)^.cap_object else fp_object:=fp; + fhold(fp_object); cp:=AllocMem(SizeOf(t_capability)); cp^.cap_rights:=rights; diff --git a/sys/vfs/vfs_lookup.pas b/sys/vfs/vfs_lookup.pas index f1f6c36b..d065af31 100644 --- a/sys/vfs/vfs_lookup.pas +++ b/sys/vfs/vfs_lookup.pas @@ -11,7 +11,6 @@ uses systm, vcapability, vuio, - vfile, vfiledesc, vfcntl, vnode, @@ -33,8 +32,14 @@ implementation uses errno, vfs_subr, - vfs_vnops, - dead_vnops; + vfs_vnops; + +// + +var + dead_vnodeops:vop_vector; external; + +// var vp_crossmp:p_vnode; diff --git a/sys/vfs/vfs_mount.pas b/sys/vfs/vfs_mount.pas index f995a02b..2d9f8819 100644 --- a/sys/vfs/vfs_mount.pas +++ b/sys/vfs/vfs_mount.pas @@ -13,7 +13,6 @@ uses vuio, vnamei, kern_mtx, - kern_synch, kern_thr, vnode, vfs_init, @@ -118,6 +117,18 @@ uses vfs_subr, vfs_cache; +// + +function msleep(ident :Pointer; + lock :Pointer; + priority:Integer; + wmesg :PChar; + timo :Int64):Integer; external; + +procedure wakeup(ident:Pointer); external; + +// + { * --------------------------------------------------------------------- * Functions for building and sanitizing the mount options diff --git a/sys/vfs/vfs_subr.pas b/sys/vfs/vfs_subr.pas index d3b83d08..cc737f5a 100644 --- a/sys/vfs/vfs_subr.pas +++ b/sys/vfs/vfs_subr.pas @@ -190,15 +190,13 @@ uses errno, vfs_vnops, subr_uio, - vm_object, + sys_vm_object, vsys_generic, rtprio, kern_conf; // -{$I kern_event.inc} - var dead_vnodeops:vop_vector; external; @@ -348,7 +346,7 @@ begin Exit(nil); end; -function makedev(x,y:Integer):Integer; +function makedev(x,y:Integer):Integer; inline; begin Result:=(x shl 8) or y; end; @@ -710,7 +708,9 @@ begin Inc(td^.td_vp_reserv,count); Exit; end else + begin System.InterlockedExchangeAdd64(numvnodes, -count); + end; mtx_lock(vnode_free_list_mtx); while (count > 0) do @@ -822,7 +822,9 @@ begin begin //bo^.bo_bsize:=mp^.mnt_stat.f_iosize; if ((mp^.mnt_kern_flag and MNTK_NOKNOTE)<>0) then + begin vp^.v_vflag:=vp^.v_vflag or VV_NOKNOTE; + end; end; //rangelock_init(@vp^.v_rl); @@ -1969,7 +1971,9 @@ begin end; if ((vp^.v_iflag and VI_DOOMED)<>0) and ((flags and LK_RETRY)=0) then + begin Assert(false,'vget: vn_lock failed to Exit ENOENT'); + end; VI_LOCK(vp); { Upgrade our holdcnt to a usecount. } @@ -1997,7 +2001,7 @@ end; { * Increase the reference count of a vnode. } -procedure vref(vp:p_vnode); +procedure vref(vp:p_vnode); public; begin VI_LOCK(vp); v_incr_usecount(vp); @@ -2720,7 +2724,9 @@ var vi:p_vpollinfo; begin if (vp^.v_pollinfo<>nil) then + begin Exit; + end; vi:=AllocMem(SizeOf(vpollinfo)); mtx_init(vi^.vpi_lock,'vnode pollinfo'); knlist_init(@vi^.vpi_selinfo.si_note, vp, @vfs_knllock, @vfs_knlunlock, @vfs_knl_assert_locked, @vfs_knl_assert_unlocked); @@ -2961,14 +2967,17 @@ begin error:=ENXIO else if (p_cdev(vp^.v_rdev)^.si_devsw=nil) then + begin error:=ENXIO - else{ + end{ else if ((p_cdev(vp^.v_rdev)^.si_devsw^.d_flags and D_DISK)=0) then error:=ENOTBLK}; dev_unlock(); error:=ENOTBLK; if (errp<>nil) then + begin errp^:=error; + end; Exit(error=0); end; @@ -3172,7 +3181,7 @@ begin vfs_badlock('is not exclusive locked but should be', str, vp); end; -function VOP_WRITE_PRE(ap:p_vop_write_args;var osize,ooffset:Int64):Integer; +function VOP_WRITE_PRE(ap:p_vop_write_args;var osize,ooffset:Int64):Integer; public; var va:t_vattr; error:Integer; @@ -3189,7 +3198,7 @@ begin end; end; -procedure VOP_WRITE_POST(ap:p_vop_write_args;ret:Integer;var osize,ooffset:Int64); +procedure VOP_WRITE_POST(ap:p_vop_write_args;ret:Integer;var osize,ooffset:Int64); public; var noffset:Int64; begin @@ -3220,7 +3229,7 @@ begin vrele(ap^.a_fvp); end; -procedure vop_rename_pre(ap:p_vop_rename_args); +procedure vop_rename_pre(ap:p_vop_rename_args); public; begin if (ap^.a_tdvp<>ap^.a_fdvp) then vhold(ap^.a_fdvp); @@ -3234,7 +3243,7 @@ begin vhold(ap^.a_tvp); end; -procedure vop_create_post(ap:p_vop_create_args;rc:Integer); +procedure vop_create_post(ap:p_vop_create_args;rc:Integer); public; begin if (rc=0) then begin @@ -3242,16 +3251,16 @@ begin end; end; -procedure vop_link_post(ap:p_vop_link_args;rc:Integer); +procedure vop_link_post(ap:p_vop_link_args;rc:Integer); public; begin if (rc=0) then begin - VFS_KNOTE_LOCKED(ap^.a_vp, NOTE_LINK); + VFS_KNOTE_LOCKED(ap^.a_vp , NOTE_LINK); VFS_KNOTE_LOCKED(ap^.a_tdvp, NOTE_WRITE); end; end; -procedure vop_mkdir_post(ap:p_vop_mkdir_args;rc:Integer); +procedure vop_mkdir_post(ap:p_vop_mkdir_args;rc:Integer); public; begin if (rc=0) then begin @@ -3259,7 +3268,7 @@ begin end; end; -procedure vop_mknod_post(ap:p_vop_mknod_args;rc:Integer); +procedure vop_mknod_post(ap:p_vop_mknod_args;rc:Integer); public; begin if (rc=0) then begin @@ -3267,22 +3276,22 @@ begin end; end; -procedure vop_remove_post(ap:p_vop_remove_args;rc:Integer); +procedure vop_remove_post(ap:p_vop_remove_args;rc:Integer); public; begin if (rc=0) then begin VFS_KNOTE_LOCKED(ap^.a_dvp, NOTE_WRITE); - VFS_KNOTE_LOCKED(ap^.a_vp, NOTE_DELETE); + VFS_KNOTE_LOCKED(ap^.a_vp , NOTE_DELETE); end; end; -procedure vop_rename_post(ap:p_vop_rename_args;rc:Integer); +procedure vop_rename_post(ap:p_vop_rename_args;rc:Integer); public; begin if (rc=0) then begin VFS_KNOTE_UNLOCKED(ap^.a_fdvp, NOTE_WRITE); VFS_KNOTE_UNLOCKED(ap^.a_tdvp, NOTE_WRITE); - VFS_KNOTE_UNLOCKED(ap^.a_fvp, NOTE_RENAME); + VFS_KNOTE_UNLOCKED(ap^.a_fvp , NOTE_RENAME); if (ap^.a_tvp<>nil) then begin VFS_KNOTE_UNLOCKED(ap^.a_tvp, NOTE_DELETE); @@ -3303,16 +3312,16 @@ begin end; end; -procedure vop_rmdir_post(ap:p_vop_rmdir_args;rc:Integer); +procedure vop_rmdir_post(ap:p_vop_rmdir_args;rc:Integer); public; begin if (rc=0) then begin VFS_KNOTE_LOCKED(ap^.a_dvp, NOTE_WRITE or NOTE_LINK); - VFS_KNOTE_LOCKED(ap^.a_vp, NOTE_DELETE); + VFS_KNOTE_LOCKED(ap^.a_vp , NOTE_DELETE); end; end; -procedure vop_setattr_post(ap:p_vop_setattr_args;rc:Integer); +procedure vop_setattr_post(ap:p_vop_setattr_args;rc:Integer); public; begin if (rc=0) then begin @@ -3320,7 +3329,7 @@ begin end; end; -procedure vop_symlink_post(ap:p_vop_symlink_args;rc:Integer); +procedure vop_symlink_post(ap:p_vop_symlink_args;rc:Integer); public; begin if (rc=0) then begin @@ -3460,12 +3469,9 @@ begin kn:=ap^.a_kn; case (kn^.kn_filter) of - EVFILT_READ: - kn^.kn_fop:=@vfsread_filtops; - EVFILT_WRITE: - kn^.kn_fop:=@vfswrite_filtops; - EVFILT_VNODE: - kn^.kn_fop:=@vfsvnode_filtops; + EVFILT_READ :kn^.kn_fop:=@vfsread_filtops; + EVFILT_WRITE:kn^.kn_fop:=@vfswrite_filtops; + EVFILT_VNODE:kn^.kn_fop:=@vfsvnode_filtops; else Exit(EINVAL); end; @@ -3473,8 +3479,11 @@ begin kn^.kn_hook:=vp; v_addpollinfo(vp); + if (vp^.v_pollinfo=nil) then + begin Exit(ENOMEM); + end; knl:=@vp^.v_pollinfo^.vpi_selinfo.si_note; vhold(vp); @@ -3663,7 +3672,9 @@ begin * on the containing directory instead. } if ((accmode^ and (VDELETE_CHILD or VDELETE))<>0) then + begin Exit(EPERM); + end; if ((accmode^ and VADMIN_PERMS)<>0) then begin @@ -3862,8 +3873,7 @@ end; procedure __mnt_vnode_markerfree_active(mvp:pp_vnode;mp:p_mount); begin - if (mvp^=nil) then - Exit; + if (mvp^=nil) then Exit; mtx_lock(vnode_free_list_mtx); TAILQ_REMOVE(@mp^.mnt_activevnodelist,mvp^,@mvp^^.v_actfreelist); diff --git a/sys/vfs/vfs_syscalls.pas b/sys/vfs/vfs_syscalls.pas index 1d18acc9..539adcf6 100644 --- a/sys/vfs/vfs_syscalls.pas +++ b/sys/vfs/vfs_syscalls.pas @@ -143,11 +143,11 @@ uses errno, kern_mtx, kern_thr, - kern_synch, kern_descrip, vnode_if, sys_capability, vmparam, + sys_vm_object, vm_object; { diff --git a/sys/vfs/vfs_vnops.pas b/sys/vfs/vfs_vnops.pas index c34b1946..2168e798 100644 --- a/sys/vfs/vfs_vnops.pas +++ b/sys/vfs/vfs_vnops.pas @@ -67,6 +67,12 @@ procedure foffset_unlock(fp:p_file;val:Int64;flags:Integer); procedure foffset_lock_uio(fp:p_file;uio:p_uio;flags:Integer); procedure foffset_unlock_uio(fp:p_file;uio:p_uio;flags:Integer); +// + +procedure vref(vp:p_vnode); external; + +// + implementation uses diff --git a/sys/vfs/vmount.pas b/sys/vfs/vmount.pas index df94b421..4795d06d 100644 --- a/sys/vfs/vmount.pas +++ b/sys/vfs/vmount.pas @@ -11,8 +11,8 @@ uses time, sys_event, kern_mtx, - kern_synch, - kern_sig, + //kern_synch, + signal, vnode; const @@ -418,6 +418,12 @@ procedure vmountinit; //SYSINIT implementation +// + +procedure wakeup(ident:Pointer); external; + +// + function MNT_SHARED_WRITES(mp:p_mount):Boolean; inline; begin if (mp<>nil) then @@ -473,7 +479,7 @@ begin end; end; -function VFS_LOCK_GIANT(mp:p_mount):Integer; +function VFS_LOCK_GIANT(mp:p_mount):Integer; public; begin if VFS_NEEDSGIANT(mp) then begin diff --git a/sys/vfs/vnode.pas b/sys/vfs/vnode.pas index 001b4745..1f623f53 100644 --- a/sys/vfs/vnode.pas +++ b/sys/vfs/vnode.pas @@ -321,8 +321,6 @@ uses // -{$I kern_event.inc} - function VFS_PROLOGUE(mp:Pointer):Boolean; external; procedure VFS_EPILOGUE(_enable_stops:Boolean); external; diff --git a/sys/vfs/vnode_if.pas b/sys/vfs/vnode_if.pas index 9bc2b878..759a0d8c 100644 --- a/sys/vfs/vnode_if.pas +++ b/sys/vfs/vnode_if.pas @@ -949,9 +949,6 @@ const implementation -uses - vfs_subr; - function get_vp_cb(vp:p_vnode;offset:Pointer):Pointer; inline; var v:p_vop_vector; @@ -1008,6 +1005,8 @@ begin VFS_EPILOGUE(s); end; +procedure vop_create_post(ap:p_vop_create_args;rc:Integer); external; + function VOP_CREATE(dvp:p_vnode;vpp:pp_vnode;cnp:p_componentname;vap:p_vattr):Integer; var c:Pointer; @@ -1044,6 +1043,8 @@ begin VFS_EPILOGUE(s); end; +procedure vop_mknod_post(ap:p_vop_mknod_args;rc:Integer); external; + function VOP_MKNOD(dvp:p_vnode;vpp:pp_vnode;cnp:p_componentname;vap:p_vattr):Integer; var c:Pointer; @@ -1144,6 +1145,8 @@ begin VFS_EPILOGUE(s); end; +procedure vop_setattr_post(ap:p_vop_setattr_args;rc:Integer); external; + function VOP_SETATTR(vp:p_vnode;vap:p_vattr):Integer; var c:Pointer; @@ -1193,6 +1196,9 @@ begin VFS_EPILOGUE(s); end; +function VOP_WRITE_PRE(ap:p_vop_write_args;var osize,ooffset:Int64):Integer; external; +procedure VOP_WRITE_POST(ap:p_vop_write_args;ret:Integer;var osize,ooffset:Int64); external; + function VOP_WRITE(vp:p_vnode;uio:p_uio;ioflag:Integer):Integer; var osize,ooffset:Int64; @@ -1297,6 +1303,8 @@ begin VFS_EPILOGUE(s); end; +procedure vop_remove_post(ap:p_vop_remove_args;rc:Integer); external; + function VOP_REMOVE(dvp:p_vnode;vp:p_vnode;cnp:p_componentname):Integer; var c:Pointer; @@ -1315,6 +1323,8 @@ begin vop_remove_post(@a,Result); end; +procedure vop_link_post(ap:p_vop_link_args;rc:Integer); external; + function VOP_LINK(tdvp:p_vnode;vp:p_vnode;cnp:p_componentname):Integer; var c:Pointer; @@ -1333,6 +1343,9 @@ begin vop_link_post(@a,Result); end; +procedure vop_rename_pre (ap:p_vop_rename_args); external; +procedure vop_rename_post(ap:p_vop_rename_args;rc:Integer); external; + function VOP_RENAME(fdvp:p_vnode;fvp:p_vnode;fcnp:p_componentname;tdvp:p_vnode;tvp:p_vnode;tcnp:p_componentname):Integer; var c:Pointer; @@ -1355,6 +1368,8 @@ begin vop_rename_post(@a,Result); end; +procedure vop_mkdir_post(ap:p_vop_mkdir_args;rc:Integer); external; + function VOP_MKDIR(dvp:p_vnode;vpp:pp_vnode;cnp:p_componentname;vap:p_vattr):Integer; var c:Pointer; @@ -1374,6 +1389,8 @@ begin vop_mkdir_post(@a,Result); end; +procedure vop_rmdir_post(ap:p_vop_rmdir_args;rc:Integer); external; + function VOP_RMDIR(dvp:p_vnode;vp:p_vnode;cnp:p_componentname):Integer; var c:Pointer; @@ -1392,6 +1409,8 @@ begin vop_rmdir_post(@a,Result); end; +procedure vop_symlink_post(ap:p_vop_symlink_args;rc:Integer); external; + function VOP_SYMLINK(dvp:p_vnode;vpp:pp_vnode;cnp:p_componentname;vap:p_vattr;target:PChar):Integer; var c:Pointer; diff --git a/sys/vfs/vselect.pas b/sys/vfs/vselect.pas index 84d1623d..beb95064 100644 --- a/sys/vfs/vselect.pas +++ b/sys/vfs/vselect.pas @@ -5,10 +5,6 @@ unit vselect; interface -uses - signal, - time; - type pp_fd_mask=^p_fd_mask; p_fd_mask=^fd_mask; diff --git a/sys/vfs/vsocketvar.pas b/sys/vfs/vsocketvar.pas index 1fb34b79..2c0f653d 100644 --- a/sys/vfs/vsocketvar.pas +++ b/sys/vfs/vsocketvar.pas @@ -8,8 +8,6 @@ interface uses mqueue, vfile, - vselinfo, - vsocket, vsockstate, vsockbuf, kern_mtx; diff --git a/sys/vfs/vsys_generic.pas b/sys/vfs/vsys_generic.pas index 0d227974..5fe31ade 100644 --- a/sys/vfs/vsys_generic.pas +++ b/sys/vfs/vsys_generic.pas @@ -112,7 +112,6 @@ uses errno, kern_descrip, subr_uio, - kern_sig, kern_thread, kern_proc, md_time, diff --git a/sys/vm/device_pager.pas b/sys/vm/device_pager.pas index 15b7a8fd..269bb9bd 100644 --- a/sys/vm/device_pager.pas +++ b/sys/vm/device_pager.pas @@ -7,7 +7,7 @@ interface uses vm, - vm_object; + sys_vm_object; function dev_pager_alloc( handle:Pointer; diff --git a/sys/vm/dmem_map.pas b/sys/vm/dmem_map.pas index 891cf63c..d0145613 100644 --- a/sys/vm/dmem_map.pas +++ b/sys/vm/dmem_map.pas @@ -7,7 +7,7 @@ interface uses vmparam, - vm_object, + sys_vm_object, kern_mtx; Const diff --git a/sys/vm/sys_vm_object.pas b/sys/vm/sys_vm_object.pas new file mode 100644 index 00000000..1b0437fc --- /dev/null +++ b/sys/vm/sys_vm_object.pas @@ -0,0 +1,210 @@ +unit sys_vm_object; + +{$mode ObjFPC}{$H+} +{$CALLING SysV_ABI_CDecl} + +interface + +uses + mqueue, + vm, + kern_mtx; + +type + obj_type=( + OBJT_DEFAULT ,//0 + OBJT_SWAP ,//1 + OBJT_VNODE ,//2 + OBJT_DEVICE ,//3 + OBJT_PHYS ,//4 + OBJT_DEAD ,//5 + OBJT_SG ,//6 + OBJT_JITSHM ,//7 + OBJT_SELF ,//8 + OBJT_TRCMEM ,//9 + OBJT_PHYSHM ,//10 + OBJT_BLOCKPOOL //11 + ); + + objtype_t=obj_type; + + p_vm_object_t=^vm_object_t; + vm_object_t=^t_vm_object; + t_vm_object=packed record + mtx :mtx; + memq :TAILQ_HEAD; // list of resident pages + patchq :TAILQ_HEAD; // list of patches + root :Pointer; // root of the resident page splay tree + size :vm_pindex_t; // Object size + generation :Integer; // generation ID + ref_count :Integer; // How many refs?? + otype :objtype_t; // type of pager + pg_color :Word; + flags :Word; // see below + handle :Pointer; + paging_in_progress:Integer; + un_pager:packed record + vnp:packed record + vnp_size:QWORD; + writemappings:vm_ooffset_t; + end; + end; + end; + +const + //Flags + OBJ_ACTIVE =$0004; // active objects + OBJ_DEAD =$0008; // dead objects (during rundown) + OBJ_NOSPLIT =$0010; // dont split this object + OBJ_PIPWNT =$0040; // paging in progress wanted + OBJ_MIGHTBEDIRTY =$0100; // object might be dirty, only for vnode + OBJ_COLORED =$1000; // pg_color is defined + OBJ_ONEMAPPING =$2000; // One USE (a single, non-forked) mapping flag + OBJ_DISCONNECTWNT=$4000; // disconnect from vnode wanted + OBJ_DMEM_EXT =$8000; + + OBJPC_SYNC =$1; // sync I/O + OBJPC_INVAL =$2; // invalidate + OBJPC_NOSYNC=$4; // skip if PG_NOSYNC + + //The following options are supported by vm_object_page_remove(). + OBJPR_CLEANONLY=$1; // Don't remove dirty pages. + OBJPR_NOTMAPPED=$2; // Don't unmap pages. + OBJPR_NOTWIRED =$4; // Don't remove wired pages. + +function VM_OBJECT_MTX(obj:vm_object_t):p_mtx; +procedure VM_OBJECT_LOCK(obj:vm_object_t); +function VM_OBJECT_TRYLOCK(obj:vm_object_t):Boolean; +procedure VM_OBJECT_UNLOCK(obj:vm_object_t); +function VM_OBJECT_LOCKED(obj:vm_object_t):Boolean; +procedure VM_OBJECT_LOCK_ASSERT(obj:vm_object_t); + +procedure vm_object_set_flag(obj:vm_object_t;bits:Word); +procedure vm_object_clear_flag(obj:vm_object_t;bits:Word); + +function vm_object_allocate(t:objtype_t;size:vm_pindex_t):vm_object_t; +procedure vm_object_destroy(obj:vm_object_t); +procedure vm_object_reference(obj:vm_object_t); + +procedure vm_object_pip_add(obj:vm_object_t;i:word); +procedure vm_object_pip_subtract(obj:vm_object_t;i:word); + +procedure vm_object_patch_remove(_obj:Pointer;start,__end:DWORD); external; + +procedure vm_object_deallocate(obj:vm_object_t); external; + +procedure vm_object_collapse(obj:vm_object_t); external; + +function vm_object_coalesce(prev_object:vm_object_t; + prev_offset:vm_ooffset_t; + prev_size :vm_ooffset_t; + next_size :vm_ooffset_t; + reserved :Boolean):Boolean; external; + +procedure vm_object_page_remove(obj:vm_object_t; + start:vm_pindex_t; + __end:vm_pindex_t; + options:Integer); external; + +function vm_object_page_clean(obj:vm_object_t; + start,__end:vm_ooffset_t; + flags:Integer):Boolean; external; + +implementation + +function VM_OBJECT_MTX(obj:vm_object_t):p_mtx; +begin + Result:=@obj^.mtx; +end; + +procedure VM_OBJECT_LOCK(obj:vm_object_t); +begin + mtx_lock(obj^.mtx); +end; + +function VM_OBJECT_TRYLOCK(obj:vm_object_t):Boolean; +begin + Result:=mtx_trylock(obj^.mtx); +end; + +procedure VM_OBJECT_UNLOCK(obj:vm_object_t); +begin + mtx_unlock(obj^.mtx); +end; + +function VM_OBJECT_LOCKED(obj:vm_object_t):Boolean; +begin + Result:=(mtx_owned(obj^.mtx)); +end; + +procedure VM_OBJECT_LOCK_ASSERT(obj:vm_object_t); +begin + Assert(mtx_owned(obj^.mtx)); +end; + +procedure vm_object_set_flag(obj:vm_object_t;bits:Word); +begin + VM_OBJECT_LOCK_ASSERT(obj); + obj^.flags:=obj^.flags or bits; +end; + +procedure vm_object_clear_flag(obj:vm_object_t;bits:Word); +begin + VM_OBJECT_LOCK_ASSERT(obj); + obj^.flags:=obj^.flags and (not bits); +end; + +function vm_object_allocate(t:objtype_t;size:vm_pindex_t):vm_object_t; +begin + Result:=AllocMem(SizeOf(t_vm_object)); + + mtx_init(Result^.mtx,'vm_object'); + + TAILQ_INIT(@Result^.memq); + TAILQ_INIT(@Result^.patchq); + + Result^.otype :=t; + Result^.size :=size; + Result^.generation:=1; + Result^.ref_count :=1; + + if (t=OBJT_DEFAULT) then + begin + Result^.flags:=OBJ_ONEMAPPING; + end; +end; + +procedure vm_object_destroy(obj:vm_object_t); +begin + mtx_destroy(obj^.mtx); + FreeMem(obj); +end; + +procedure vm_object_reference(obj:vm_object_t); +begin + if (obj=nil) then Exit; + + System.InterlockedIncrement(obj^.ref_count); +end; + +procedure vm_object_pip_add(obj:vm_object_t;i:word); +begin + if (obj=nil) then Exit; + + VM_OBJECT_LOCK_ASSERT(obj); + obj^.paging_in_progress:=obj^.paging_in_progress+i; +end; + +procedure vm_object_pip_subtract(obj:vm_object_t;i:word); +begin + if (obj=nil) then Exit; + + VM_OBJECT_LOCK_ASSERT(obj); + obj^.paging_in_progress:=obj^.paging_in_progress-i; +end; + +end. + + + + diff --git a/sys/vm/vm_fault.pas b/sys/vm/vm_fault.pas index d727af81..43a93f92 100644 --- a/sys/vm/vm_fault.pas +++ b/sys/vm/vm_fault.pas @@ -11,7 +11,7 @@ uses vmparam, vm_map, vm_pmap, - vm_object; + sys_vm_object; function vm_fault(map :vm_map_t; mem_addr :vm_offset_t; @@ -43,16 +43,6 @@ begin end; end; -type - p_jmp32_trampoline=^t_jmp32_trampoline; - t_jmp32_trampoline=packed record - inst:Byte; //E9 - addr:Integer; - end; - -const - c_jmpl32_trampoline:t_jmp32_trampoline=(inst:$E9;addr:0); - function AlignUp(addr:PtrUInt;alignment:PtrUInt):PtrUInt; inline; var tmp:PtrUInt; diff --git a/sys/vm/vm_map.pas b/sys/vm/vm_map.pas index 117af17c..670da2ab 100644 --- a/sys/vm/vm_map.pas +++ b/sys/vm/vm_map.pas @@ -9,10 +9,11 @@ uses vm, vmparam, vm_pmap, + sys_vm_object, vm_object, kern_mtx, kern_thr, - _resource, + sys_resource, kern_resource; type @@ -918,7 +919,9 @@ begin inheritance:=VM_INHERIT_DEFAULT; if ((cow and (MAP_ACC_NO_CHARGE or MAP_NOFAULT))<>0) then + begin goto charged; + end; if ((cow and MAP_ACC_CHARGED)<>0) or (((prot and VM_PROT_WRITE)<>0) and (((protoeflags and MAP_ENTRY_NEEDS_COPY)<>0) or (vm_obj=nil))) then @@ -926,7 +929,9 @@ begin Assert((vm_obj=nil) or ((protoeflags and MAP_ENTRY_NEEDS_COPY)<>0),'OVERCOMMIT: vm_map_insert o %p", object'); if (vm_obj=nil) and ((protoeflags and MAP_ENTRY_NEEDS_COPY)=0) then + begin charge_prev_obj:=TRUE; + end; end; charged: diff --git a/sys/vm/vm_mmap.pas b/sys/vm/vm_mmap.pas index 71f037d7..19281368 100644 --- a/sys/vm/vm_mmap.pas +++ b/sys/vm/vm_mmap.pas @@ -8,7 +8,7 @@ interface uses vm, vm_map, - vm_object; + sys_vm_object; type p_query_memory_prot=^t_query_memory_prot; @@ -54,7 +54,7 @@ uses kern_thr, kern_proc, vmparam, - _resource, + sys_resource, kern_resource, kern_mtx, kern_descrip, diff --git a/sys/vm/vm_object.pas b/sys/vm/vm_object.pas index 18699a8c..090db639 100644 --- a/sys/vm/vm_object.pas +++ b/sys/vm/vm_object.pas @@ -6,83 +6,12 @@ unit vm_object; interface uses - mqueue, vm, - kern_param, - kern_mtx, - kern_synch; + sys_vm_object, + kern_param; -type - obj_type=( - OBJT_DEFAULT ,//0 - OBJT_SWAP ,//1 - OBJT_VNODE ,//2 - OBJT_DEVICE ,//3 - OBJT_PHYS ,//4 - OBJT_DEAD ,//5 - OBJT_SG ,//6 - OBJT_JITSHM ,//7 - OBJT_SELF ,//8 - OBJT_TRCMEM ,//9 - OBJT_PHYSHM ,//10 - OBJT_BLOCKPOOL //11 - ); - - objtype_t=obj_type; - - p_vm_object_t=^vm_object_t; - vm_object_t=^_vm_object; - _vm_object=packed record - mtx :mtx; - memq :TAILQ_HEAD; // list of resident pages - patchq :TAILQ_HEAD; // list of patches - root :Pointer; // root of the resident page splay tree - size :vm_pindex_t; // Object size - generation :Integer; // generation ID - ref_count :Integer; // How many refs?? - otype :objtype_t; // type of pager - pg_color :Word; - flags :Word; // see below - handle :Pointer; - paging_in_progress:Integer; - un_pager:packed record - vnp:packed record - vnp_size:QWORD; - writemappings:vm_ooffset_t; - end; - end; - end; - -const - //Flags - OBJ_ACTIVE =$0004; // active objects - OBJ_DEAD =$0008; // dead objects (during rundown) - OBJ_NOSPLIT =$0010; // dont split this object - OBJ_PIPWNT =$0040; // paging in progress wanted - OBJ_MIGHTBEDIRTY =$0100; // object might be dirty, only for vnode - OBJ_COLORED =$1000; // pg_color is defined - OBJ_ONEMAPPING =$2000; // One USE (a single, non-forked) mapping flag - OBJ_DISCONNECTWNT=$4000; // disconnect from vnode wanted - OBJ_DMEM_EXT =$8000; - - OBJPC_SYNC =$1; // sync I/O - OBJPC_INVAL =$2; // invalidate - OBJPC_NOSYNC=$4; // skip if PG_NOSYNC - - //The following options are supported by vm_object_page_remove(). - OBJPR_CLEANONLY=$1; // Don't remove dirty pages. - OBJPR_NOTMAPPED=$2; // Don't unmap pages. - OBJPR_NOTWIRED =$4; // Don't remove wired pages. - -procedure vm_object_reference (obj:vm_object_t); -function vm_object_allocate (t:objtype_t;size:vm_pindex_t):vm_object_t; procedure vm_object_deallocate (obj:vm_object_t); -procedure vm_object_set_flag (obj:vm_object_t;bits:Word); -procedure vm_object_clear_flag (obj:vm_object_t;bits:Word); - -procedure vm_object_pip_add (obj:vm_object_t;i:word); -procedure vm_object_pip_subtract(obj:vm_object_t;i:word); procedure vm_object_pip_wakeup (obj:vm_object_t); procedure vm_object_pip_wakeupn (obj:vm_object_t;i:word); procedure vm_object_pip_wait (obj:vm_object_t;waitid:pchar); @@ -98,16 +27,6 @@ procedure vm_object_page_remove(obj:vm_object_t; procedure vm_object_collapse (obj:vm_object_t); -function VM_OBJECT_MTX (obj:vm_object_t):p_mtx; -procedure VM_OBJECT_LOCK (obj:vm_object_t); -function VM_OBJECT_TRYLOCK (obj:vm_object_t):Boolean; -procedure VM_OBJECT_UNLOCK (obj:vm_object_t); -function VM_OBJECT_LOCKED (obj:vm_object_t):Boolean; -procedure VM_OBJECT_LOCK_ASSERT(obj:vm_object_t); - -function IDX_TO_OFF(x:DWORD):QWORD; inline; -function OFF_TO_IDX(x:QWORD):DWORD; inline; - function vm_object_coalesce(prev_object:vm_object_t; prev_offset:vm_ooffset_t; prev_size :vm_ooffset_t; @@ -123,10 +42,16 @@ uses // -procedure vm_object_patch_remove(_obj:Pointer;start,__end:DWORD); external; - procedure vm_pager_deallocate(obj:vm_object_t); external; +function msleep(ident :Pointer; + lock :Pointer; + priority:Integer; + wmesg :PChar; + timo :Int64):Integer; external; + +procedure wakeup(ident:Pointer); external; + // function IDX_TO_OFF(x:DWORD):QWORD; inline; @@ -139,81 +64,6 @@ begin Result:=QWORD(x) shr PAGE_SHIFT; end; -function VM_OBJECT_MTX(obj:vm_object_t):p_mtx; -begin - Result:=@obj^.mtx; -end; - -procedure VM_OBJECT_LOCK(obj:vm_object_t); -begin - mtx_lock(obj^.mtx); -end; - -function VM_OBJECT_TRYLOCK(obj:vm_object_t):Boolean; -begin - Result:=mtx_trylock(obj^.mtx); -end; - -procedure VM_OBJECT_UNLOCK(obj:vm_object_t); -begin - mtx_unlock(obj^.mtx); -end; - -function VM_OBJECT_LOCKED(obj:vm_object_t):Boolean; -begin - Result:=(mtx_owned(obj^.mtx)); -end; - -procedure VM_OBJECT_LOCK_ASSERT(obj:vm_object_t); -begin - Assert(mtx_owned(obj^.mtx)); -end; - -procedure vm_object_set_flag(obj:vm_object_t;bits:Word); -begin - VM_OBJECT_LOCK_ASSERT(obj); - obj^.flags:=obj^.flags or bits; -end; - -procedure vm_object_clear_flag(obj:vm_object_t;bits:Word); -begin - VM_OBJECT_LOCK_ASSERT(obj); - obj^.flags:=obj^.flags and (not bits); -end; - -function vm_object_allocate(t:objtype_t;size:vm_pindex_t):vm_object_t; -begin - Result:=AllocMem(SizeOf(_vm_object)); - - mtx_init(Result^.mtx,'vm_object'); - - TAILQ_INIT(@Result^.memq); - TAILQ_INIT(@Result^.patchq); - - Result^.otype :=t; - Result^.size :=size; - Result^.generation:=1; - Result^.ref_count :=1; - - if (t=OBJT_DEFAULT) then - begin - Result^.flags:=OBJ_ONEMAPPING; - end; -end; - -procedure vm_object_destroy(obj:vm_object_t); -begin - mtx_destroy(obj^.mtx); - FreeMem(obj); -end; - -procedure vm_object_reference(obj:vm_object_t); -begin - if (obj=nil) then Exit; - - System.InterlockedIncrement(obj^.ref_count); -end; - { vm_object_terminate actually destroys the specified object, freeing up all previously used resources. @@ -268,7 +118,7 @@ begin vm_object_destroy(obj); end; -procedure vm_object_deallocate(obj:vm_object_t); +procedure vm_object_deallocate(obj:vm_object_t); public; var ref:Integer; begin @@ -290,22 +140,6 @@ begin end; end; -procedure vm_object_pip_add(obj:vm_object_t;i:word); -begin - if (obj=nil) then Exit; - - VM_OBJECT_LOCK_ASSERT(obj); - obj^.paging_in_progress:=obj^.paging_in_progress+i; -end; - -procedure vm_object_pip_subtract(obj:vm_object_t;i:word); -begin - if (obj=nil) then Exit; - - VM_OBJECT_LOCK_ASSERT(obj); - obj^.paging_in_progress:=obj^.paging_in_progress-i; -end; - procedure vm_object_pip_wakeup(obj:vm_object_t); begin if (obj=nil) then Exit; @@ -365,7 +199,7 @@ end; function vm_object_page_clean(obj:vm_object_t; start,__end:vm_ooffset_t; - flags:Integer):Boolean; + flags:Integer):Boolean; public; begin Result:=True; end; @@ -400,7 +234,7 @@ end; procedure vm_object_page_remove(obj:vm_object_t; start:vm_pindex_t; __end:vm_pindex_t; - options:Integer); + options:Integer); public; begin vm_object_patch_remove(obj,start,__end); end; @@ -413,7 +247,7 @@ end; parent, and the backing object is deallocated. } -procedure vm_object_collapse(obj:vm_object_t); +procedure vm_object_collapse(obj:vm_object_t); public; begin // end; @@ -444,7 +278,7 @@ function vm_object_coalesce(prev_object:vm_object_t; prev_offset:vm_ooffset_t; prev_size :vm_ooffset_t; next_size :vm_ooffset_t; - reserved :Boolean):Boolean; + reserved :Boolean):Boolean; public; var next_pindex:vm_pindex_t; begin diff --git a/sys/vm/vm_pager.pas b/sys/vm/vm_pager.pas index 1c2e5fcf..1f715988 100644 --- a/sys/vm/vm_pager.pas +++ b/sys/vm/vm_pager.pas @@ -7,7 +7,7 @@ interface uses vm, - vm_object; + sys_vm_object; function vm_pager_allocate(otype:objtype_t; handle:Pointer; @@ -75,7 +75,6 @@ begin OBJT_TRCMEM :; OBJT_PHYSHM :; OBJT_BLOCKPOOL:; - else; end; end; diff --git a/sys/vm/vm_patch_link.pas b/sys/vm/vm_patch_link.pas index d0ce9046..dcf3bc87 100644 --- a/sys/vm/vm_patch_link.pas +++ b/sys/vm/vm_patch_link.pas @@ -42,7 +42,7 @@ uses hamt, kern_rwlock, vmparam, - vm_object; + sys_vm_object; type p_patch_page=^t_patch_page;