This commit is contained in:
Pavel 2024-03-25 11:01:47 +03:00
parent 3f4179b071
commit 6ded8ed421
6 changed files with 106 additions and 62 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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

View File

@ -96,7 +96,7 @@ uses
LCLIntf,
}
sys_bootparam,
vm_mmap,
kern_dmem,
kern_thread,
dev_dce;

View File

@ -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;

View File

@ -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.