mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
a60e7df230
commit
367f19b74e
|
@ -2638,14 +2638,14 @@ begin
|
|||
|
||||
if (node^.addr<>nil) then
|
||||
begin
|
||||
|
||||
addr_dmem:=nil;
|
||||
if (node^.dataSel<>EVENTWRITEEOP_DATA_SEL_DISCARD) then
|
||||
begin
|
||||
if not get_dmem_ptr(node^.addr,@addr_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(node^.addr)+' not in dmem!');
|
||||
end;
|
||||
addr_dmem:=get_dmem_ptr(node^.addr);
|
||||
end;
|
||||
|
||||
if (addr_dmem<>nil) then
|
||||
Case node^.dataSel of
|
||||
//
|
||||
EVENTWRITEEOP_DATA_SEL_DISCARD:
|
||||
|
@ -2753,12 +2753,11 @@ begin
|
|||
|
||||
if (node^.addr<>nil) then
|
||||
begin
|
||||
|
||||
addr_dmem:=nil;
|
||||
if (node^.srcSel<>RELEASEMEM_DATA_SEL_DISCARD) then
|
||||
begin
|
||||
if not get_dmem_ptr(node^.addr,@addr_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(node^.addr)+' not in dmem!');
|
||||
end;
|
||||
addr_dmem:=get_dmem_ptr(node^.addr);
|
||||
end;
|
||||
|
||||
Case node^.dstSel of
|
||||
|
@ -2768,6 +2767,7 @@ begin
|
|||
Assert(false,'pm4_ReleaseMem:dstSel');
|
||||
end;
|
||||
|
||||
if (addr_dmem<>nil) then
|
||||
Case node^.srcSel of
|
||||
//
|
||||
RELEASEMEM_DATA_SEL_DISCARD:
|
||||
|
@ -2898,11 +2898,7 @@ begin
|
|||
begin
|
||||
//soft
|
||||
|
||||
addr_dmem:=nil;
|
||||
if not get_dmem_ptr(Pointer(node^.addr),@addr_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(Pointer(node^.addr))+' not in dmem!');
|
||||
end;
|
||||
addr_dmem:=get_dmem_ptr(node^.addr);
|
||||
|
||||
PDWORD(addr_dmem)^:=node^.data;
|
||||
|
||||
|
@ -2942,15 +2938,9 @@ begin
|
|||
begin
|
||||
//soft
|
||||
|
||||
if not get_dmem_ptr(node^.src,@src_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(node^.src)+' not in dmem!');
|
||||
end;
|
||||
src_dmem:=get_dmem_ptr(node^.src);
|
||||
|
||||
if not get_dmem_ptr(node^.dst,@dst_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(node^.dst)+' not in dmem!');
|
||||
end;
|
||||
dst_dmem:=get_dmem_ptr(node^.dst);
|
||||
|
||||
byteSize:=node^.num_dw*SizeOf(DWORD);
|
||||
|
||||
|
@ -2989,8 +2979,8 @@ procedure pm4_DmaData(var ctx:t_me_render_context;node:p_pm4_node_DmaData);
|
|||
var
|
||||
adrSrc:QWORD;
|
||||
adrDst:QWORD;
|
||||
adrSrc_dmem:QWORD;
|
||||
adrDst_dmem:QWORD;
|
||||
adrSrc_dmem:Pointer;
|
||||
adrDst_dmem:Pointer;
|
||||
byteCount:DWORD;
|
||||
srcSel,dstSel:Byte;
|
||||
begin
|
||||
|
@ -3021,17 +3011,11 @@ begin
|
|||
begin
|
||||
//soft
|
||||
|
||||
if not get_dmem_ptr(Pointer(adrDst),@adrDst_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(Pointer(adrDst))+' not in dmem!');
|
||||
end;
|
||||
adrDst_dmem:=get_dmem_ptr(Pointer(adrDst));
|
||||
|
||||
if not get_dmem_ptr(Pointer(adrSrc),@adrSrc_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(Pointer(adrSrc))+' not in dmem!');
|
||||
end;
|
||||
adrSrc_dmem:=get_dmem_ptr(Pointer(adrSrc));
|
||||
|
||||
Move(Pointer(adrSrc_dmem)^,Pointer(adrDst_dmem)^,byteCount);
|
||||
Move(adrSrc_dmem^,adrDst_dmem^,byteCount);
|
||||
|
||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,M_DMEM_WRITE);
|
||||
|
||||
|
@ -3054,12 +3038,9 @@ begin
|
|||
begin
|
||||
//soft
|
||||
|
||||
if not get_dmem_ptr(Pointer(adrDst),@adrDst_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(Pointer(adrDst))+' not in dmem!');
|
||||
end;
|
||||
adrDst_dmem:=get_dmem_ptr(Pointer(adrDst));
|
||||
|
||||
FillDWORD(Pointer(adrDst_dmem)^,(byteCount div 4),DWORD(adrSrc));
|
||||
FillDWORD(adrDst_dmem^,(byteCount div 4),DWORD(adrSrc));
|
||||
|
||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,M_DMEM_WRITE);
|
||||
|
||||
|
@ -3139,15 +3120,7 @@ begin
|
|||
del_reg(kq);
|
||||
|
||||
Fcode_addr:=addr;
|
||||
Fdmem_addr:=nil;
|
||||
|
||||
if (addr<>nil) then
|
||||
begin
|
||||
if not get_dmem_ptr(addr,@Fdmem_addr,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(addr)+' not in dmem!');
|
||||
end;
|
||||
end;
|
||||
Fdmem_addr:=get_dmem_ptr(addr);
|
||||
end;
|
||||
|
||||
function SendWarnMsg(const s:RawByteString):Integer;
|
||||
|
@ -3237,10 +3210,7 @@ var
|
|||
__end:DWORD;
|
||||
size :DWORD;
|
||||
begin
|
||||
if not get_dmem_ptr(node^.addr,@addr_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(node^.addr)+' not in dmem!');
|
||||
end;
|
||||
addr_dmem:=get_dmem_ptr(node^.addr);
|
||||
|
||||
start:=node^.offset;
|
||||
__end:=start+(node^.num_dw*SizeOf(DWORD));
|
||||
|
@ -3268,10 +3238,7 @@ var
|
|||
__end:DWORD;
|
||||
size :DWORD;
|
||||
begin
|
||||
if not get_dmem_ptr(node^.addr,@addr_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(node^.addr)+' not in dmem!');
|
||||
end;
|
||||
addr_dmem:=get_dmem_ptr(node^.addr);
|
||||
|
||||
start:=node^.offset;
|
||||
__end:=start+(node^.num_dw*SizeOf(DWORD));
|
||||
|
|
|
@ -137,7 +137,6 @@ var
|
|||
ib_base:QWORD;
|
||||
ib_size:QWORD;
|
||||
addr:Pointer;
|
||||
size:QWORD;
|
||||
begin
|
||||
Result:=False;
|
||||
|
||||
|
@ -154,34 +153,20 @@ begin
|
|||
ib_base:=QWORD(buf^.ibBase);
|
||||
ib_size:=QWORD(buf^.ibSize)*sizeof(DWORD);
|
||||
|
||||
addr:=nil;
|
||||
size:=0;
|
||||
addr:=get_dmem_ptr(Pointer(ib_base));
|
||||
|
||||
if get_dmem_ptr(Pointer(ib_base),@addr,@size) then
|
||||
begin
|
||||
if (ib_size>size) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(ib_base+size,16)+' not in dmem!');
|
||||
end else
|
||||
begin
|
||||
//Writeln(' addr:0x'+HexStr(ib_base,16)+' '+HexStr(ib_size,16));
|
||||
//Writeln(' addr:0x'+HexStr(ib_base,16)+' '+HexStr(ib_size,16));
|
||||
|
||||
ibuf^.next:=Default(TAILQ_ENTRY);
|
||||
ibuf^.base:=Pointer(ib_base); //adjust guest addr
|
||||
ibuf^.buff:=addr;
|
||||
ibuf^.size:=ib_size;
|
||||
ibuf^.bpos:=0;
|
||||
ibuf^.picb:=icb;
|
||||
ibuf^.buft:=buft;
|
||||
ibuf^.c_id:=0;
|
||||
|
||||
Result:=True;
|
||||
end;
|
||||
end else
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(ib_base,16)+' not in dmem!');
|
||||
end;
|
||||
ibuf^.next:=Default(TAILQ_ENTRY);
|
||||
ibuf^.base:=Pointer(ib_base); //adjust guest addr
|
||||
ibuf^.buff:=addr;
|
||||
ibuf^.size:=ib_size;
|
||||
ibuf^.bpos:=0;
|
||||
ibuf^.picb:=icb;
|
||||
ibuf^.buft:=buft;
|
||||
ibuf^.c_id:=0;
|
||||
|
||||
Result:=True;
|
||||
end;
|
||||
|
||||
function pm4_ibuf_parse(pctx:p_pfp_ctx;ibuf:p_pm4_ibuffer):Integer;
|
||||
|
@ -1167,8 +1152,8 @@ procedure onDmaData(pctx:p_pfp_ctx;Body:PPM4DMADATA);
|
|||
var
|
||||
adrSrc:QWORD;
|
||||
adrDst:QWORD;
|
||||
adrSrc_dmem:QWORD;
|
||||
adrDst_dmem:QWORD;
|
||||
adrSrc_dmem:Pointer;
|
||||
adrDst_dmem:Pointer;
|
||||
byteCount:DWORD;
|
||||
srcSel,dstSel:Byte;
|
||||
begin
|
||||
|
@ -1211,10 +1196,7 @@ begin
|
|||
begin
|
||||
//Execute on the parser side
|
||||
|
||||
if not get_dmem_ptr(Pointer(adrDst),@adrDst_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(Pointer(adrDst))+' not in dmem!');
|
||||
end;
|
||||
adrDst_dmem:=get_dmem_ptr(Pointer(adrDst));
|
||||
|
||||
case (srcSel or (dstSel shl 4)) of
|
||||
(kDmaDataSrcMemory or (kDmaDataDstMemory shl 4)),
|
||||
|
@ -1222,19 +1204,16 @@ begin
|
|||
(kDmaDataSrcMemory or (kDmaDataDstMemoryUsingL2 shl 4)),
|
||||
(kDmaDataSrcMemoryUsingL2 or (kDmaDataDstMemoryUsingL2 shl 4)):
|
||||
begin
|
||||
if not get_dmem_ptr(Pointer(adrSrc),@adrSrc_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(Pointer(adrSrc))+' not in dmem!');
|
||||
end;
|
||||
adrSrc_dmem:=get_dmem_ptr(Pointer(adrSrc));
|
||||
|
||||
Move(Pointer(adrSrc_dmem)^,Pointer(adrDst_dmem)^,byteCount);
|
||||
Move(adrSrc_dmem^,adrDst_dmem^,byteCount);
|
||||
|
||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,M_DMEM_WRITE);
|
||||
end;
|
||||
(kDmaDataSrcData or (kDmaDataDstMemory shl 4)),
|
||||
(kDmaDataSrcData or (kDmaDataDstMemoryUsingL2 shl 4)):
|
||||
begin
|
||||
FillDWORD(Pointer(adrDst_dmem)^,(byteCount div 4),DWORD(adrSrc));
|
||||
FillDWORD(adrDst_dmem^,(byteCount div 4),DWORD(adrSrc));
|
||||
|
||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,M_DMEM_WRITE);
|
||||
end;
|
||||
|
@ -1309,10 +1288,7 @@ begin
|
|||
WRITE_DATA_DST_SEL_TCL2, //writeDataInlineThroughL2
|
||||
WRITE_DATA_DST_SEL_MEMORY_ASYNC:
|
||||
begin
|
||||
if not get_dmem_ptr(dst,@dst_dmem,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(dst)+' not in dmem!');
|
||||
end;
|
||||
dst_dmem:=get_dmem_ptr(dst);
|
||||
|
||||
Move(src_dmem^,dst_dmem^,count*SizeOf(DWORD));
|
||||
|
||||
|
|
|
@ -7,6 +7,8 @@ interface
|
|||
|
||||
uses
|
||||
errno,
|
||||
vmparam,
|
||||
vm_mmap,
|
||||
md_map,
|
||||
systm,
|
||||
si_ci_vi_merged_enum,
|
||||
|
@ -32,7 +34,7 @@ type
|
|||
base_guest_addr:Pointer;
|
||||
base_dmem_addr :Pointer;
|
||||
read_guest_addr:PDWORD;
|
||||
read_dmem_addr :PDWORD;
|
||||
read_mirr_addr :PDWORD;
|
||||
next_dmem_addr :PDWORD;
|
||||
enable :DWORD;
|
||||
lenLog2 :DWORD;
|
||||
|
@ -350,7 +352,9 @@ Function gc_map_hqd(ringBaseAddress:Pointer;
|
|||
hqd:p_gc_hqd):Integer;
|
||||
var
|
||||
base_dmem_addr:PDWORD;
|
||||
read_dmem_addr:PDWORD;
|
||||
read_mirr_addr:PDWORD;
|
||||
base:Pointer;
|
||||
offset:Integer;
|
||||
begin
|
||||
Result:=0;
|
||||
|
||||
|
@ -364,24 +368,21 @@ begin
|
|||
Exit(Integer($804c000d));
|
||||
end;
|
||||
|
||||
base_dmem_addr:=nil;
|
||||
if not get_dmem_ptr(ringBaseAddress,@base_dmem_addr,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(ringBaseAddress)+' not in dmem!');
|
||||
end;
|
||||
base_dmem_addr:=get_dmem_ptr(ringBaseAddress);
|
||||
|
||||
read_dmem_addr:=nil;
|
||||
if not get_dmem_ptr(readPtrAddress,@read_dmem_addr,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(readPtrAddress)+' not in dmem!');
|
||||
end;
|
||||
offset:=QWORD(readPtrAddress) and PAGE_MASK;
|
||||
base :=Pointer(QWORD(readPtrAddress) and (not PAGE_MASK));
|
||||
|
||||
//TODO: ring bound check, virtual addres prio instead of dmem
|
||||
read_mirr_addr:=mirror_map(base,PAGE_SIZE);
|
||||
|
||||
read_mirr_addr:=Pointer(QWORD(read_mirr_addr)+offset);
|
||||
|
||||
//TODO: ring bound check
|
||||
|
||||
hqd^.base_guest_addr:=ringBaseAddress;
|
||||
hqd^.base_dmem_addr :=base_dmem_addr;
|
||||
hqd^.read_guest_addr:=readPtrAddress;
|
||||
hqd^.read_dmem_addr :=read_dmem_addr;
|
||||
hqd^.read_mirr_addr :=read_mirr_addr;
|
||||
hqd^.next_dmem_addr :=nextPtrAddress;
|
||||
hqd^.lenLog2 :=lenLog2;
|
||||
hqd^.g_queueId :=g_queueId;
|
||||
|
@ -393,9 +394,15 @@ begin
|
|||
end;
|
||||
|
||||
Function gc_unmap_hqd(hqd:p_gc_hqd):Integer;
|
||||
var
|
||||
base:Pointer;
|
||||
begin
|
||||
hqd^:=Default(t_gc_hqd);
|
||||
|
||||
base:=Pointer(QWORD(hqd^.read_mirr_addr) and (not PAGE_MASK));
|
||||
|
||||
mirror_unmap(base,PAGE_SIZE);
|
||||
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
|
@ -474,7 +481,7 @@ begin
|
|||
ReadOffsetDw:=(ReadOffsetDw + (size shr 2)) and (hqd^.ringSizeDw-1);
|
||||
|
||||
hqd^.ReadOffsetDw :=ReadOffsetDw;
|
||||
hqd^.read_dmem_addr^:=ReadOffsetDw;
|
||||
hqd^.read_mirr_addr^:=ReadOffsetDw;
|
||||
|
||||
Result:=True;
|
||||
end;
|
||||
|
|
|
@ -193,10 +193,7 @@ begin
|
|||
if (base<>nil) then
|
||||
begin
|
||||
|
||||
if not get_dmem_ptr(base,@base,nil) then
|
||||
begin
|
||||
Assert(false,'DumpCS:get_dmem_ptr');
|
||||
end;
|
||||
base:=get_dmem_ptr(base);
|
||||
|
||||
size:=_calc_shader_size(base);
|
||||
|
||||
|
@ -245,10 +242,7 @@ begin
|
|||
if (base<>nil) then
|
||||
begin
|
||||
|
||||
if not get_dmem_ptr(base,@base,nil) then
|
||||
begin
|
||||
Assert(false,'DumpPS:get_dmem_ptr');
|
||||
end;
|
||||
base:=get_dmem_ptr(base);
|
||||
|
||||
size:=_calc_shader_size(base);
|
||||
|
||||
|
@ -306,10 +300,7 @@ begin
|
|||
if (base<>nil) then
|
||||
begin
|
||||
|
||||
if not get_dmem_ptr(base,@base,nil) then
|
||||
begin
|
||||
Assert(false,'DumpVS:get_dmem_ptr');
|
||||
end;
|
||||
base:=get_dmem_ptr(base);
|
||||
|
||||
size:=_calc_shader_size(base);
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ unit ps4_libSceNpCommon;
|
|||
interface
|
||||
|
||||
uses
|
||||
vmparam,
|
||||
subr_dynlib,
|
||||
np_error,
|
||||
ps4_libSceUserService;
|
||||
|
@ -420,9 +421,9 @@ begin
|
|||
|
||||
mem_out^.unknow:=0;
|
||||
pad_len:=0;
|
||||
if (len and $3fff)<>0 then
|
||||
if (len and PAGE_MASK)<>0 then
|
||||
begin
|
||||
pad_len:=$4000-(len and $3fff);
|
||||
pad_len:=PAGE_SIZE-(len and PAGE_MASK);
|
||||
end;
|
||||
mem_out^.len:=pad_len+len;
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ begin
|
|||
|
||||
addr:=QWORD(data^.addr);
|
||||
|
||||
if ((addr and $3fff) <> 0) then
|
||||
if ((addr and PAGE_MASK) <> 0) then
|
||||
begin
|
||||
Exit(EINVAL);
|
||||
end;
|
||||
|
@ -105,7 +105,7 @@ begin
|
|||
Exit(EINVAL);
|
||||
end;
|
||||
|
||||
if ((len and $3fff) <> 0) then
|
||||
if ((len and PAGE_MASK) <> 0) then
|
||||
begin
|
||||
Exit(EINVAL);
|
||||
end;
|
||||
|
|
|
@ -76,7 +76,7 @@ function mmap_addr(paddr,psize:QWORD;
|
|||
var
|
||||
map:vm_map_t;
|
||||
begin
|
||||
if ((psize and $3fff)=0) and ((prot and $33)=prot) then
|
||||
if ((psize and PAGE_MASK)=0) and ((prot and $33)=prot) then
|
||||
begin
|
||||
map:=@p_vmspace(p_proc.p_vmspace)^.vm_map;
|
||||
|
||||
|
|
|
@ -146,6 +146,7 @@ uses
|
|||
}
|
||||
md_time,
|
||||
sys_bootparam,
|
||||
vmparam,
|
||||
vm_mmap;
|
||||
|
||||
//
|
||||
|
@ -336,10 +337,10 @@ begin
|
|||
|
||||
if (orig.left=nil) then Exit(EINVAL);
|
||||
|
||||
size:=(m_attr[a].size+$3FFF) and (not $3FFF);
|
||||
size:=(m_attr[a].size+PAGE_MASK) and (not PAGE_MASK);
|
||||
|
||||
Assert((QWORD(orig.left) and $3FFF=0),'left');
|
||||
Assert((QWORD(orig.right) and $3FFF=0),'right');
|
||||
Assert((QWORD(orig.left) and PAGE_MASK=0),'left');
|
||||
Assert((QWORD(orig.right) and PAGE_MASK=0),'right');
|
||||
|
||||
mirr.left :=mirror_map(orig.left ,size);
|
||||
mirr.right:=mirror_map(orig.right,size);
|
||||
|
|
|
@ -95,7 +95,7 @@ function sys_virtual_query(addr:Pointer;
|
|||
|
||||
function rmem_map_test_lock(start,__end:QWORD):Boolean;
|
||||
|
||||
function get_dmem_ptr(addr:Pointer;p_ptr:PPointer;p_size:PQWORD):Boolean;
|
||||
function get_dmem_ptr(addr:Pointer):Pointer;
|
||||
|
||||
implementation
|
||||
|
||||
|
@ -408,12 +408,12 @@ begin
|
|||
|
||||
addr:=vm_offset_t(vaddr);
|
||||
|
||||
if ((addr and $3fff)<>0) then
|
||||
if ((addr and PAGE_MASK)<>0) then
|
||||
begin
|
||||
Exit(Pointer(EINVAL));
|
||||
end;
|
||||
|
||||
if ((phaddr and $3fff)<>0) then
|
||||
if ((phaddr and PAGE_MASK)<>0) then
|
||||
begin
|
||||
Exit(Pointer(EINVAL));
|
||||
end;
|
||||
|
@ -423,12 +423,12 @@ begin
|
|||
Exit(Pointer(EINVAL));
|
||||
end;
|
||||
|
||||
if (length <= $3fff) then
|
||||
if (length <= PAGE_MASK) then
|
||||
begin
|
||||
Exit(Pointer(EINVAL));
|
||||
end;
|
||||
|
||||
if ((length and $3fff)<>0) then
|
||||
if ((length and PAGE_MASK)<>0) then
|
||||
begin
|
||||
Exit(Pointer(EINVAL));
|
||||
end;
|
||||
|
@ -923,88 +923,9 @@ 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;
|
||||
function get_dmem_ptr(addr:Pointer):Pointer;
|
||||
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)<>0;
|
||||
end;
|
||||
|
||||
if Result then
|
||||
begin
|
||||
offset:=entry^.offset;
|
||||
|
||||
offset:=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;
|
||||
begin
|
||||
Result:=True;
|
||||
p_ptr^:=addr+VM_MIN_GPU_ADDRESS;
|
||||
|
||||
if (p_size<>nil) then
|
||||
begin
|
||||
Assert(false,'TODO:get_dmem_ptr');
|
||||
end;
|
||||
Result:=addr+VM_MIN_GPU_ADDRESS;
|
||||
end;
|
||||
|
||||
|
||||
|
|
|
@ -884,7 +884,7 @@ begin
|
|||
end;
|
||||
|
||||
addr:=(p_vaddr and QWORD($ffffffffffffc000));
|
||||
size:=((p_vaddr and $3fff) + $3fff + p_memsz) and QWORD($ffffffffffffc000);
|
||||
size:=((p_vaddr and PAGE_MASK) + PAGE_MASK + p_memsz) and QWORD($ffffffffffffc000);
|
||||
|
||||
if (p_type=PT_SCE_RELRO) then
|
||||
begin
|
||||
|
@ -965,7 +965,7 @@ begin
|
|||
auxargs^.phent :=hdr^.e_phentsize;
|
||||
auxargs^.phnum :=hdr^.e_phnum;
|
||||
auxargs^.pagesz:=PAGE_SIZE;
|
||||
auxargs^.base :=(QWORD(vms^.vm_daddr) + $3fff + lim_max(RLIMIT_DATA)) and QWORD($ffffffffffffc000);
|
||||
auxargs^.base :=(QWORD(vms^.vm_daddr) + PAGE_MASK + lim_max(RLIMIT_DATA)) and QWORD($ffffffffffffc000);
|
||||
auxargs^.flags :=0;
|
||||
auxargs^.entry :=QWORD(imgp^.entry_addr);
|
||||
|
||||
|
@ -1020,7 +1020,7 @@ begin
|
|||
obj^.data_addr:=vms^.vm_daddr;
|
||||
obj^.data_size:=vms^.vm_dsize * PAGE_SIZE;
|
||||
|
||||
obj^.map_size :=((QWORD(obj^.data_addr) + obj^.data_size + $3fff) and QWORD($ffffffffffffc000)) - QWORD(text_addr);
|
||||
obj^.map_size :=((QWORD(obj^.data_addr) + obj^.data_size + PAGE_MASK) and QWORD($ffffffffffffc000)) - QWORD(text_addr);
|
||||
|
||||
obj^.relro_addr:=imgp^.relro_addr;
|
||||
obj^.relro_size:=imgp^.relro_size;
|
||||
|
|
|
@ -720,7 +720,7 @@ begin
|
|||
|
||||
imgp^.min_addr:=MinInt64(imgp^.min_addr,vaddr);
|
||||
|
||||
vaddr:=(vaddr+memsz+$3fff) and QWORD($ffffffffffffc000);
|
||||
vaddr:=(vaddr+memsz+PAGE_MASK) and QWORD($ffffffffffffc000);
|
||||
|
||||
imgp^.max_addr:=MaxInt64(imgp^.max_addr,vaddr);
|
||||
|
||||
|
@ -1097,7 +1097,7 @@ begin
|
|||
Exit(ENOEXEC);
|
||||
end;
|
||||
|
||||
if ((vaddr and $3fff)<>0) then
|
||||
if ((vaddr and PAGE_MASK)<>0) then
|
||||
begin
|
||||
Writeln(StdErr,'[KERNEL] self_load_section: non-aligned segment ',id,', ',HexStr(vaddr,8));
|
||||
Exit(ENOEXEC);
|
||||
|
@ -1115,7 +1115,7 @@ begin
|
|||
size:=size and filesz;
|
||||
end else
|
||||
begin
|
||||
size:=(filesz + $3fff) and QWORD($ffffffffffffc000);
|
||||
size:=(filesz + PAGE_MASK) and QWORD($ffffffffffffc000);
|
||||
end;
|
||||
|
||||
if (size>memsz) then
|
||||
|
@ -1124,7 +1124,7 @@ begin
|
|||
end;
|
||||
|
||||
vaddr_lo:=vaddr and QWORD($ffffffffffffc000);
|
||||
vaddr_hi:=(vaddr + memsz + $3fff) and QWORD($ffffffffffffc000);
|
||||
vaddr_hi:=(vaddr + memsz + PAGE_MASK) and QWORD($ffffffffffffc000);
|
||||
|
||||
base:=Pointer(imgp^.image_header)+offset;
|
||||
|
||||
|
|
|
@ -1996,7 +1996,7 @@ begin
|
|||
end;
|
||||
|
||||
addr:=(p_vaddr and QWORD($ffffffffffffc000));
|
||||
size:=((p_vaddr and $3fff) + $3fff + phdr^.p_memsz) and QWORD($ffffffffffffc000);
|
||||
size:=((p_vaddr and PAGE_MASK) + PAGE_MASK + phdr^.p_memsz) and QWORD($ffffffffffffc000);
|
||||
|
||||
if (p_type=PT_SCE_RELRO) then
|
||||
begin
|
||||
|
@ -2117,7 +2117,7 @@ begin
|
|||
|
||||
p_memsz:=p_vaddr and QWORD($ffffffffffffc000);
|
||||
|
||||
p_vaddr:=(phdr^.p_memsz + p_vaddr - p_memsz + $3fff) and QWORD($ffffffffffffc000);
|
||||
p_vaddr:=(phdr^.p_memsz + p_vaddr - p_memsz + PAGE_MASK) and QWORD($ffffffffffffc000);
|
||||
|
||||
max_size1:=max_size1+p_vaddr;
|
||||
|
||||
|
|
|
@ -160,6 +160,10 @@ function pmap_danger_zone(pmap:pmap_t;
|
|||
addr:vm_offset_t;
|
||||
size:vm_offset_t):Boolean;
|
||||
|
||||
procedure pmap_gpu_get_bound(pmap:pmap_t;
|
||||
var start:vm_offset_t;
|
||||
var __end:vm_offset_t);
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
|
@ -1256,7 +1260,7 @@ begin
|
|||
|
||||
lock:=pmap_wlock(pmap,start,__end);
|
||||
|
||||
while (start<>__end) do
|
||||
while (start<__end) do
|
||||
begin
|
||||
if not vm_nt_map_fetch(@pmap^.nt_map,
|
||||
start,
|
||||
|
@ -1270,6 +1274,18 @@ begin
|
|||
Assert(false,'vm_nt_map_fetch');
|
||||
end;
|
||||
|
||||
if (p__start>start) then
|
||||
begin
|
||||
start:=p__start;
|
||||
end;
|
||||
|
||||
p_offset:=p_offset+(start-p__start);
|
||||
|
||||
if (p____end>__end) then
|
||||
begin
|
||||
p____end:=__end;
|
||||
end;
|
||||
|
||||
//map to GPU
|
||||
if (p____obj<>nil) then
|
||||
begin
|
||||
|
@ -1294,6 +1310,70 @@ begin
|
|||
pmap_unlock(pmap,lock);
|
||||
end;
|
||||
|
||||
procedure pmap_gpu_get_bound(pmap:pmap_t;
|
||||
var start:vm_offset_t;
|
||||
var __end:vm_offset_t);
|
||||
var
|
||||
lock:Pointer;
|
||||
|
||||
i_start:vm_offset_t;
|
||||
i___end:vm_offset_t;
|
||||
|
||||
min_start:vm_offset_t;
|
||||
max___end:vm_offset_t;
|
||||
|
||||
p__start:vm_offset_t;
|
||||
p____end:vm_offset_t;
|
||||
p_offset:vm_offset_t;
|
||||
p____obj:p_vm_nt_file_obj;
|
||||
begin
|
||||
i_start:=start;
|
||||
i___end:=__end;
|
||||
|
||||
min_start:=0;
|
||||
max___end:=0;
|
||||
|
||||
lock:=pmap_wlock(pmap,start,__end);
|
||||
|
||||
while (i_start<i___end) do
|
||||
begin
|
||||
|
||||
if vm_nt_map_fetch(@pmap^.gp_map,
|
||||
i_start,
|
||||
i___end,
|
||||
p__start,
|
||||
p____end,
|
||||
p_offset,
|
||||
p____obj
|
||||
) then
|
||||
begin
|
||||
//is hole space
|
||||
if (p__start>i_start) then
|
||||
begin
|
||||
Break;
|
||||
end;
|
||||
|
||||
if (min_start=0) then
|
||||
begin
|
||||
min_start:=p__start;
|
||||
end;
|
||||
|
||||
max___end:=p____end;
|
||||
end else
|
||||
begin
|
||||
//not found
|
||||
Break;
|
||||
end;
|
||||
|
||||
i_start:=p____end;
|
||||
end;
|
||||
|
||||
pmap_unlock(pmap,lock);
|
||||
|
||||
start:=min_start;
|
||||
__end:=max___end;
|
||||
end;
|
||||
|
||||
procedure pmap_protect(pmap :pmap_t;
|
||||
obj :vm_object_t;
|
||||
start:vm_offset_t;
|
||||
|
|
|
@ -833,7 +833,7 @@ begin
|
|||
Exit(EINVAL);
|
||||
end;
|
||||
|
||||
if (( (align and QWORD($8000000000003fff)) or QWORD(len and QWORD($3fff)) )<>0) then
|
||||
if (( (align and QWORD($8000000000003fff)) or QWORD(len and QWORD(PAGE_MASK)) )<>0) then
|
||||
begin
|
||||
Exit(EINVAL);
|
||||
end;
|
||||
|
|
|
@ -52,6 +52,7 @@ function vm_mmap2(map :vm_map_t;
|
|||
|
||||
function mirror_map (paddr:Pointer;psize:QWORD):Pointer;
|
||||
procedure mirror_unmap(base:Pointer;size:QWORD);
|
||||
procedure gpu_get_bound(var start,__end:QWORD);
|
||||
|
||||
implementation
|
||||
|
||||
|
@ -1206,5 +1207,15 @@ begin
|
|||
pmap_mirror_unmap(map^.pmap,base,size);
|
||||
end;
|
||||
|
||||
|
||||
procedure gpu_get_bound(var start,__end:QWORD);
|
||||
var
|
||||
map:vm_map_t;
|
||||
begin
|
||||
map:=p_proc.p_vmspace;
|
||||
|
||||
pmap_gpu_get_bound(map^.pmap,start,__end);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
|
|
@ -1556,8 +1556,6 @@ function vm_nt_map_fetch(map :p_vm_nt_map;
|
|||
):Boolean;
|
||||
var
|
||||
entry:p_vm_nt_entry;
|
||||
cut:vm_offset_t;
|
||||
offset:vm_offset_t;
|
||||
obj:p_vm_nt_file_obj;
|
||||
begin
|
||||
Result:=False;
|
||||
|
@ -1572,22 +1570,14 @@ begin
|
|||
|
||||
if (entry<>@map^.header) and (entry^.start<__end) then
|
||||
begin
|
||||
obj:=entry^.obj;
|
||||
|
||||
offset:=entry^.offset+(start-entry^.start);
|
||||
|
||||
cut:=entry^.__end;
|
||||
|
||||
if (cut>__end) then
|
||||
begin
|
||||
cut:=__end;
|
||||
end;
|
||||
|
||||
p__start:=entry^.start;
|
||||
p____end:=cut;
|
||||
p_offset:=offset;
|
||||
p____end:=entry^.__end;
|
||||
p_offset:=entry^.offset;
|
||||
p____obj:=nil;
|
||||
|
||||
obj:=entry^.obj;
|
||||
|
||||
if (obj<>nil) then
|
||||
if (obj^.hfile<>0) then
|
||||
begin
|
||||
|
|
|
@ -190,11 +190,7 @@ begin
|
|||
Result:=nil;
|
||||
Assert(Size<>0);
|
||||
|
||||
dmem_addr:=0;
|
||||
if not get_dmem_ptr(Pointer(Addr),@dmem_addr,nil) then
|
||||
begin
|
||||
Assert(false,'addr:0x'+HexStr(Pointer(Addr))+' not in dmem!');
|
||||
end;
|
||||
dmem_addr:=QWORD(get_dmem_ptr(Pointer(Addr)));
|
||||
|
||||
dmem_addr:=dmem_addr-_fix_buf_size(Addr,Size,ALL_BUFFER_USAGE);
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ uses
|
|||
sysutils,
|
||||
mqueue,
|
||||
vmparam,
|
||||
vm_mmap,
|
||||
Vulkan,
|
||||
vDevice,
|
||||
vDependence,
|
||||
|
@ -1907,6 +1908,9 @@ begin
|
|||
FStart:=QWORD(Addr);
|
||||
F__End:=FStart+Size;
|
||||
//
|
||||
FStart:=Max(FStart,VM_MIN_GPU_ADDRESS);
|
||||
F__End:=Min(F__End,VM_MAX_GPU_ADDRESS);
|
||||
//
|
||||
rw_wlock(global_mem_lock);
|
||||
//
|
||||
|
||||
|
@ -1925,9 +1929,19 @@ begin
|
|||
|
||||
if (node=nil) then
|
||||
begin
|
||||
//TODO: rewrite
|
||||
FStart_align:=Max(AlignDw(FStart,GRANULAR_MAP_BLOCK_SIZE),VM_MIN_GPU_ADDRESS);
|
||||
F__End_align:=Min(AlignUp(F__End,GRANULAR_MAP_BLOCK_SIZE),VM_MAX_GPU_ADDRESS);
|
||||
FStart_align:=FStart;
|
||||
F__End_align:=F__End;
|
||||
|
||||
gpu_get_bound(FStart_align,F__End_align);
|
||||
|
||||
if (FStart_align=0) then
|
||||
begin
|
||||
Writeln('Addres:0x',HexStr(FStart_align,11),'not gpu mapped!');
|
||||
Assert(false,'FetchHostMap:gpu_get_bound');
|
||||
end;
|
||||
|
||||
FStart_align:=Max(FStart_align,AlignDw(FStart,GRANULAR_MAP_BLOCK_SIZE));
|
||||
F__End_align:=Min(F__End_align,AlignUp(F__End,GRANULAR_MAP_BLOCK_SIZE));
|
||||
|
||||
_retry:
|
||||
|
||||
|
|
|
@ -1184,11 +1184,7 @@ begin
|
|||
begin
|
||||
pData:=Pointer(PPtrUint(pDmem)^ and (not 3));
|
||||
|
||||
pDmem:=nil;
|
||||
if not get_dmem_ptr(pData,@pDmem,nil) then
|
||||
begin
|
||||
Assert(false,'vtBufPtr2:get_dmem_ptr($'+HexStr(pData)+')');
|
||||
end;
|
||||
pDmem:=get_dmem_ptr(pData);
|
||||
|
||||
pSharp:=pData;
|
||||
end;
|
||||
|
@ -1196,11 +1192,7 @@ begin
|
|||
begin
|
||||
pData:=PPointer(pDmem)^;
|
||||
|
||||
pDmem:=nil;
|
||||
if not get_dmem_ptr(pData,@pDmem,nil) then
|
||||
begin
|
||||
Assert(false,'vtFunPtr2:get_dmem_ptr($'+HexStr(pData)+')');
|
||||
end;
|
||||
pDmem:=get_dmem_ptr(pData);
|
||||
|
||||
pSharp:=pData;
|
||||
end;
|
||||
|
@ -1212,11 +1204,7 @@ begin
|
|||
begin
|
||||
pData:=Pointer(PVSharpResource4(pDmem)^.base);
|
||||
|
||||
pDmem:=nil;
|
||||
if not get_dmem_ptr(pData,@pDmem,nil) then
|
||||
begin
|
||||
Assert(false,'vtVSharp4:get_dmem_ptr($'+HexStr(pData)+')');
|
||||
end;
|
||||
pDmem:=get_dmem_ptr(pData);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
@ -1234,11 +1222,7 @@ begin
|
|||
begin
|
||||
pData:=Pointer(QWORD(PTSharpResource4(pDmem)^.base) shl 8);
|
||||
|
||||
pDmem:=nil;
|
||||
if not get_dmem_ptr(pData,@pDmem,nil) then
|
||||
begin
|
||||
Assert(false,'vtTSharp:get_dmem_ptr($'+HexStr(pData)+')');
|
||||
end;
|
||||
pDmem:=get_dmem_ptr(pData);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
|
|
@ -226,10 +226,7 @@ begin
|
|||
key:=Default(TShaderDataKey);
|
||||
key.FStage:=FStage;
|
||||
|
||||
if not get_dmem_ptr(pData,@key.pData,nil) then
|
||||
begin
|
||||
Assert(false,'_FetchShaderCodeCache');
|
||||
end;
|
||||
key.pData:=get_dmem_ptr(pData);
|
||||
|
||||
t:=_FindShaderCodeCache(key);
|
||||
|
||||
|
@ -296,11 +293,7 @@ end;
|
|||
|
||||
function _GetDmem(P:Pointer):Pointer; register;
|
||||
begin
|
||||
Result:=nil;
|
||||
if not get_dmem_ptr(P,@Result,nil) then
|
||||
begin
|
||||
Assert(false,'_GetDmem');
|
||||
end;
|
||||
Result:=get_dmem_ptr(P);
|
||||
end;
|
||||
|
||||
function ParseShader(FStage:TvShaderStage;pData:PDWORD;var GPU_REGS:TGPU_REGS;pc:PPushConstAllocator):TMemoryStream;
|
||||
|
|
Loading…
Reference in New Issue