From 6ded8ed42122004bb13131a0093439103eb4dfcd Mon Sep 17 00:00:00 2001 From: Pavel <68122101+red-prig@users.noreply.github.com> Date: Mon, 25 Mar 2024 11:01:47 +0300 Subject: [PATCH] + --- chip/pm4defs.pas | 6 +++ sys/dev/dev_dmem.pas | 2 +- sys/dev/dev_gc.pas | 12 +++++- sys/dev/display_soft.pas | 2 +- sys/kern/kern_dmem.pas | 88 ++++++++++++++++++++++++++++++++++++++++ sys/vm/vm_mmap.pas | 58 -------------------------- 6 files changed, 106 insertions(+), 62 deletions(-) diff --git a/chip/pm4defs.pas b/chip/pm4defs.pas index 337415cc..8b926d3c 100644 --- a/chip/pm4defs.pas +++ b/chip/pm4defs.pas @@ -639,6 +639,7 @@ function PM4_HEADER_BUILD(lenDw:WORD;op,priv:Byte):DWORD; inline; function PM4_PRIV(token:DWORD):Byte; inline; function PM4_TYPE(token:DWORD):Byte; inline; function PM4_LENGTH_DW(token:DWORD):WORD; inline; +function PM4_LENGTH(token:DWORD):DWORD; inline; implementation @@ -664,5 +665,10 @@ begin Result:=((token shr 16) and $3FFF) + 2; end; +function PM4_LENGTH(token:DWORD):DWORD; inline; +begin + Result:=((token shr 14) and $FFFC) + 8; +end; + end. diff --git a/sys/dev/dev_dmem.pas b/sys/dev/dev_dmem.pas index 28646129..cdf0005c 100644 --- a/sys/dev/dev_dmem.pas +++ b/sys/dev/dev_dmem.pas @@ -116,7 +116,7 @@ begin Exit(EPERM); end; - Result:=dmem_map_query(dmap^.dmem,offset,flags,id,info,size); + Result:=dmem_map_query(dmem_maps[d_pool_id].dmem,offset,flags,id,info,size); end; end; diff --git a/sys/dev/dev_gc.pas b/sys/dev/dev_gc.pas index 3a554341..89fb192f 100644 --- a/sys/dev/dev_gc.pas +++ b/sys/dev/dev_gc.pas @@ -24,6 +24,7 @@ uses vm_pager, vm_map, vm_mmap, + kern_dmem, kern_rwlock, kern_proc, kern_thr, @@ -145,7 +146,15 @@ begin while (i<>0) do begin token:=PDWORD(addr)^; - len:=PM4_LENGTH(token); + + if (PM4_TYPE(token)=2) then + begin + len:=sizeof(DWORD); + end else + begin + len:=PM4_LENGTH(token); + end; + if (len>i) then Exit; case PM4_TYPE(token) of @@ -158,7 +167,6 @@ begin //onPm42(PM4_TYPE_2_HEADER(token)); //no body - len:=sizeof(DWORD); end; 3:begin //PM4_TYPE_3 case PM4_TYPE_3_HEADER(token).opcode of diff --git a/sys/dev/display_soft.pas b/sys/dev/display_soft.pas index a8798166..75bf5694 100644 --- a/sys/dev/display_soft.pas +++ b/sys/dev/display_soft.pas @@ -96,7 +96,7 @@ uses LCLIntf, } sys_bootparam, - vm_mmap, + kern_dmem, kern_thread, dev_dce; diff --git a/sys/kern/kern_dmem.pas b/sys/kern/kern_dmem.pas index 1b380bcb..33bd50e3 100644 --- a/sys/kern/kern_dmem.pas +++ b/sys/kern/kern_dmem.pas @@ -93,6 +93,9 @@ function sys_virtual_query(addr:Pointer; info:Pointer; infoSize:QWORD):Integer; +function get_dmem_offset(addr:QWORD;p_offset,p_size:PQWORD):Boolean; +function get_dmem_ptr(addr:Pointer;p_ptr:PPointer;p_size:PQWORD):Boolean; + implementation uses @@ -811,6 +814,91 @@ begin Result:=copyout(@qinfo,info,size); end; +function get_dmem_offset(addr:QWORD;p_offset,p_size:PQWORD):Boolean; +var + map:vm_map_t; + entry:vm_map_entry_t; + obj:vm_object_t; + offset,size:QWORD; + + dmem:p_dmem_map; + curr,next:p_dmem_map_entry; +begin + Result:=False; + map:=p_proc.p_vmspace; + + vm_map_lock(map); + + if vm_map_lookup_entry(map,addr,@entry) then + begin + obj:=entry^.vm_obj; + + if (obj<>nil) then + begin + Result:=(obj^.flags and (OBJ_DMEM_EXT or OBJ_DMEM_EXT2))<>0; + end; + + if Result then + begin + offset:=entry^.offset+(addr-entry^.start); + + if (p_offset<>nil) then + begin + p_offset^:=offset; + end; + + if (p_size<>nil) then + begin + size:=entry^.__end-addr; + + dmem:=dmem_maps[default_pool_id].dmem; + dmem_map_lock(dmem); + + if dmem_map_lookup_entry(dmem,OFF_TO_IDX(offset),@curr) then + begin + while True do + begin + next:=curr^.next; + + if (next=@dmem^.header) then + begin + Break; + end; + + if (curr^.__end<>next^.start) then + begin + Break; + end; + + curr:=next; + end; + + size:=IDX_TO_OFF(curr^.__end)-offset; + end; + dmem_map_unlock(dmem); + + p_size^:=size; + end; + end; + end; + + vm_map_unlock(map); +end; + +function get_dmem_ptr(addr:Pointer;p_ptr:PPointer;p_size:PQWORD):Boolean; +var + offset:QWORD; +begin + offset:=0; + + Result:=get_dmem_offset(QWORD(addr),@offset,p_size); + + if Result then + if (p_ptr<>nil) then + begin + p_ptr^:=Pointer(VM_MIN_GPU_ADDRESS+offset); + end; +end; diff --git a/sys/vm/vm_mmap.pas b/sys/vm/vm_mmap.pas index 6ff849f5..e016990f 100644 --- a/sys/vm/vm_mmap.pas +++ b/sys/vm/vm_mmap.pas @@ -49,9 +49,6 @@ function vm_mmap2(map :vm_map_t; function mirror_map (paddr,psize:QWORD):Pointer; procedure mirror_unmap(base:Pointer;size:QWORD); -function get_dmem_offset(addr:QWORD;p_offset,p_size:PQWORD):Boolean; -function get_dmem_ptr(addr:Pointer;p_ptr:PPointer;p_size:PQWORD):Boolean; - implementation uses @@ -1009,60 +1006,5 @@ begin pmap_mirror_unmap(map^.pmap,base,size); end; -function get_dmem_offset(addr:QWORD;p_offset,p_size:PQWORD):Boolean; -var - map:vm_map_t; - entry:vm_map_entry_t; - obj:vm_object_t; - diff:QWORD; -begin - Result:=False; - map:=p_proc.p_vmspace; - - vm_map_lock(map); - - if vm_map_lookup_entry(map,addr,@entry) then - begin - obj:=entry^.vm_obj; - - if (obj<>nil) then - begin - Result:=(obj^.flags and (OBJ_DMEM_EXT or OBJ_DMEM_EXT2))<>0; - end; - - if Result then - begin - diff:=addr-entry^.start; - - if (p_offset<>nil) then - begin - p_offset^:=entry^.offset+diff; - end; - - if (p_size<>nil) then - begin - p_size^:=(entry^.__end-entry^.start)-diff; - end; - end; - end; - - vm_map_unlock(map); -end; - -function get_dmem_ptr(addr:Pointer;p_ptr:PPointer;p_size:PQWORD):Boolean; -var - offset:QWORD; -begin - offset:=0; - - Result:=get_dmem_offset(QWORD(addr),@offset,p_size); - - if Result then - if (p_ptr<>nil) then - begin - p_ptr^:=Pointer(VM_MIN_GPU_ADDRESS+offset); - end; -end; - end.