mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
d63886c189
commit
a3258b4c1a
|
@ -208,16 +208,16 @@ begin
|
|||
rmem_map_unlock(@rmap);
|
||||
end;
|
||||
|
||||
function kern_mmap_dmem(map :vm_map_t;
|
||||
addr :p_vm_offset_t;
|
||||
phaddr :QWORD;
|
||||
vaddr :QWORD;
|
||||
length :QWORD;
|
||||
mtype :DWORD;
|
||||
prot :DWORD;
|
||||
align :QWORD;
|
||||
flags :DWORD;
|
||||
stack_addr:Pointer):Integer;
|
||||
function kern_mmap_dmem(map :vm_map_t;
|
||||
addr :p_vm_offset_t;
|
||||
phaddr:QWORD;
|
||||
vaddr :QWORD;
|
||||
length:QWORD;
|
||||
mtype :DWORD;
|
||||
prot :DWORD;
|
||||
align :QWORD;
|
||||
flags :DWORD;
|
||||
anon :Pointer):Integer;
|
||||
label
|
||||
_fixed,
|
||||
_rmap_insert;
|
||||
|
@ -292,7 +292,15 @@ begin
|
|||
|
||||
vm_object_reference(dmap.vobj);
|
||||
|
||||
err:=vm_map_insert(map, dmap.vobj, phaddr, vaddr, v_end, prot, VM_PROT_ALL, cow, ((p_proc.p_dmem_aliasing and 3)<>0));
|
||||
err:=vm_map_insert(map,
|
||||
dmap.vobj,
|
||||
phaddr,
|
||||
vaddr, v_end,
|
||||
prot, VM_PROT_ALL,
|
||||
cow,
|
||||
anon,
|
||||
((p_proc.p_dmem_aliasing and 3)<>0)
|
||||
);
|
||||
|
||||
if (err=0) then
|
||||
begin
|
||||
|
@ -511,7 +519,8 @@ begin
|
|||
|
||||
td^.td_retval[0]:=addr;
|
||||
|
||||
Writeln('sys_mmap_dmem(','0x',HexStr(QWORD(vaddr),10),
|
||||
Writeln('0x',HexStr(QWORD(stack_addr),10),'->',
|
||||
'sys_mmap_dmem(','0x',HexStr(QWORD(vaddr),10),
|
||||
',0x',HexStr(length,10),
|
||||
',0x',HexStr(mtype,1),
|
||||
',0x',HexStr(prot,1),
|
||||
|
@ -738,7 +747,7 @@ begin
|
|||
|
||||
Writeln('sys_virtual_query:',HexStr(addr),' ',flags);
|
||||
|
||||
QWORD(addr):=QWORD(addr) and $ffffffffffffc000;
|
||||
QWORD(addr):=QWORD(addr) and QWORD($ffffffffffffc000);
|
||||
|
||||
map:=p_proc.p_vmspace;
|
||||
|
||||
|
@ -789,7 +798,10 @@ begin
|
|||
|
||||
vm_map_lock(map);
|
||||
|
||||
if not vm_map_lookup_entry(map,QWORD(addr),@entry) then
|
||||
if vm_map_lookup_entry(map,QWORD(addr),@entry) then
|
||||
begin
|
||||
//Writeln('found:',HexStr(addr),'->',HexStr(entry^.start,16));
|
||||
end else
|
||||
begin
|
||||
if ((flags and SCE_KERNEL_VQ_FIND_NEXT)<>0) then
|
||||
begin
|
||||
|
@ -898,6 +910,17 @@ begin
|
|||
|
||||
end;
|
||||
|
||||
{
|
||||
Writeln('[qinfo]:',#13#10' pstart:',HexStr(qinfo.pstart)
|
||||
,#13#10' p__end:',HexStr(qinfo.p__end)
|
||||
,#13#10' offset:',HexStr(qinfo.offset,16)
|
||||
,#13#10' protec:',HexStr(qinfo.protection,2)
|
||||
,#13#10' mtypes:',qinfo.memoryType
|
||||
,#13#10' name :',qinfo.name
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Result:=copyout(@qinfo,info,size);
|
||||
end;
|
||||
|
||||
|
|
|
@ -2856,7 +2856,7 @@ begin
|
|||
|
||||
vm_map_delete(map,vaddr_lo,vaddr_hi,True);
|
||||
|
||||
error:=vm_map_insert(map,nil,0,vaddr_lo,vaddr_hi,VM_PROT_RW,VM_PROT_RWX,MAP_COW_NO_BUDGET,false);
|
||||
error:=vm_map_insert(map,nil,0,vaddr_lo,vaddr_hi,VM_PROT_RW,VM_PROT_RWX,MAP_COW_NO_BUDGET,nil,false);
|
||||
if (error<>0) then
|
||||
begin
|
||||
vm_map_unlock(map);
|
||||
|
|
|
@ -24,6 +24,8 @@ type
|
|||
|
||||
vm_map_object=vm_object_t;
|
||||
|
||||
t_entry_name=array[0..31] of AnsiChar;
|
||||
|
||||
p_vm_map_entry_t=^vm_map_entry_t;
|
||||
vm_map_entry_t=^vm_map_entry;
|
||||
vm_map_entry=packed record
|
||||
|
@ -43,7 +45,7 @@ type
|
|||
max_protection:vm_prot_t; // maximum protection
|
||||
inheritance :vm_inherit_t; // inheritance
|
||||
budget_id :shortint; // budget/ptype id
|
||||
name :array[0..31] of Char; // entry name
|
||||
name :t_entry_name; // entry name
|
||||
anon_addr :Pointer; // source code address
|
||||
entry_id :QWORD; // order id
|
||||
end;
|
||||
|
@ -189,6 +191,7 @@ function vm_map_insert(
|
|||
prot :vm_prot_t;
|
||||
max :vm_prot_t;
|
||||
cow :Integer;
|
||||
anon :Pointer;
|
||||
alias :Boolean):Integer;
|
||||
|
||||
function vm_map_findspace(map :vm_map_t;
|
||||
|
@ -242,7 +245,8 @@ function vm_map_find(map :vm_map_t;
|
|||
find_space:Integer;
|
||||
prot :vm_prot_t;
|
||||
max :vm_prot_t;
|
||||
cow :Integer):Integer;
|
||||
cow :Integer;
|
||||
anon :Pointer):Integer;
|
||||
|
||||
procedure vm_map_simplify_entry(map:vm_map_t;entry:vm_map_entry_t);
|
||||
|
||||
|
@ -254,14 +258,16 @@ function vm_map_fixed(map :vm_map_t;
|
|||
prot :vm_prot_t;
|
||||
max :vm_prot_t;
|
||||
cow :Integer;
|
||||
overwr :Integer):Integer;
|
||||
overwr :Integer;
|
||||
anon :Pointer):Integer;
|
||||
|
||||
function vm_map_stack(map :vm_map_t;
|
||||
addrbos :vm_offset_t;
|
||||
max_ssize:vm_size_t;
|
||||
prot :vm_prot_t;
|
||||
max :vm_prot_t;
|
||||
cow :Integer):Integer;
|
||||
cow :Integer;
|
||||
anon :Pointer):Integer;
|
||||
|
||||
function vm_map_growstack(map:vm_map_t;addr:vm_offset_t):Integer;
|
||||
function vmspace_exec(minuser,maxuser:vm_offset_t):Integer;
|
||||
|
@ -275,7 +281,7 @@ function vm_map_remove(map:vm_map_t;start:vm_offset_t;__end:vm_offset_t):Intege
|
|||
|
||||
procedure vm_map_set_name(map:vm_map_t;start,__end:vm_offset_t;name:PChar);
|
||||
procedure vm_map_set_name_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar);
|
||||
procedure vm_map_set_name_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar;i:vm_inherit_t);
|
||||
procedure vm_map_set_info_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar;i:vm_inherit_t);
|
||||
|
||||
procedure vm_map_track_insert(map:vm_map_t;tobj:Pointer);
|
||||
procedure vm_map_track_remove(map:vm_map_t;tobj:Pointer);
|
||||
|
@ -406,8 +412,8 @@ begin
|
|||
vm_map_lock(map);
|
||||
For i:=0 to High(pmap_mem)-1 do
|
||||
begin
|
||||
vm_map_insert (map, nil, 0, pmap_mem[i].__end, pmap_mem[i+1].start, 0, 0, -1, false);
|
||||
vm_map_set_name_locked(map, pmap_mem[i].__end, pmap_mem[i+1].start, '#hole', VM_INHERIT_HOLE);
|
||||
vm_map_insert (map, nil, 0, pmap_mem[i].__end, pmap_mem[i+1].start, 0, 0, -1, nil, false);
|
||||
vm_map_set_info_locked(map, pmap_mem[i].__end, pmap_mem[i+1].start, '#hole', VM_INHERIT_HOLE);
|
||||
end;
|
||||
vm_map_unlock(map);
|
||||
end;
|
||||
|
@ -1004,6 +1010,7 @@ function vm_map_insert(
|
|||
prot :vm_prot_t;
|
||||
max :vm_prot_t;
|
||||
cow :Integer;
|
||||
anon :Pointer;
|
||||
alias :Boolean):Integer;
|
||||
label
|
||||
_budget,
|
||||
|
@ -1229,6 +1236,8 @@ charged:
|
|||
new_entry^.entry_id:=map^.entry_id;
|
||||
Inc(map^.entry_id);
|
||||
|
||||
new_entry^.anon_addr:=anon;
|
||||
|
||||
{
|
||||
* Insert the new entry into the list
|
||||
}
|
||||
|
@ -1390,7 +1399,8 @@ function vm_map_fixed(map :vm_map_t;
|
|||
prot :vm_prot_t;
|
||||
max :vm_prot_t;
|
||||
cow :Integer;
|
||||
overwr :Integer):Integer;
|
||||
overwr :Integer;
|
||||
anon :Pointer):Integer;
|
||||
var
|
||||
__end:vm_offset_t;
|
||||
begin
|
||||
|
@ -1401,7 +1411,7 @@ begin
|
|||
begin
|
||||
vm_map_delete(map, start, __end, True);
|
||||
end;
|
||||
Result:=vm_map_insert(map, vm_obj, offset, start, __end, prot, max, cow, false);
|
||||
Result:=vm_map_insert(map, vm_obj, offset, start, __end, prot, max, cow, anon, false);
|
||||
vm_map_unlock(map);
|
||||
end;
|
||||
|
||||
|
@ -1422,7 +1432,8 @@ function vm_map_find(map :vm_map_t;
|
|||
find_space:Integer;
|
||||
prot :vm_prot_t;
|
||||
max :vm_prot_t;
|
||||
cow :Integer):Integer;
|
||||
cow :Integer;
|
||||
anon :Pointer):Integer;
|
||||
label
|
||||
again;
|
||||
var
|
||||
|
@ -1479,7 +1490,7 @@ again:
|
|||
|
||||
start:=addr^;
|
||||
end;
|
||||
Result:=vm_map_insert(map, vm_obj, offset, start, start + length, prot, max, cow, false);
|
||||
Result:=vm_map_insert(map, vm_obj, offset, start, start + length, prot, max, cow, anon, false);
|
||||
until not ((Result=KERN_NO_SPACE) and
|
||||
(find_space<>VMFS_NO_SPACE) and
|
||||
(find_space<>VMFS_ANY_SPACE));
|
||||
|
@ -2584,7 +2595,8 @@ function vm_map_stack(map :vm_map_t;
|
|||
max_ssize:vm_size_t;
|
||||
prot :vm_prot_t;
|
||||
max :vm_prot_t;
|
||||
cow :Integer):Integer;
|
||||
cow :Integer;
|
||||
anon :Pointer):Integer;
|
||||
var
|
||||
new_entry, prev_entry:vm_map_entry_t;
|
||||
bot, top:vm_offset_t;
|
||||
|
@ -2677,7 +2689,7 @@ begin
|
|||
end;
|
||||
|
||||
top:=bot + init_ssize;
|
||||
rv:=vm_map_insert(map, nil, 0, bot, top, prot, max, cow, false);
|
||||
rv:=vm_map_insert(map, nil, 0, bot, top, prot, max, cow, anon, false);
|
||||
|
||||
{ Now set the avail_ssize amount. }
|
||||
if (rv=KERN_SUCCESS) then
|
||||
|
@ -2902,7 +2914,7 @@ begin
|
|||
end;
|
||||
|
||||
rv:=vm_map_insert(map, nil, 0, addr, stack_entry^.start,
|
||||
next_entry^.protection, next_entry^.max_protection, 0, false);
|
||||
next_entry^.protection, next_entry^.max_protection, 0, next_entry^.anon_addr, false);
|
||||
|
||||
{ Adjust the available stack space by the amount we grew. }
|
||||
if (rv=KERN_SUCCESS) then
|
||||
|
@ -3239,6 +3251,7 @@ procedure vm_map_set_name_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar
|
|||
var
|
||||
current:vm_map_entry_t;
|
||||
entry:vm_map_entry_t;
|
||||
simpl:vm_map_entry_t;
|
||||
begin
|
||||
if (start=__end) then
|
||||
begin
|
||||
|
@ -3258,17 +3271,36 @@ begin
|
|||
current:=entry;
|
||||
while ((current<>@map^.header) and (current^.start<__end)) do
|
||||
begin
|
||||
|
||||
if ((current^.eflags and MAP_ENTRY_IS_SUB_MAP)=0) then
|
||||
if (current^.vm_obj<>nil) then
|
||||
if (current^.vm_obj^.otype=OBJT_BLOCKPOOL) then
|
||||
begin
|
||||
Assert(false,'TODO');
|
||||
current:=current^.next;
|
||||
Continue;
|
||||
end;
|
||||
|
||||
vm_map_clip_end(map,current,__end);
|
||||
|
||||
current^.name:=Default(t_entry_name);
|
||||
MoveChar0(name^,current^.name,32);
|
||||
|
||||
vm_map_simplify_entry(map, current);
|
||||
if (p_proc.p_sdk_version > $6ffffff) then
|
||||
begin
|
||||
simpl:=current;
|
||||
end else
|
||||
begin
|
||||
simpl:=entry;
|
||||
end;
|
||||
|
||||
vm_map_simplify_entry(map, simpl);
|
||||
|
||||
current:=current^.next;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure vm_map_set_name_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar;i:vm_inherit_t);
|
||||
procedure vm_map_set_info_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar;i:vm_inherit_t);
|
||||
var
|
||||
current:vm_map_entry_t;
|
||||
entry:vm_map_entry_t;
|
||||
|
@ -3293,6 +3325,7 @@ begin
|
|||
begin
|
||||
vm_map_clip_end(map,current,__end);
|
||||
|
||||
current^.name:=Default(t_entry_name);
|
||||
MoveChar0(name^,current^.name,32);
|
||||
current^.inheritance:=i;
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ function vm_mmap2(map :vm_map_t;
|
|||
handle_type:objtype_t;
|
||||
handle :Pointer;
|
||||
foff :vm_ooffset_t;
|
||||
stack_addr :Pointer):Integer;
|
||||
anon :Pointer):Integer;
|
||||
|
||||
function mirror_map (paddr,psize:QWORD):Pointer;
|
||||
procedure mirror_unmap(base:Pointer;size:QWORD);
|
||||
|
@ -408,7 +408,7 @@ function vm_mmap2(map :vm_map_t;
|
|||
handle_type:objtype_t;
|
||||
handle :Pointer;
|
||||
foff :vm_ooffset_t;
|
||||
stack_addr :Pointer):Integer;
|
||||
anon :Pointer):Integer;
|
||||
var
|
||||
obj:vm_object_t;
|
||||
docow,error,findspace,rv:Integer;
|
||||
|
@ -533,7 +533,10 @@ begin
|
|||
|
||||
if ((flags and MAP_STACK)<>0) then
|
||||
begin
|
||||
rv:=vm_map_stack(map, addr^, size, prot, maxprot, docow or MAP_STACK_GROWS_DOWN);
|
||||
rv:=vm_map_stack(map, addr^, size,
|
||||
prot, maxprot,
|
||||
docow or MAP_STACK_GROWS_DOWN,
|
||||
anon);
|
||||
end else
|
||||
if (fitit) then
|
||||
begin
|
||||
|
@ -548,11 +551,17 @@ begin
|
|||
begin
|
||||
findspace:=VMFS_OPTIMAL_SPACE;
|
||||
end;
|
||||
rv:=vm_map_find(map, obj, foff, addr, size, findspace, prot, maxprot, docow);
|
||||
rv:=vm_map_find(map, obj, foff, addr, size, findspace,
|
||||
prot, maxprot,
|
||||
docow,
|
||||
anon);
|
||||
end else
|
||||
begin
|
||||
rv:=vm_map_fixed(map, obj, foff, addr^, size, prot, maxprot, docow,
|
||||
ord((flags and MAP_NO_OVERWRITE)=0));
|
||||
rv:=vm_map_fixed(map, obj, foff, addr^, size,
|
||||
prot, maxprot,
|
||||
docow,
|
||||
ord((flags and MAP_NO_OVERWRITE)=0),
|
||||
anon);
|
||||
end;
|
||||
|
||||
if (rv=KERN_SUCCESS) then
|
||||
|
@ -905,7 +914,8 @@ _map:
|
|||
vm_map_set_name_str(map,addr,size + addr,'anon:'+HexStr(QWORD(stack_addr),10));
|
||||
end;
|
||||
|
||||
Writeln('sys_mmap(','0x',HexStr(QWORD(vaddr),10),
|
||||
Writeln('0x',HexStr(QWORD(stack_addr),10),'->',
|
||||
'sys_mmap(','0x',HexStr(QWORD(vaddr),10),
|
||||
',0x',HexStr(vlen,10),
|
||||
',0x',HexStr(prot,1),
|
||||
',0x',HexStr(flags,6),
|
||||
|
@ -953,7 +963,12 @@ begin
|
|||
Exit(EINVAL);
|
||||
end;
|
||||
|
||||
vm_map_remove(map, qword(addr), qword(addr) + size);
|
||||
Result:=vm_map_remove(map, qword(addr), qword(addr) + size);
|
||||
|
||||
Writeln('sys_munmap(','0x',HexStr(QWORD(addr),10),
|
||||
',0x',HexStr(len,10),
|
||||
'):',Integer(Result)
|
||||
);
|
||||
|
||||
// vm_map_remove returns nothing but KERN_SUCCESS anyway
|
||||
Exit(0);
|
||||
|
@ -1111,6 +1126,13 @@ begin
|
|||
__end:=round_page(vm_offset_t(addr) + len);
|
||||
|
||||
vm_map_set_name(map,start,__end,@_name);
|
||||
|
||||
Writeln('sys_mname(','0x',HexStr(QWORD(addr),10),
|
||||
',0x',HexStr(len,10),
|
||||
',',name,
|
||||
')'
|
||||
);
|
||||
|
||||
end;
|
||||
|
||||
function sys_query_memory_protection(addr:Pointer;info:Pointer):Integer;
|
||||
|
|
Loading…
Reference in New Issue