mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
3f4179b071
commit
6ded8ed421
|
@ -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.
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -96,7 +96,7 @@ uses
|
|||
LCLIntf,
|
||||
}
|
||||
sys_bootparam,
|
||||
vm_mmap,
|
||||
kern_dmem,
|
||||
kern_thread,
|
||||
dev_dce;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
Loading…
Reference in New Issue