This commit is contained in:
Pavel 2025-03-22 22:42:56 +03:00
parent a60e7df230
commit 367f19b74e
20 changed files with 211 additions and 279 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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