This commit is contained in:
Pavel 2024-12-09 20:27:58 +03:00
parent d63886c189
commit a3258b4c1a
4 changed files with 117 additions and 39 deletions

View File

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

View File

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

View File

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

View File

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