expand guest vm to 43bit
This commit is contained in:
Pavel 2025-05-27 15:24:52 +03:00
parent 368d9bc2dc
commit 50b41f48e9
16 changed files with 145 additions and 92 deletions

View File

@ -1634,7 +1634,7 @@
<Define0 Value="DEBUG_MTX"/>
</OtherDefines>
<ExecuteAfter>
<Command Value="$(ProjPath)\tools\fp_rebase\fp_rebase$(ExeExt) &quot;$(OutputFile)&quot; -rebase 0x30000000000 -dwarf"/>
<Command Value="$(ProjPath)\tools\fp_rebase\fp_rebase$(ExeExt) &quot;$(OutputFile)&quot; -rebase 0xB0000000000 -dwarf"/>
<ShowAllMessages Value="True"/>
</ExecuteAfter>
</Other>

View File

@ -144,10 +144,10 @@ begin
begin
Result:=dmem_map_alloc(dmap^.dmem,start,__end,len,align,mtype,start);
{
Writeln('dmem_map_alloc(0x',HexStr(start,10),
',0x',HexStr(__end,10),
',0x',HexStr(len,10),
',0x',HexStr(align,10),
Writeln('dmem_map_alloc(0x',HexStr(start,11),
',0x',HexStr(__end,11),
',0x',HexStr(len,11),
',0x',HexStr(align,11),
',',mtype,'):',Result);
}
end;

View File

@ -1935,7 +1935,7 @@ begin
//
if print_asm then
begin
Writeln('switchtable:0x',HexStr(QWORD(sw_table^.table),10),'..0x',HexStr(QWORD(sw_next),10));
Writeln('switchtable:0x',HexStr(QWORD(sw_table^.table),11),'..0x',HexStr(QWORD(sw_next),11));
end;
//
if ctx.is_text_addr(QWORD(sw_data)) and
@ -1959,7 +1959,7 @@ begin
begin
if print_asm then
begin
Writeln(' [0x',HexStr(QWORD(sw_data),10),']->0x',HexStr(ofs,10));
Writeln(' [0x',HexStr(QWORD(sw_data),11),']->0x',HexStr(ofs,11));
end;
//
ctx.add_forward_point(fpCall,Pointer(ofs));

View File

@ -1916,8 +1916,9 @@ begin
end;
end;
// $10000000000 = 1 shl 40
// 64-40 = 24
// VM_MAXUSER_ADDRESS
// $80000000000 = 1 shl 43
// 64-43 = 21
procedure op_uplift(var ctx:t_jit_context2;const dst:TRegValue;mem_size:TOperandSize;hint:t_lea_hint=[]);
var
@ -1950,7 +1951,7 @@ begin
xchgq(rcx,rbits);
//addres bits
movi(new_reg_size(rcx,os8),40);
movi(new_reg_size(rcx,os8),43);
shrx(rcx,dst,rcx);
@ -1967,7 +1968,7 @@ begin
{
//zero bits
movi(new_reg_size(rbits,os8),24); //mov $24,%bpl
movi(new_reg_size(rbits,os8),21); //mov $21,%bpl
//clear hi
shlx(dst,dst,rbits); //shlx %rbp,%r14,%r14

View File

@ -93,7 +93,7 @@ end;
function sys_netgetiflist(param1:Pointer;param2,param3:Integer):Integer;
begin
Writeln('TODO:sys_netgetiflist(0x',HexStr(QWORD(param1),10),',',param2,',',param3,')');
Writeln('TODO:sys_netgetiflist(0x',HexStr(QWORD(param1),11),',',param2,',',param3,')');
Result:=0;
end;

View File

@ -521,15 +521,15 @@ begin
td^.td_retval[0]:=addr;
Writeln('0x',HexStr(QWORD(stack_addr),10),'->',
'sys_mmap_dmem(','0x',HexStr(QWORD(vaddr),10),
',0x',HexStr(length,10),
Writeln('0x',HexStr(QWORD(stack_addr),11),'->',
'sys_mmap_dmem(','0x',HexStr(QWORD(vaddr),11),
',0x',HexStr(length,11),
',0x',HexStr(mtype,1),
',0x',HexStr(prot,1),
',0x',HexStr(flags,6),
',0x',HexStr(phaddr,10),
'):',Integer(Result),
':0x',HexStr(addr,10),'..0x',HexStr(addr+length,10));
':0x',HexStr(addr,11),'..0x',HexStr(addr+length,11));
end;
function IN_CUSALIST_1:Boolean;

View File

@ -445,7 +445,7 @@ begin
Writeln(' obj.id :',obj^.id);
Writeln(' tls_flags :0x',HexStr(tls_index shr 16,4));
Writeln(' tls_index :0x',HexStr(tls_index,4));
Writeln(' tls_init_addr:0x',HexStr(QWORD(obj^.tls_init_addr),10));
Writeln(' tls_init_addr:0x',HexStr(QWORD(obj^.tls_init_addr),11));
Writeln(' tls_init_size:0x',HexStr(obj^.tls_init_size,8));
Writeln(' tls_size :0x',HexStr(obj^.tls_size ,8));
Writeln(' tls_offset :0x',HexStr(obj^.tls_offset ,8));

View File

@ -397,7 +397,7 @@ begin
stack_addr:=QWORD(vmspace^.sv_usrstack) - ssiz;
Writeln('vm_map_stack:0x',HexStr(stack_addr,10),'..0x',HexStr(stack_addr+ssiz,10));
Writeln('vm_map_stack:0x',HexStr(stack_addr,11),'..0x',HexStr(stack_addr+ssiz,11));
error:=vm_map_stack(map,
stack_addr,ssiz,

View File

@ -133,7 +133,7 @@ begin
td^.td_retval[0]:=key;
Writeln('namedobj_create("',_name,'",0x',HexStr(QWORD(objp),10),',0x',HexStr(objt,4),'):',key);
Writeln('namedobj_create("',_name,'",0x',HexStr(QWORD(objp),11),',0x',HexStr(objt,4),'):',key);
Result:=0;
end;

View File

@ -171,12 +171,12 @@ begin
{
Writeln('ranges_overlap:',
HexStr(entry),',',
HexStr(entry^.rl_q_start,10),',',
HexStr(entry^.rl_q_end,10),
HexStr(entry^.rl_q_start,11),',',
HexStr(entry^.rl_q_end,11),
' to ',
HexStr(entry1),',',
HexStr(entry1^.rl_q_start,10),',',
HexStr(entry1^.rl_q_end,10));
HexStr(entry1^.rl_q_start,11),',',
HexStr(entry1^.rl_q_end,11));
}
goto _out;
end;

View File

@ -298,7 +298,7 @@ begin
begin
if ((ppmap_get_prot(get_pageflt_addr(p),instr.mema_size) and VM_PROT_WRITE)<>0) then
begin
//Writeln('TRACK_WRITE:',HexStr(get_pageflt_addr(p),10));
//Writeln('TRACK_WRITE:',HexStr(get_pageflt_addr(p),11));
//trigger and restore
vm_map_track_trigger(p_proc.p_vmspace,

View File

@ -346,11 +346,11 @@ begin
if (PAGE_PROT=nil) then
begin
r:=md_mmap(PAGE_PROT,PAGE_MAP_COUNT,VM_RW);
r:=md_mmap(PAGE_PROT,PAGE_MAP_COUNT_SZ1,VM_RW);
if (r<>0) then
begin
Writeln('failed md_mmap(',HexStr(PAGE_MAP_COUNT,11),'):0x',HexStr(r,8));
Writeln('failed md_mmap(',HexStr(PAGE_MAP_COUNT_SZ1,11),'):0x',HexStr(r,8));
Assert(false,'pmap_pinit');
end;
end;
@ -733,7 +733,7 @@ function pmap_wlock(pmap :pmap_t;
start:vm_offset_t;
__end:vm_offset_t):Pointer; inline;
begin
//Writeln('pmap_wlock:',HexStr(start,10),'..',HexStr(__end,10));
//Writeln('pmap_wlock:',HexStr(start,11),'..',HexStr(__end,11));
Result:=vm_map_lock_range(pmap^.vm_map,start,__end,RL_LOCK_WRITE);
end;
@ -742,14 +742,14 @@ function pmap_rlock(pmap :pmap_t;
start:vm_offset_t;
__end:vm_offset_t):Pointer; inline;
begin
//Writeln('pmap_rlock:',HexStr(start,10),'..',HexStr(__end,10));
//Writeln('pmap_rlock:',HexStr(start,11),'..',HexStr(__end,11));
Result:=vm_map_lock_range(pmap^.vm_map,start,__end,RL_LOCK_READ);
end;
procedure pmap_unlock(pmap:pmap_t;cookie:Pointer); inline;
begin
//Writeln('pmap_unlock:',HexStr(p_rl_q_entry(cookie)^.rl_q_start,10),'..',HexStr(p_rl_q_entry(cookie)^.rl_q_end,10));
//Writeln('pmap_unlock:',HexStr(p_rl_q_entry(cookie)^.rl_q_start,11),'..',HexStr(p_rl_q_entry(cookie)^.rl_q_end,11));
vm_map_unlock_range(pmap^.vm_map,cookie);
end;
@ -1673,7 +1673,7 @@ begin
lock:=pmap_wlock(pmap,start,__end);
ppmap_unmark(start,__end);
ppmap_unmark(start,__end,VM_PROT_ALL);
vm_track_map_remove_memory(@pmap^.tr_map,start,__end);

View File

@ -16,8 +16,14 @@ const
PMAPP_SIZE =MD_PAGE_SIZE; //1 shl PMAPP_SHIFT; //4*1024
PMAPP_MASK =MD_PAGE_MASK; //PMAPP_SIZE-1;
PAGE_MAP_COUNT =(QWORD(VM_MAXUSER_ADDRESS) shr PMAPP_SHIFT);
PAGE_MAP_MASK =PAGE_MAP_COUNT-1;
PAGE_MAP_COUNT_ALL=(QWORD(VM_MAXUSER_ADDRESS) shr PMAPP_SHIFT);
PAGE_MAP_MASK_ALL =PAGE_MAP_COUNT_ALL-1;
PAGE_MAP_COUNT_LV1=PAGE_MAP_COUNT_ALL shr 16;
PAGE_MAP_COUNT_LV2=1 shl 16; //64KB
PAGE_MAP_COUNT_SZ1=PAGE_MAP_COUNT_LV1*SizeOf(Pointer);
PAGE_MAP_COUNT_SZ2=PAGE_MAP_COUNT_LV2*SizeOf(Byte);
PAGE_PROT_READ =VM_PROT_READ;
PAGE_PROT_WRITE =VM_PROT_WRITE;
@ -36,11 +42,10 @@ const
REMAP_PROT=2; //Ignore protect bit checking
var
PAGE_PROT:PBYTE=nil;
PAGE_PROT:PPBYTE=nil;
procedure ppmap_mark_rwx (start,__end:vm_offset_t;prots:Byte);
procedure ppmap_unmark (start,__end:vm_offset_t);
procedure ppmap_unmark_rwx(start,__end:vm_offset_t);
procedure ppmap_unmark (start,__end:vm_offset_t;prots:Byte);
procedure ppmap_track (start,__end:vm_offset_t;prots:Byte);
//procedure ppmap_untrack (start,__end:vm_offset_t;prots:Byte);
function ppmap_scan (start,__end:vm_offset_t):vm_offset_t;
@ -64,14 +69,54 @@ end;
function MAX_IDX(x:DWORD):DWORD; inline;
begin
if (x>PAGE_MAP_MASK) then
Result:=PAGE_MAP_MASK
if (x>PAGE_MAP_MASK_ALL) then
Result:=PAGE_MAP_MASK_ALL
else
Result:=x;
end;
function LV1_IDX(x:DWORD):DWORD; inline;
begin
Result:=x shr 16;
end;
function LV2_IDX(x:DWORD):DWORD; inline;
begin
Result:=x and (PAGE_MAP_COUNT_LV2-1);
end;
procedure prealloc(i:DWORD);
var
ptr:Pointer;
r:Integer;
begin
repeat
if (PAGE_PROT[LV1_IDX(i)]=nil) then
begin
ptr:=nil;
r:=md_mmap(ptr,PAGE_MAP_COUNT_SZ2,VM_RW);
Assert((r=0),'prealloc');
if (System.InterlockedCompareExchange(PAGE_PROT[LV1_IDX(i)],ptr,nil)=nil) then
begin
Exit;
end;
md_unmap(ptr,PAGE_MAP_COUNT_SZ2);
end else
begin
Exit;
end;
until false;
end;
procedure ppmap_mark_rwx(start,__end:vm_offset_t;prots:Byte);
var
P:PByte;
clear:Byte;
begin
prots:=prots and PAGE_PROT_RWX;
@ -82,15 +127,18 @@ begin
__end:=MAX_IDX(__end);
while (start<__end) do
begin
atomic_clear_byte(@PAGE_PROT[start],clear);
atomic_set_byte (@PAGE_PROT[start],prots);
//PAGE_PROT[start]:=prots;
//
prealloc(start);
//
P:=@PAGE_PROT[LV1_IDX(start)][LV2_IDX(start)];
atomic_clear_byte(P,clear);
atomic_set_byte (P,prots);
Inc(start);
end;
WriteBarrier;
end;
procedure ppmap_unmark(start,__end:vm_offset_t);
procedure ppmap_unmark(start,__end:vm_offset_t;prots:Byte);
begin
start:=OFF_TO_IDX(start);
__end:=OFF_TO_IDX(__end);
@ -98,21 +146,10 @@ begin
__end:=MAX_IDX(__end);
while (start<__end) do
begin
//PAGE_PROT[start]:=0;
Inc(start);
end;
WriteBarrier;
end;
procedure ppmap_unmark_rwx(start,__end:vm_offset_t);
begin
start:=OFF_TO_IDX(start);
__end:=OFF_TO_IDX(__end);
start:=MAX_IDX(start);
__end:=MAX_IDX(__end);
while (start<__end) do
begin
atomic_clear_byte(@PAGE_PROT[start],PAGE_PROT_RWX);
if (PAGE_PROT[LV1_IDX(start)]<>nil) then
begin
atomic_clear_byte(@PAGE_PROT[LV1_IDX(start)][LV2_IDX(start)],prots);
end;
Inc(start);
end;
WriteBarrier;
@ -120,6 +157,7 @@ end;
procedure ppmap_track(start,__end:vm_offset_t;prots:Byte);
var
P:PByte;
s_prots:Byte;
c_prots:Byte;
begin
@ -132,8 +170,12 @@ begin
__end:=MAX_IDX(__end);
while (start<__end) do
begin
atomic_set_byte (@PAGE_PROT[start],s_prots);
atomic_clear_byte(@PAGE_PROT[start],c_prots);
//
prealloc(start);
//
P:=@PAGE_PROT[LV1_IDX(start)][LV2_IDX(start)];
atomic_set_byte (P,s_prots);
atomic_clear_byte(P,c_prots);
Inc(start);
end;
WriteBarrier;
@ -156,6 +198,21 @@ begin
end;
}
function _get_prot(addr:DWORD):Byte; inline;
begin
if (addr>PAGE_MAP_MASK_ALL) then
begin
Result:=0
end else
if (PAGE_PROT[LV1_IDX(addr)]=nil) then
begin
Result:=0
end else
begin
Result:=PAGE_PROT[LV1_IDX(addr)][LV2_IDX(addr)];
end;
end;
function ppmap_scan(start,__end:vm_offset_t):vm_offset_t;
var
b,v:Byte;
@ -167,12 +224,12 @@ begin
ReadBarrier;
b:=PAGE_PROT[start];
b:=_get_prot(start);
Inc(start);
while (start<__end) do
begin
v:=PAGE_PROT[start];
v:=_get_prot(start);
if (b<>v) then
begin
@ -199,12 +256,12 @@ begin
ReadBarrier;
b:=(PAGE_PROT[start] and PAGE_PROT_RWX);
b:=(_get_prot(start) and PAGE_PROT_RWX);
Inc(start);
while (start<__end) do
begin
v:=(PAGE_PROT[start] and PAGE_PROT_RWX);
v:=(_get_prot(start) and PAGE_PROT_RWX);
if (b<>v) then
begin
@ -222,14 +279,7 @@ end;
function ppmap_get_prot(addr:vm_offset_t):Byte;
begin
addr:=OFF_TO_IDX(addr);
if (addr>PAGE_MAP_MASK) then
begin
Result:=0
end else
begin
Result:=PAGE_PROT[addr];
end;
Result:=_get_prot(OFF_TO_IDX(addr));
end;
function ppmap_get_prot(addr,size:vm_offset_t):Byte;

View File

@ -2815,7 +2815,7 @@ begin
entry^.eflags:=entry^.eflags or MAP_ENTRY_IN_TRANSITION;
//Writeln('+MAP_ENTRY_IN_TRANSITION:0x',HexStr(entry^.start,10),'..',HexStr(entry^.__end,10));
//Writeln('+MAP_ENTRY_IN_TRANSITION:0x',HexStr(entry^.start,11),'..',HexStr(entry^.__end,11));
//entry^.wiring_thread:=curthread;
@ -2916,7 +2916,7 @@ _done:
entry^.eflags:=entry^.eflags and (not MAP_ENTRY_IN_TRANSITION);
//entry^.wiring_thread:=nil;
//Writeln('-MAP_ENTRY_IN_TRANSITION:0x',HexStr(entry^.start,10),'..',HexStr(entry^.__end,10));
//Writeln('-MAP_ENTRY_IN_TRANSITION:0x',HexStr(entry^.start,11),'..',HexStr(entry^.__end,11));
if (entry^.eflags and MAP_ENTRY_NEEDS_WAKEUP)<>0 then
begin
@ -3084,7 +3084,7 @@ begin
entry^.eflags:=entry^.eflags or MAP_ENTRY_IN_TRANSITION;
//entry^.wiring_thread:=curthread;
//Writeln('+MAP_ENTRY_IN_TRANSITION:0x',HexStr(entry^.start,10),'..',HexStr(entry^.__end,10));
//Writeln('+MAP_ENTRY_IN_TRANSITION:0x',HexStr(entry^.start,11),'..',HexStr(entry^.__end,11));
if ((entry^.protection and VM_PROT_ALL)=0)
or ((entry^.protection and prot)<>prot) then
@ -3331,7 +3331,7 @@ _next_entry_done:
entry^.eflags:=entry^.eflags and (not (MAP_ENTRY_IN_TRANSITION or MAP_ENTRY_WIRE_SKIPPED));
//entry^.wiring_thread:=nil;
//Writeln('-MAP_ENTRY_IN_TRANSITION:0x',HexStr(entry^.start,10),'..',HexStr(entry^.__end,10));
//Writeln('-MAP_ENTRY_IN_TRANSITION:0x',HexStr(entry^.start,11),'..',HexStr(entry^.__end,11));
if ((entry^.eflags and MAP_ENTRY_NEEDS_WAKEUP)<>0) then
begin

View File

@ -961,18 +961,18 @@ _map:
if (stack_addr<>nil) then
begin
//Do you really need it?
vm_map_set_name_str(map,addr,size + addr,'anon:'+HexStr(QWORD(stack_addr),10));
vm_map_set_name_str(map,addr,size + addr,'anon:'+HexStr(QWORD(stack_addr),11));
end;
Writeln('0x',HexStr(QWORD(stack_addr),10),'->',
'sys_mmap(','0x',HexStr(QWORD(vaddr),10),
',0x',HexStr(vlen,10),
Writeln('0x',HexStr(QWORD(stack_addr),11),'->',
'sys_mmap(','0x',HexStr(QWORD(vaddr),11),
',0x',HexStr(vlen,11),
',0x',HexStr(prot,1),
',0x',HexStr(flags,6),
',',fd,
',0x',HexStr(pos,10),
',0x',HexStr(pos,11),
'):',Integer(Result),
':0x',HexStr(td^.td_retval[0],10),'..0x',HexStr(td^.td_retval[0]+size,10));
':0x',HexStr(td^.td_retval[0],11),'..0x',HexStr(td^.td_retval[0]+size,11));
_done:
@ -1015,8 +1015,8 @@ begin
Result:=vm_map_remove(map, qword(addr), qword(addr) + size);
Writeln('sys_munmap(','0x',HexStr(QWORD(addr),10),
',0x',HexStr(len,10),
Writeln('sys_munmap(','0x',HexStr(QWORD(addr),11),
',0x',HexStr(len,11),
'):',Integer(Result)
);
@ -1216,8 +1216,8 @@ begin
vm_map_set_name(map,start,__end,@_name);
Writeln('sys_mname(','0x',HexStr(QWORD(addr),10),
',0x',HexStr(len,10),
Writeln('sys_mname(','0x',HexStr(QWORD(addr),11),
',0x',HexStr(len,11),
',','"',name,'"',
')'
);

View File

@ -43,9 +43,6 @@ const
_PROC_AREA_START_1 =QWORD($00010000000); //(original:0x400000-0x80000000)
_PROC_AREA___END =QWORD($00070000000);
WIN_MAX_MOVED_STACK =QWORD($40000000000);
WIN_SHARED_ADDR =QWORD($40000000000);
SCE_REPLAY_EXEC_START=QWORD($00fc0000000);
DL_AREA_START =QWORD($00080000000); //(original:0x80000000-0x200000000)
@ -62,13 +59,18 @@ const
SCE_KERNEL_GNMDRIVER =QWORD($00FE0000000);
_VM_MINUSER_ADDRESS =QWORD($00010000000); //(original:$000000000000)
VM_MAXUSER_ADDRESS =QWORD($10000000000); //(original:$800000000000) MAP_AREA_END=0xfc00000000
VM_MAXUSER_ADDRESS =QWORD($80000000000); //(original:$800000000000) MAP_AREA_END=0xfc00000000
VM_MIN_GPU_ADDRESS =QWORD($10000000000);
VM_MAX_GPU_ADDRESS =QWORD($20000000000); //Virtual mirror
VM_MIN_GPU_ADDRESS =QWORD($90000000000);
VM_MAX_GPU_ADDRESS =QWORD($A0000000000); //Virtual mirror
VM_MIN_DEV_ADDRESS =QWORD($20000000000);
VM_MAX_DEV_ADDRESS =QWORD($20000010000); //64KB
VM_MIN_DEV_ADDRESS =QWORD($A0000000000);
VM_MAX_DEV_ADDRESS =QWORD($A0000010000); //64KB
WIN_REBASE_ADDR =QWORD($B0000000000); //fp_rebase
WIN_MAX_MOVED_STACK =QWORD($C0000000000);
WIN_SHARED_ADDR =QWORD($C0000000000);
VM_DMEM_SIZE =$180000000; // 6144MB