mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
b2140beae3
commit
e43826e699
|
@ -24,6 +24,7 @@ uses
|
|||
vm_map,
|
||||
vm_pmap,
|
||||
vm_pmap_prot,
|
||||
vm_tracking_map,
|
||||
kern_proc,
|
||||
kern_jit_dynamic;
|
||||
|
||||
|
@ -110,7 +111,7 @@ begin
|
|||
Result:=VM_PROT_NONE;
|
||||
case v of
|
||||
0:Result:=VM_PROT_READ;
|
||||
2:Result:=VM_PROT_WRITE;
|
||||
1:Result:=VM_PROT_WRITE;
|
||||
8:Result:=VM_PROT_EXECUTE;
|
||||
end;
|
||||
end;
|
||||
|
@ -273,7 +274,8 @@ begin
|
|||
|
||||
if pmap_danger_zone(vm_map_t(p_proc.p_vmspace)^.pmap,
|
||||
get_pageflt_addr(p),
|
||||
256) then
|
||||
256 //TODO: access len
|
||||
) then
|
||||
begin
|
||||
Exit(EXCEPTION_CONTINUE_EXECUTION);
|
||||
end;
|
||||
|
@ -281,6 +283,7 @@ begin
|
|||
case get_pageflt_err(p) of
|
||||
VM_PROT_READ:
|
||||
begin
|
||||
//TODO: access len
|
||||
if ((ppmap_get_prot(get_pageflt_addr(p),256) and VM_PROT_READ)<>0) then
|
||||
begin
|
||||
Writeln(stderr,'Unhandled VM_PROT_READ');
|
||||
|
@ -288,9 +291,19 @@ begin
|
|||
end;
|
||||
VM_PROT_WRITE:
|
||||
begin
|
||||
Writeln('TRACK_WRITE:',HexStr(get_pageflt_addr(p),10));
|
||||
|
||||
//TODO: access len
|
||||
if ((ppmap_get_prot(get_pageflt_addr(p),256) and VM_PROT_WRITE)<>0) then
|
||||
begin
|
||||
Writeln(stderr,'Unhandled VM_PROT_WRITE');
|
||||
//trigger and restore
|
||||
vm_map_track_trigger(p_proc.p_vmspace,
|
||||
get_pageflt_addr(p),
|
||||
get_pageflt_addr(p)+256, //TODO: access len
|
||||
nil,
|
||||
M_CPU_WRITE);
|
||||
//
|
||||
Exit(EXCEPTION_CONTINUE_EXECUTION);
|
||||
end;
|
||||
end;
|
||||
else;
|
||||
|
|
|
@ -115,6 +115,10 @@ procedure pmap_prot_track(pmap :pmap_t;
|
|||
__end:vm_offset_t;
|
||||
prots:Byte);
|
||||
|
||||
procedure pmap_prot_restore(pmap :pmap_t;
|
||||
start:vm_offset_t;
|
||||
__end:vm_offset_t);
|
||||
|
||||
procedure pmap_madvise(pmap :pmap_t;
|
||||
obj :vm_object_t;
|
||||
start :vm_offset_t;
|
||||
|
@ -1085,6 +1089,19 @@ begin
|
|||
TRACK_PROT or REMAP_PROT);
|
||||
end;
|
||||
|
||||
procedure pmap_prot_restore(pmap :pmap_t;
|
||||
start:vm_offset_t;
|
||||
__end:vm_offset_t);
|
||||
begin
|
||||
start:=start and (not PMAPP_MASK);
|
||||
__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
|
||||
|
||||
vm_nt_map_prot_fix(@pmap^.nt_map,
|
||||
start,
|
||||
__end,
|
||||
REMAP_PROT);
|
||||
end;
|
||||
|
||||
procedure pmap_madvise(pmap :pmap_t;
|
||||
obj :vm_object_t;
|
||||
start :vm_offset_t;
|
||||
|
|
|
@ -3425,6 +3425,11 @@ end;
|
|||
function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer;mode:T_TRIGGER_MODE):Integer;
|
||||
begin
|
||||
Result:=vm_track_map_trigger(@map^.pmap^.tr_map,start,__end,exclude,mode);
|
||||
|
||||
if (mode=M_CPU_WRITE) then
|
||||
begin
|
||||
pmap_prot_restore(map^.pmap,start,__end);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure vm_map_track_restore(map:vm_map_t;tobj:Pointer);
|
||||
|
|
|
@ -499,7 +499,7 @@ begin
|
|||
vm_track_object_reference(obj);
|
||||
|
||||
//update prot
|
||||
if (pmap=nil) then //if not copy_obj_list
|
||||
if (pmap<>nil) then //if not copy_obj_list
|
||||
begin
|
||||
_vm_track_entry_change_prot(pmap,entry,obj^.prot,0);
|
||||
end;
|
||||
|
|
Loading…
Reference in New Issue