diff --git a/chip/pm4_me.pas b/chip/pm4_me.pas index f6413e66..58f277a5 100644 --- a/chip/pm4_me.pas +++ b/chip/pm4_me.pas @@ -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)); diff --git a/chip/pm4_pfp.pas b/chip/pm4_pfp.pas index 36af21d2..2c8971ea 100644 --- a/chip/pm4_pfp.pas +++ b/chip/pm4_pfp.pas @@ -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)); diff --git a/chip/pm4_ring.pas b/chip/pm4_ring.pas index 4c9645cd..bf99c18f 100644 --- a/chip/pm4_ring.pas +++ b/chip/pm4_ring.pas @@ -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; diff --git a/chip/shader_dump.pas b/chip/shader_dump.pas index 9697fb42..2bd97c50 100644 --- a/chip/shader_dump.pas +++ b/chip/shader_dump.pas @@ -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); diff --git a/src/np/ps4_libscenpcommon.pas b/src/np/ps4_libscenpcommon.pas index d87e0364..fbcc324f 100644 --- a/src/np/ps4_libscenpcommon.pas +++ b/src/np/ps4_libscenpcommon.pas @@ -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; diff --git a/sys/dev/dev_dmem.pas b/sys/dev/dev_dmem.pas index 2ff8d8d6..f2f92767 100644 --- a/sys/dev/dev_dmem.pas +++ b/sys/dev/dev_dmem.pas @@ -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; diff --git a/sys/dev/dev_gc.pas b/sys/dev/dev_gc.pas index 87d171ac..c4e41c87 100644 --- a/sys/dev/dev_gc.pas +++ b/sys/dev/dev_gc.pas @@ -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; diff --git a/sys/dev/display_soft.pas b/sys/dev/display_soft.pas index bda90197..e0ac78f9 100644 --- a/sys/dev/display_soft.pas +++ b/sys/dev/display_soft.pas @@ -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); diff --git a/sys/kern/kern_dmem.pas b/sys/kern/kern_dmem.pas index a19d5f8a..30e8821c 100644 --- a/sys/kern/kern_dmem.pas +++ b/sys/kern/kern_dmem.pas @@ -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; diff --git a/sys/kern/kern_exec.pas b/sys/kern/kern_exec.pas index d2976f40..2c2c3e5d 100644 --- a/sys/kern/kern_exec.pas +++ b/sys/kern/kern_exec.pas @@ -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; diff --git a/sys/kern/kern_rtld.pas b/sys/kern/kern_rtld.pas index 47bfbb01..0b05cde6 100644 --- a/sys/kern/kern_rtld.pas +++ b/sys/kern/kern_rtld.pas @@ -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; diff --git a/sys/kern/subr_dynlib.pas b/sys/kern/subr_dynlib.pas index 8525d22a..18401706 100644 --- a/sys/kern/subr_dynlib.pas +++ b/sys/kern/subr_dynlib.pas @@ -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; diff --git a/sys/md/vm_pmap.pas b/sys/md/vm_pmap.pas index 4a39083d..5b60f525 100644 --- a/sys/md/vm_pmap.pas +++ b/sys/md/vm_pmap.pas @@ -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_starti_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; diff --git a/sys/vm/dmem_map.pas b/sys/vm/dmem_map.pas index ff6debe5..7c34a304 100644 --- a/sys/vm/dmem_map.pas +++ b/sys/vm/dmem_map.pas @@ -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; diff --git a/sys/vm/vm_mmap.pas b/sys/vm/vm_mmap.pas index 143f3230..737ac80c 100644 --- a/sys/vm/vm_mmap.pas +++ b/sys/vm/vm_mmap.pas @@ -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. diff --git a/sys/vm/vm_nt_map.pas b/sys/vm/vm_nt_map.pas index 5d79863f..65762f91 100644 --- a/sys/vm/vm_nt_map.pas +++ b/sys/vm/vm_nt_map.pas @@ -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 diff --git a/vulkan/vHostBufferManager.pas b/vulkan/vHostBufferManager.pas index e15b39e4..f2420672 100644 --- a/vulkan/vHostBufferManager.pas +++ b/vulkan/vHostBufferManager.pas @@ -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); diff --git a/vulkan/vMemory.pas b/vulkan/vMemory.pas index 449e0721..d98e26c5 100644 --- a/vulkan/vMemory.pas +++ b/vulkan/vMemory.pas @@ -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: diff --git a/vulkan/vShaderExt.pas b/vulkan/vShaderExt.pas index 7ce73ea2..d5320aa6 100644 --- a/vulkan/vShaderExt.pas +++ b/vulkan/vShaderExt.pas @@ -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; diff --git a/vulkan/vShaderManager.pas b/vulkan/vShaderManager.pas index 5cff8ff7..b330f8c6 100644 --- a/vulkan/vShaderManager.pas +++ b/vulkan/vShaderManager.pas @@ -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;