mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
9c1e69540c
commit
975ea9b52b
|
@ -96,6 +96,21 @@ type
|
||||||
procedure remove_stream(stream:p_pm4_stream);
|
procedure remove_stream(stream:p_pm4_stream);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
PvCmdFreeNode=^TvCmdFreeNode;
|
||||||
|
TvCmdFreeNode=record
|
||||||
|
entry:STAILQ_ENTRY;
|
||||||
|
FCmd :TVkCommandBuffer;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TvCmdCachedPool=class(TvCmdPool)
|
||||||
|
FMemCache:STAILQ_HEAD; //PvCmdFreeNode
|
||||||
|
FDeffered:STAILQ_HEAD; //PvCmdFreeNode
|
||||||
|
FTrimCount:Integer;
|
||||||
|
Constructor Create(FFamily:TVkUInt32);
|
||||||
|
procedure Free(cmd:TVkCommandBuffer); register; override;
|
||||||
|
procedure Trim; register; override;
|
||||||
|
end;
|
||||||
|
|
||||||
t_pool_line=array[0..3] of TvCustomCmdPool;
|
t_pool_line=array[0..3] of TvCustomCmdPool;
|
||||||
t_pool_cache=object
|
t_pool_cache=object
|
||||||
queue:TvQueue;
|
queue:TvQueue;
|
||||||
|
@ -109,6 +124,8 @@ type
|
||||||
entry :TAILQ_ENTRY; //stall
|
entry :TAILQ_ENTRY; //stall
|
||||||
stream:p_pm4_stream;
|
stream:p_pm4_stream;
|
||||||
//
|
//
|
||||||
|
function OnAlloc(size:Ptruint):Pointer; register; override;
|
||||||
|
Procedure OnFree (P:Pointer ); register; override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
t_me_render_context=object
|
t_me_render_context=object
|
||||||
|
@ -130,6 +147,7 @@ type
|
||||||
procedure BeginCmdBuffer;
|
procedure BeginCmdBuffer;
|
||||||
procedure FinishCmdBuffer;
|
procedure FinishCmdBuffer;
|
||||||
function CmdStatus(i:t_pm4_stream_type):TVkResult;
|
function CmdStatus(i:t_pm4_stream_type):TVkResult;
|
||||||
|
procedure PingCmd;
|
||||||
function WaitConfirmOrSwitch:Boolean;
|
function WaitConfirmOrSwitch:Boolean;
|
||||||
//
|
//
|
||||||
procedure switch_task;
|
procedure switch_task;
|
||||||
|
@ -146,7 +164,8 @@ uses
|
||||||
vmparam,
|
vmparam,
|
||||||
kern_dmem,
|
kern_dmem,
|
||||||
kern_proc,
|
kern_proc,
|
||||||
vm_map;
|
vm_map,
|
||||||
|
vm_tracking_map;
|
||||||
|
|
||||||
procedure StartFrameCapture;
|
procedure StartFrameCapture;
|
||||||
begin
|
begin
|
||||||
|
@ -350,22 +369,6 @@ end;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
type
|
|
||||||
PvCmdFreeNode=^TvCmdFreeNode;
|
|
||||||
TvCmdFreeNode=record
|
|
||||||
entry:STAILQ_ENTRY;
|
|
||||||
FCmd :TVkCommandBuffer;
|
|
||||||
end;
|
|
||||||
|
|
||||||
TvCmdCachedPool=class(TvCmdPool)
|
|
||||||
FMemCache:STAILQ_HEAD; //PvCmdFreeNode
|
|
||||||
FDeffered:STAILQ_HEAD; //PvCmdFreeNode
|
|
||||||
FTrimCount:Integer;
|
|
||||||
Constructor Create(FFamily:TVkUInt32);
|
|
||||||
procedure Free(cmd:TVkCommandBuffer); register; override;
|
|
||||||
procedure Trim; register; override;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Constructor TvCmdCachedPool.Create(FFamily:TVkUInt32);
|
Constructor TvCmdCachedPool.Create(FFamily:TVkUInt32);
|
||||||
begin
|
begin
|
||||||
inherited;
|
inherited;
|
||||||
|
@ -446,6 +449,20 @@ begin
|
||||||
Result:=last;
|
Result:=last;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
function TvStreamCmdBuffer.OnAlloc(size:Ptruint):Pointer; register;
|
||||||
|
begin
|
||||||
|
Result:=stream^.allocator.Alloc(size);
|
||||||
|
FillChar(Result^,size,0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TvStreamCmdBuffer.OnFree(P:Pointer); register;
|
||||||
|
begin
|
||||||
|
//
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
procedure t_me_render_context.Init;
|
procedure t_me_render_context.Init;
|
||||||
|
@ -579,6 +596,16 @@ begin
|
||||||
Result:=VK_SUCCESS;
|
Result:=VK_SUCCESS;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure t_me_render_context.PingCmd;
|
||||||
|
var
|
||||||
|
i:t_pm4_stream_type;
|
||||||
|
begin
|
||||||
|
for i:=Low(t_pm4_stream_type) to High(t_pm4_stream_type) do
|
||||||
|
begin
|
||||||
|
CmdStatus(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function t_me_render_context.WaitConfirmOrSwitch:Boolean;
|
function t_me_render_context.WaitConfirmOrSwitch:Boolean;
|
||||||
begin
|
begin
|
||||||
FinishCmdBuffer;
|
FinishCmdBuffer;
|
||||||
|
@ -1500,7 +1527,7 @@ begin
|
||||||
Assert(false,'pm4_EventWriteEop');
|
Assert(false,'pm4_EventWriteEop');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.addr),QWORD(node^.addr)+data_size,nil,0);
|
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.addr),QWORD(node^.addr)+data_size,nil,M_DMEM_WRITE);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if (node^.intSel=EVENTWRITEEOP_INT_SEL_SEND_INT) or
|
if (node^.intSel=EVENTWRITEEOP_INT_SEL_SEND_INT) or
|
||||||
|
@ -1591,7 +1618,7 @@ begin
|
||||||
|
|
||||||
PDWORD(addr_dmem)^:=node^.data;
|
PDWORD(addr_dmem)^:=node^.data;
|
||||||
|
|
||||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.addr),QWORD(node^.addr)+4,nil,0);
|
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.addr),QWORD(node^.addr)+4,nil,M_DMEM_WRITE);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
@ -1641,7 +1668,7 @@ begin
|
||||||
|
|
||||||
Move(src_dmem^,dst_dmem^,byteSize);
|
Move(src_dmem^,dst_dmem^,byteSize);
|
||||||
|
|
||||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.dst),QWORD(node^.dst)+byteSize,nil,0);
|
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.dst),QWORD(node^.dst)+byteSize,nil,M_DMEM_WRITE);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
|
@ -1792,6 +1819,8 @@ begin
|
||||||
Continue;
|
Continue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
ctx.PingCmd;
|
||||||
|
|
||||||
//stall is empty!
|
//stall is empty!
|
||||||
|
|
||||||
me^.reset_sheduler;
|
me^.reset_sheduler;
|
||||||
|
|
|
@ -88,7 +88,8 @@ uses
|
||||||
sys_bootparam,
|
sys_bootparam,
|
||||||
kern_dmem,
|
kern_dmem,
|
||||||
kern_proc,
|
kern_proc,
|
||||||
vm_map;
|
vm_map,
|
||||||
|
vm_tracking_map;
|
||||||
|
|
||||||
function PM4_TYPE(token:DWORD):Byte; inline;
|
function PM4_TYPE(token:DWORD):Byte; inline;
|
||||||
begin
|
begin
|
||||||
|
@ -1074,14 +1075,14 @@ begin
|
||||||
|
|
||||||
Move(Pointer(adrSrc_dmem)^,Pointer(adrDst_dmem)^,byteCount);
|
Move(Pointer(adrSrc_dmem)^,Pointer(adrDst_dmem)^,byteCount);
|
||||||
|
|
||||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,0);
|
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,M_DMEM_WRITE);
|
||||||
end;
|
end;
|
||||||
(kDmaDataSrcData or (kDmaDataDstMemory shl 4)),
|
(kDmaDataSrcData or (kDmaDataDstMemory shl 4)),
|
||||||
(kDmaDataSrcData or (kDmaDataDstMemoryUsingL2 shl 4)):
|
(kDmaDataSrcData or (kDmaDataDstMemoryUsingL2 shl 4)):
|
||||||
begin
|
begin
|
||||||
FillDWORD(Pointer(adrDst_dmem)^,(byteCount div 4),DWORD(adrSrc));
|
FillDWORD(Pointer(adrDst_dmem)^,(byteCount div 4),DWORD(adrSrc));
|
||||||
|
|
||||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,0);
|
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,M_DMEM_WRITE);
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
Assert(false,'DmaData: srcSel=0x'+HexStr(srcSel,1)+' dstSel=0x'+HexStr(dstSel,1));
|
Assert(false,'DmaData: srcSel=0x'+HexStr(srcSel,1)+' dstSel=0x'+HexStr(dstSel,1));
|
||||||
|
@ -1145,7 +1146,7 @@ begin
|
||||||
|
|
||||||
Move(src_dmem^,dst_dmem^,count*SizeOf(DWORD));
|
Move(src_dmem^,dst_dmem^,count*SizeOf(DWORD));
|
||||||
|
|
||||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(dst),QWORD(dst)+count*SizeOf(DWORD),nil,0);
|
vm_map_track_trigger(p_proc.p_vmspace,QWORD(dst),QWORD(dst)+count*SizeOf(DWORD),nil,M_DMEM_WRITE);
|
||||||
end;
|
end;
|
||||||
else
|
else
|
||||||
Assert(false,'WriteData: dstSel=0x'+HexStr(dstSel,1));
|
Assert(false,'WriteData: dstSel=0x'+HexStr(dstSel,1));
|
||||||
|
|
|
@ -1298,13 +1298,11 @@ Procedure t_pm4_allocator.Free;
|
||||||
var
|
var
|
||||||
node:PAllocNode;
|
node:PAllocNode;
|
||||||
begin
|
begin
|
||||||
node:=pHead.slh_first;
|
node:=SLIST_FIRST(@pHead);
|
||||||
if (node<>nil) then
|
|
||||||
begin
|
|
||||||
pHead.slh_first:=node^.link;
|
|
||||||
end;
|
|
||||||
While (node<>nil) do
|
While (node<>nil) do
|
||||||
begin
|
begin
|
||||||
|
SLIST_REMOVE(@pHead,node,@node^.link);
|
||||||
|
|
||||||
if (node^.size=cache_block_allocator.mem_size) then
|
if (node^.size=cache_block_allocator.mem_size) then
|
||||||
begin
|
begin
|
||||||
|
@ -1314,11 +1312,7 @@ begin
|
||||||
md_unmap(node,node^.size);
|
md_unmap(node,node^.size);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
node:=pHead.slh_first;
|
node:=SLIST_FIRST(@pHead);
|
||||||
if (node<>nil) then
|
|
||||||
begin
|
|
||||||
pHead.slh_first:=node^.link;
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
Self:=Default(t_pm4_allocator);
|
Self:=Default(t_pm4_allocator);
|
||||||
end;
|
end;
|
||||||
|
|
|
@ -1278,9 +1278,14 @@ begin
|
||||||
Assert(false,'TODO: destroy in code analize');
|
Assert(false,'TODO: destroy in code analize');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function pick_on_trigger(handle:Pointer;mode:Integer):Integer;
|
function pick_on_trigger(handle:Pointer;mode:T_TRIGGER_MODE):Integer;
|
||||||
begin
|
begin
|
||||||
if (mode=1) then Exit(DO_NOTHING);
|
case mode of
|
||||||
|
M_CPU_WRITE :;
|
||||||
|
M_DMEM_WRITE:;
|
||||||
|
else
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
Result:=DO_NOTHING;
|
Result:=DO_NOTHING;
|
||||||
|
|
||||||
|
|
|
@ -1612,9 +1612,15 @@ begin
|
||||||
Result:=DO_DELETE;
|
Result:=DO_DELETE;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function on_trigger(handle:Pointer;mode:Integer):Integer;
|
function on_trigger(handle:Pointer;mode:T_TRIGGER_MODE):Integer;
|
||||||
begin
|
begin
|
||||||
if (mode=1) then Exit(DO_NOTHING);
|
case mode of
|
||||||
|
M_CPU_WRITE :;
|
||||||
|
M_DMEM_WRITE:;
|
||||||
|
else
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
//TODO
|
//TODO
|
||||||
Result:=DO_INCREMENT;
|
Result:=DO_INCREMENT;
|
||||||
end;
|
end;
|
||||||
|
|
|
@ -140,8 +140,8 @@ procedure init_dmem_map;
|
||||||
var
|
var
|
||||||
vmap:vm_map_t;
|
vmap:vm_map_t;
|
||||||
begin
|
begin
|
||||||
dmem_map_init(@dmem,0,{SCE_KERNEL_MAIN_DMEM_SIZE} (VM_MAX_GPU_ADDRESS-VM_MIN_GPU_ADDRESS) );
|
dmem_map_init(@dmem,0,SCE_KERNEL_MAIN_DMEM_SIZE);
|
||||||
rmem_map_init(@rmap,0,{SCE_KERNEL_MAIN_DMEM_SIZE} (VM_MAX_GPU_ADDRESS-VM_MIN_GPU_ADDRESS) );
|
rmem_map_init(@rmap,0,(VM_MAX_GPU_ADDRESS-VM_MIN_GPU_ADDRESS));
|
||||||
|
|
||||||
vmap:=p_proc.p_vmspace;
|
vmap:=p_proc.p_vmspace;
|
||||||
|
|
||||||
|
@ -523,6 +523,8 @@ var
|
||||||
start:QWORD;
|
start:QWORD;
|
||||||
relofs:Int64;
|
relofs:Int64;
|
||||||
|
|
||||||
|
offset:QWORD;
|
||||||
|
|
||||||
d_start,d_start2:QWORD;
|
d_start,d_start2:QWORD;
|
||||||
d_end,d_end2:QWORD;
|
d_end,d_end2:QWORD;
|
||||||
d_mtype:DWORD;
|
d_mtype:DWORD;
|
||||||
|
@ -564,20 +566,42 @@ begin
|
||||||
|
|
||||||
if ((obj^.flags and OBJ_DMEM_EXT)<>0) then
|
if ((obj^.flags and OBJ_DMEM_EXT)<>0) then
|
||||||
begin
|
begin
|
||||||
|
offset:=entry^.offset;
|
||||||
|
|
||||||
|
//transform by base addr
|
||||||
|
offset:=offset + (QWORD(obj^.un_pager.map_base) - VM_MIN_GPU_ADDRESS);
|
||||||
|
|
||||||
qinfo^.protection:=qinfo^.protection and (VM_PROT_GPU_ALL or VM_PROT_RW);
|
qinfo^.protection:=qinfo^.protection and (VM_PROT_GPU_ALL or VM_PROT_RW);
|
||||||
|
|
||||||
start :=entry^.start;
|
start :=entry^.start;
|
||||||
relofs:=entry^.offset - start;
|
relofs:=offset - start;
|
||||||
|
|
||||||
if (addr < start) then
|
if (addr < start) then
|
||||||
begin
|
begin
|
||||||
addr:=start;
|
addr:=start;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
ret:=dmem_map_get_mtype(dmem_maps[default_pool_id].dmem,obj,addr + relofs,@d_start2,@d_end2,@d_mtype);
|
if (offset>=(VM_MIN_DEV_ADDRESS-VM_MIN_GPU_ADDRESS)) then
|
||||||
if (ret<>0) then
|
|
||||||
begin
|
begin
|
||||||
Assert(false,'dmem_vmo_get_type error %d');
|
//dev
|
||||||
|
|
||||||
|
d_start2:=(VM_MIN_DEV_ADDRESS-VM_MIN_GPU_ADDRESS);
|
||||||
|
d_end2 :=(VM_MAX_DEV_ADDRESS-VM_MIN_GPU_ADDRESS);
|
||||||
|
d_mtype :=SCE_KERNEL_WB_ONION;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
//dmem
|
||||||
|
|
||||||
|
ret:=dmem_map_get_mtype(dmem_maps[default_pool_id].dmem,
|
||||||
|
obj,
|
||||||
|
addr + (entry^.offset - start), //send not transformed offset
|
||||||
|
@d_start2,@d_end2,
|
||||||
|
@d_mtype);
|
||||||
|
if (ret<>0) then
|
||||||
|
begin
|
||||||
|
Assert(false,'dmem_vmo_get_type error %d');
|
||||||
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
qinfo^.bits.isDirectMemory:=1;
|
qinfo^.bits.isDirectMemory:=1;
|
||||||
|
|
|
@ -44,7 +44,6 @@ procedure iov_uplift(iov:p_iovec);
|
||||||
type
|
type
|
||||||
p_pmap=^t_pmap;
|
p_pmap=^t_pmap;
|
||||||
t_pmap=packed object
|
t_pmap=packed object
|
||||||
vm_map:Pointer;
|
|
||||||
rmlock:rangelock;
|
rmlock:rangelock;
|
||||||
rm_mtx:mtx;
|
rm_mtx:mtx;
|
||||||
nt_map:t_vm_nt_map;
|
nt_map:t_vm_nt_map;
|
||||||
|
@ -63,7 +62,7 @@ function dev_mem_alloc(pages:Integer):Pointer;
|
||||||
|
|
||||||
function pmap_reserve(wr:Boolean):DWORD;
|
function pmap_reserve(wr:Boolean):DWORD;
|
||||||
|
|
||||||
procedure pmap_pinit(pmap:p_pmap;vm_map:Pointer);
|
procedure pmap_pinit(pmap:p_pmap);
|
||||||
|
|
||||||
procedure pmap_align_superpage(obj :vm_object_t;
|
procedure pmap_align_superpage(obj :vm_object_t;
|
||||||
offset:vm_ooffset_t;
|
offset:vm_ooffset_t;
|
||||||
|
@ -287,12 +286,10 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure pmap_pinit(pmap:p_pmap;vm_map:Pointer);
|
procedure pmap_pinit(pmap:p_pmap);
|
||||||
var
|
var
|
||||||
i,r:Integer;
|
i,r:Integer;
|
||||||
begin
|
begin
|
||||||
pmap^.vm_map:=vm_map;
|
|
||||||
|
|
||||||
r:=pmap_reserve(True);
|
r:=pmap_reserve(True);
|
||||||
Assert(r=0,'pmap_pinit');
|
Assert(r=0,'pmap_pinit');
|
||||||
|
|
||||||
|
@ -707,8 +704,6 @@ begin
|
||||||
delta:=(info.__end-info.start);
|
delta:=(info.__end-info.start);
|
||||||
if (delta=0) then Break;
|
if (delta=0) then Break;
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
r:=vm_nt_map_insert(@pmap^.nt_map,
|
r:=vm_nt_map_insert(@pmap^.nt_map,
|
||||||
info.obj,
|
info.obj,
|
||||||
info.start and PMAPP_BLK_MASK, //block local offset
|
info.start and PMAPP_BLK_MASK, //block local offset
|
||||||
|
@ -717,24 +712,18 @@ begin
|
||||||
delta,
|
delta,
|
||||||
(prot and VM_RW));
|
(prot and VM_RW));
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
|
|
||||||
if (r<>0) then
|
if (r<>0) then
|
||||||
begin
|
begin
|
||||||
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
|
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
|
||||||
Assert(false,'pmap_enter_object');
|
Assert(false,'pmap_enter_object');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
//fill zero if needed
|
//fill zero if needed
|
||||||
vm_nt_map_madvise(@pmap^.nt_map,
|
vm_nt_map_madvise(@pmap^.nt_map,
|
||||||
info.start,
|
info.start,
|
||||||
info.__end,
|
info.__end,
|
||||||
MADV_NORMAL);
|
MADV_NORMAL);
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
|
|
||||||
info.start :=info.start+delta;
|
info.start :=info.start+delta;
|
||||||
info.__end :=__end;
|
info.__end :=__end;
|
||||||
end;
|
end;
|
||||||
|
@ -775,8 +764,6 @@ begin
|
||||||
Writeln('vm_nt_map_insert:',HexStr(info.start,11),':',HexStr(info.__end,11),':',HexStr(info.offset,11));
|
Writeln('vm_nt_map_insert:',HexStr(info.start,11),':',HexStr(info.__end,11),':',HexStr(info.offset,11));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
r:=vm_nt_map_insert(@pmap^.nt_map,
|
r:=vm_nt_map_insert(@pmap^.nt_map,
|
||||||
info.obj,
|
info.obj,
|
||||||
info.offset and PMAPP_BLK_MASK, //block local offset
|
info.offset and PMAPP_BLK_MASK, //block local offset
|
||||||
|
@ -785,8 +772,6 @@ begin
|
||||||
delta,
|
delta,
|
||||||
(prot and VM_RW));
|
(prot and VM_RW));
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
|
|
||||||
if (r<>0) then
|
if (r<>0) then
|
||||||
begin
|
begin
|
||||||
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
|
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
|
||||||
|
@ -873,8 +858,6 @@ begin
|
||||||
delta:=(info.__end-info.start);
|
delta:=(info.__end-info.start);
|
||||||
if (delta=0) then Break;
|
if (delta=0) then Break;
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
r:=vm_nt_map_insert(@pmap^.nt_map,
|
r:=vm_nt_map_insert(@pmap^.nt_map,
|
||||||
info.obj,
|
info.obj,
|
||||||
info.start and PMAPP_BLK_MASK, //block local offset
|
info.start and PMAPP_BLK_MASK, //block local offset
|
||||||
|
@ -883,24 +866,18 @@ begin
|
||||||
delta,
|
delta,
|
||||||
(prot and VM_RW));
|
(prot and VM_RW));
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
|
|
||||||
if (r<>0) then
|
if (r<>0) then
|
||||||
begin
|
begin
|
||||||
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
|
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
|
||||||
Assert(false,'pmap_enter_object');
|
Assert(false,'pmap_enter_object');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
//restore
|
//restore
|
||||||
vm_nt_map_madvise(@pmap^.nt_map,
|
vm_nt_map_madvise(@pmap^.nt_map,
|
||||||
info.start,
|
info.start,
|
||||||
info.__end,
|
info.__end,
|
||||||
MADV_WILLNEED);
|
MADV_WILLNEED);
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
|
|
||||||
//copy
|
//copy
|
||||||
pmap_copy(cow,
|
pmap_copy(cow,
|
||||||
info.offset,
|
info.offset,
|
||||||
|
@ -925,8 +902,6 @@ begin
|
||||||
info.start :=start;
|
info.start :=start;
|
||||||
info.__end :=start+paddi;
|
info.__end :=start+paddi;
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
r:=vm_nt_map_insert(@pmap^.nt_map,
|
r:=vm_nt_map_insert(@pmap^.nt_map,
|
||||||
info.obj,
|
info.obj,
|
||||||
info.offset, //offset in file
|
info.offset, //offset in file
|
||||||
|
@ -935,8 +910,6 @@ begin
|
||||||
size,
|
size,
|
||||||
(prot and VM_RW));
|
(prot and VM_RW));
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
|
|
||||||
if (r<>0) then
|
if (r<>0) then
|
||||||
begin
|
begin
|
||||||
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
|
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
|
||||||
|
@ -994,8 +967,6 @@ begin
|
||||||
begin
|
begin
|
||||||
_default:
|
_default:
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
vm_nt_map_prot_fix(@pmap^.nt_map,
|
vm_nt_map_prot_fix(@pmap^.nt_map,
|
||||||
start,
|
start,
|
||||||
__end,
|
__end,
|
||||||
|
@ -1006,8 +977,6 @@ begin
|
||||||
// __end,
|
// __end,
|
||||||
// (prot and VM_RW));
|
// (prot and VM_RW));
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
|
|
||||||
end;
|
end;
|
||||||
OBJT_DEVICE:
|
OBJT_DEVICE:
|
||||||
begin
|
begin
|
||||||
|
@ -1051,14 +1020,10 @@ begin
|
||||||
start:=start and (not PMAPP_MASK);
|
start:=start and (not PMAPP_MASK);
|
||||||
__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
|
__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
vm_nt_map_prot_fix(@pmap^.nt_map,
|
vm_nt_map_prot_fix(@pmap^.nt_map,
|
||||||
start,
|
start,
|
||||||
__end,
|
__end,
|
||||||
mode);
|
mode);
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _pmap_prot_int(pmap :pmap_t;
|
procedure _pmap_prot_int(pmap :pmap_t;
|
||||||
|
@ -1069,14 +1034,10 @@ begin
|
||||||
start:=start and (not PMAPP_MASK);
|
start:=start and (not PMAPP_MASK);
|
||||||
__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
|
__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
vm_nt_map_protect(@pmap^.nt_map,
|
vm_nt_map_protect(@pmap^.nt_map,
|
||||||
start,
|
start,
|
||||||
__end,
|
__end,
|
||||||
(prot and VM_RW));
|
(prot and VM_RW));
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure pmap_prot_track(pmap :pmap_t;
|
procedure pmap_prot_track(pmap :pmap_t;
|
||||||
|
@ -1087,16 +1048,12 @@ begin
|
||||||
start:=start and (not PMAPP_MASK);
|
start:=start and (not PMAPP_MASK);
|
||||||
__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
|
__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
ppmap_track(start,__end,prots);
|
ppmap_track(start,__end,prots);
|
||||||
|
|
||||||
vm_nt_map_prot_fix(@pmap^.nt_map,
|
vm_nt_map_prot_fix(@pmap^.nt_map,
|
||||||
start,
|
start,
|
||||||
__end,
|
__end,
|
||||||
TRACK_PROT or REMAP_PROT);
|
TRACK_PROT or REMAP_PROT);
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure pmap_madvise(pmap :pmap_t;
|
procedure pmap_madvise(pmap :pmap_t;
|
||||||
|
@ -1126,14 +1083,10 @@ begin
|
||||||
begin
|
begin
|
||||||
_default:
|
_default:
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
vm_nt_map_madvise(@pmap^.nt_map,
|
vm_nt_map_madvise(@pmap^.nt_map,
|
||||||
start,
|
start,
|
||||||
__end,
|
__end,
|
||||||
advise);
|
advise);
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
end;
|
end;
|
||||||
OBJT_DEVICE:
|
OBJT_DEVICE:
|
||||||
begin
|
begin
|
||||||
|
@ -1195,24 +1148,17 @@ begin
|
||||||
|
|
||||||
OBJT_DEFAULT:
|
OBJT_DEFAULT:
|
||||||
begin
|
begin
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
vm_nt_map_madvise(@pmap^.nt_map,
|
vm_nt_map_madvise(@pmap^.nt_map,
|
||||||
start,
|
start,
|
||||||
__end,
|
__end,
|
||||||
MADV_FREE);
|
MADV_FREE);
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
|
|
||||||
_default:
|
_default:
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
r:=vm_nt_map_delete(@pmap^.nt_map,
|
r:=vm_nt_map_delete(@pmap^.nt_map,
|
||||||
start,
|
start,
|
||||||
__end);
|
__end);
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
end;
|
end;
|
||||||
OBJT_DEVICE:
|
OBJT_DEVICE:
|
||||||
begin
|
begin
|
||||||
|
@ -1262,14 +1208,10 @@ var
|
||||||
begin
|
begin
|
||||||
lock:=pmap_rlock(pmap,start,__end);
|
lock:=pmap_rlock(pmap,start,__end);
|
||||||
|
|
||||||
vm_map_lock(pmap^.vm_map);
|
|
||||||
|
|
||||||
Result:=vm_nt_map_mirror(@pmap^.nt_map,
|
Result:=vm_nt_map_mirror(@pmap^.nt_map,
|
||||||
start,
|
start,
|
||||||
__end);
|
__end);
|
||||||
|
|
||||||
vm_map_unlock(pmap^.vm_map,False);
|
|
||||||
|
|
||||||
pmap_unlock(pmap,lock);
|
pmap_unlock(pmap,lock);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
|
@ -736,7 +736,7 @@ function rmem_map_insert(map:p_rmem_map;
|
||||||
vaddr:QWORD;
|
vaddr:QWORD;
|
||||||
start,__end:DWORD):Integer;
|
start,__end:DWORD):Integer;
|
||||||
var
|
var
|
||||||
current,entry:p_rmem_map_entry;
|
entry:p_rmem_map_entry;
|
||||||
begin
|
begin
|
||||||
if (start=__end) then
|
if (start=__end) then
|
||||||
begin
|
begin
|
||||||
|
@ -760,19 +760,18 @@ begin
|
||||||
entry:=rmem_map_insert_internal(map,entry,start,__end);
|
entry:=rmem_map_insert_internal(map,entry,start,__end);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
current:=entry;
|
while (entry<>@map^.header) and (entry^.start<__end) do
|
||||||
while (current<>@map^.header) and (current^.start<__end) do
|
|
||||||
begin
|
begin
|
||||||
rmem_map_clip_end(map, current, __end);
|
rmem_map_clip_end(map, entry, __end);
|
||||||
|
|
||||||
current:=rmem_map_insert_internal(map,current,current^.__end,__end);
|
entry:=rmem_map_insert_internal(map,entry,entry^.__end,__end);
|
||||||
|
|
||||||
if rmem_entry_add_vaddr(current,vaddr) then
|
if rmem_entry_add_vaddr(entry,vaddr) then
|
||||||
begin
|
begin
|
||||||
rmem_entry_add_track(map^.tmap,entry,vaddr);
|
rmem_entry_add_track(map^.tmap,entry,vaddr);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
current:=current^.next;
|
entry:=entry^.next;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
rmem_map_unlock(map);
|
rmem_map_unlock(map);
|
||||||
|
|
|
@ -15,7 +15,8 @@ uses
|
||||||
kern_mtx,
|
kern_mtx,
|
||||||
kern_thr,
|
kern_thr,
|
||||||
sys_resource,
|
sys_resource,
|
||||||
kern_resource;
|
kern_resource,
|
||||||
|
vm_tracking_map;
|
||||||
|
|
||||||
type
|
type
|
||||||
vm_flags_t =type Byte;
|
vm_flags_t =type Byte;
|
||||||
|
@ -278,9 +279,9 @@ procedure vm_map_set_name_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar
|
||||||
|
|
||||||
procedure vm_map_track_insert(map:vm_map_t;tobj:Pointer);
|
procedure vm_map_track_insert(map:vm_map_t;tobj:Pointer);
|
||||||
procedure vm_map_track_remove(map:vm_map_t;tobj:Pointer);
|
procedure vm_map_track_remove(map:vm_map_t;tobj:Pointer);
|
||||||
function vm_map_track_next (map:vm_map_t;start:vm_offset_t;tobj:Pointer;htype:Byte):Pointer;
|
function vm_map_track_next (map:vm_map_t;start:vm_offset_t;tobj:Pointer;htype:T_THANDLE_TYPE):Pointer;
|
||||||
procedure _vm_map_track_delete_deferred(map:vm_map_t;tobj:Pointer);
|
procedure _vm_map_track_delete_deferred(map:vm_map_t;tobj:Pointer);
|
||||||
function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer;mode:Integer):Integer;
|
function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer;mode:T_TRIGGER_MODE):Integer;
|
||||||
|
|
||||||
function vmspace_pmap(vm:p_vmspace):pmap_t; inline;
|
function vmspace_pmap(vm:p_vmspace):pmap_t; inline;
|
||||||
|
|
||||||
|
@ -294,7 +295,6 @@ uses
|
||||||
md_map,
|
md_map,
|
||||||
kern_proc,
|
kern_proc,
|
||||||
rmem_map,
|
rmem_map,
|
||||||
vm_tracking_map,
|
|
||||||
kern_budget;
|
kern_budget;
|
||||||
|
|
||||||
var
|
var
|
||||||
|
@ -385,7 +385,7 @@ var
|
||||||
begin
|
begin
|
||||||
vm:=@g_vmspace;
|
vm:=@g_vmspace;
|
||||||
|
|
||||||
pmap_pinit(vmspace_pmap(vm),@vm^.vm_map);
|
pmap_pinit(vmspace_pmap(vm));
|
||||||
|
|
||||||
vm_map_init(@vm^.vm_map,vmspace_pmap(vm),VM_MINUSER_ADDRESS,VM_MAXUSER_ADDRESS);
|
vm_map_init(@vm^.vm_map,vmspace_pmap(vm),VM_MINUSER_ADDRESS,VM_MAXUSER_ADDRESS);
|
||||||
|
|
||||||
|
@ -3408,14 +3408,10 @@ procedure vm_map_track_remove(map:vm_map_t;tobj:Pointer);
|
||||||
begin
|
begin
|
||||||
if (tobj=nil) then Exit;
|
if (tobj=nil) then Exit;
|
||||||
|
|
||||||
vm_map_lock(map); //lock to prevent deadlock
|
|
||||||
|
|
||||||
vm_track_map_remove_object(@map^.pmap^.tr_map,tobj);
|
vm_track_map_remove_object(@map^.pmap^.tr_map,tobj);
|
||||||
|
|
||||||
vm_map_unlock(map);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function vm_map_track_next(map:vm_map_t;start:vm_offset_t;tobj:Pointer;htype:Byte):Pointer;
|
function vm_map_track_next(map:vm_map_t;start:vm_offset_t;tobj:Pointer;htype:T_THANDLE_TYPE):Pointer;
|
||||||
begin
|
begin
|
||||||
Result:=vm_track_map_next_object(@map^.pmap^.tr_map,start,tobj,htype);
|
Result:=vm_track_map_next_object(@map^.pmap^.tr_map,start,tobj,htype);
|
||||||
end;
|
end;
|
||||||
|
@ -3425,7 +3421,7 @@ begin
|
||||||
_vm_track_map_delete_deferred(@map^.pmap^.tr_map,tobj);
|
_vm_track_map_delete_deferred(@map^.pmap^.tr_map,tobj);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer;mode:Integer):Integer;
|
function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer;mode:T_TRIGGER_MODE):Integer;
|
||||||
begin
|
begin
|
||||||
Result:=vm_track_map_trigger(@map^.pmap^.tr_map,start,__end,exclude,mode);
|
Result:=vm_track_map_trigger(@map^.pmap^.tr_map,start,__end,exclude,mode);
|
||||||
end;
|
end;
|
||||||
|
|
|
@ -65,6 +65,7 @@ type
|
||||||
nentries :Integer; // Number of entries
|
nentries :Integer; // Number of entries
|
||||||
root :p_vm_nt_entry; // Root of a binary search tree
|
root :p_vm_nt_entry; // Root of a binary search tree
|
||||||
danger_zone:t_danger_zone;
|
danger_zone:t_danger_zone;
|
||||||
|
lock :mtx;
|
||||||
property min_offset:vm_offset_t read header.start write header.start;
|
property min_offset:vm_offset_t read header.start write header.start;
|
||||||
property max_offset:vm_offset_t read header.__end write header.__end;
|
property max_offset:vm_offset_t read header.__end write header.__end;
|
||||||
end;
|
end;
|
||||||
|
@ -79,11 +80,6 @@ function vm_nt_map_min(map:p_vm_nt_map):vm_offset_t;
|
||||||
|
|
||||||
procedure vm_nt_map_init(map:p_vm_nt_map;min,max:vm_offset_t);
|
procedure vm_nt_map_init(map:p_vm_nt_map;min,max:vm_offset_t);
|
||||||
|
|
||||||
function vm_nt_map_lookup_entry(
|
|
||||||
map :p_vm_nt_map;
|
|
||||||
address:vm_offset_t;
|
|
||||||
entry :pp_vm_nt_entry):Boolean;
|
|
||||||
|
|
||||||
function vm_nt_map_insert(
|
function vm_nt_map_insert(
|
||||||
map :p_vm_nt_map;
|
map :p_vm_nt_map;
|
||||||
obj :p_vm_nt_file_obj;
|
obj :p_vm_nt_file_obj;
|
||||||
|
@ -114,8 +110,6 @@ function vm_nt_map_mirror(map:p_vm_nt_map;
|
||||||
start:vm_offset_t;
|
start:vm_offset_t;
|
||||||
__end:vm_offset_t):Pointer;
|
__end:vm_offset_t):Pointer;
|
||||||
|
|
||||||
procedure vm_nt_entry_deallocate(entry:p_vm_nt_entry);
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
|
@ -678,6 +672,17 @@ begin
|
||||||
map^.max_offset:=max;
|
map^.max_offset:=max;
|
||||||
map^.root:=nil;
|
map^.root:=nil;
|
||||||
map^.danger_zone.Init;
|
map^.danger_zone.Init;
|
||||||
|
mtx_init(map^.lock,'vm_nt_map');
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure vm_nt_map_lock(map:p_vm_nt_map); inline;
|
||||||
|
begin
|
||||||
|
mtx_lock(map^.lock);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure vm_nt_map_unlock(map:p_vm_nt_map); inline;
|
||||||
|
begin
|
||||||
|
mtx_unlock(map^.lock);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure vm_nt_entry_dispose(map:p_vm_nt_map;entry:p_vm_nt_entry); inline;
|
procedure vm_nt_entry_dispose(map:p_vm_nt_map;entry:p_vm_nt_entry); inline;
|
||||||
|
@ -863,7 +868,7 @@ end;
|
||||||
|
|
||||||
function vm_nt_map_simplify_entry(map:p_vm_nt_map;entry:p_vm_nt_entry;var sb:t_range_stat):Boolean; forward;
|
function vm_nt_map_simplify_entry(map:p_vm_nt_map;entry:p_vm_nt_entry;var sb:t_range_stat):Boolean; forward;
|
||||||
|
|
||||||
function vm_nt_map_insert(
|
function _vm_nt_map_insert(
|
||||||
map :p_vm_nt_map;
|
map :p_vm_nt_map;
|
||||||
obj :p_vm_nt_file_obj;
|
obj :p_vm_nt_file_obj;
|
||||||
offset:vm_ooffset_t;
|
offset:vm_ooffset_t;
|
||||||
|
@ -914,6 +919,34 @@ begin
|
||||||
Result:=KERN_SUCCESS;
|
Result:=KERN_SUCCESS;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function vm_nt_map_insert(
|
||||||
|
map :p_vm_nt_map;
|
||||||
|
obj :p_vm_nt_file_obj;
|
||||||
|
offset:vm_ooffset_t;
|
||||||
|
start :vm_offset_t;
|
||||||
|
__end :vm_offset_t;
|
||||||
|
size :vm_offset_t; //unaligned size
|
||||||
|
prot :Integer):Integer;
|
||||||
|
begin
|
||||||
|
if (start=__end) then
|
||||||
|
begin
|
||||||
|
Exit(KERN_SUCCESS);
|
||||||
|
end;
|
||||||
|
|
||||||
|
vm_nt_map_lock(map);
|
||||||
|
|
||||||
|
Result:=_vm_nt_map_insert(
|
||||||
|
map ,
|
||||||
|
obj ,
|
||||||
|
offset,
|
||||||
|
start ,
|
||||||
|
__end ,
|
||||||
|
size ,
|
||||||
|
prot );
|
||||||
|
|
||||||
|
vm_nt_map_unlock(map);
|
||||||
|
end;
|
||||||
|
|
||||||
function vm_nt_map_simplify_entry(map:p_vm_nt_map;entry:p_vm_nt_entry;var sb:t_range_stat):Boolean;
|
function vm_nt_map_simplify_entry(map:p_vm_nt_map;entry:p_vm_nt_entry;var sb:t_range_stat):Boolean;
|
||||||
var
|
var
|
||||||
next,prev:p_vm_nt_entry;
|
next,prev:p_vm_nt_entry;
|
||||||
|
@ -1124,6 +1157,8 @@ begin
|
||||||
Exit(KERN_SUCCESS);
|
Exit(KERN_SUCCESS);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
vm_nt_map_lock(map);
|
||||||
|
|
||||||
if (not vm_nt_map_lookup_entry(map, start, @first_entry)) then
|
if (not vm_nt_map_lookup_entry(map, start, @first_entry)) then
|
||||||
begin
|
begin
|
||||||
entry:=first_entry^.next;
|
entry:=first_entry^.next;
|
||||||
|
@ -1148,6 +1183,9 @@ begin
|
||||||
|
|
||||||
entry:=next;
|
entry:=next;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
vm_nt_map_unlock(map);
|
||||||
|
|
||||||
Result:=(KERN_SUCCESS);
|
Result:=(KERN_SUCCESS);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -1164,6 +1202,8 @@ var
|
||||||
begin
|
begin
|
||||||
if (start=__end) then Exit;
|
if (start=__end) then Exit;
|
||||||
|
|
||||||
|
vm_nt_map_lock(map);
|
||||||
|
|
||||||
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
|
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
|
||||||
begin
|
begin
|
||||||
entry:=entry^.next;
|
entry:=entry^.next;
|
||||||
|
@ -1209,6 +1249,8 @@ begin
|
||||||
|
|
||||||
entry:=entry^.next;
|
entry:=entry^.next;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
vm_nt_map_unlock(map);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure vm_nt_map_prot_fix(map:p_vm_nt_map;
|
procedure vm_nt_map_prot_fix(map:p_vm_nt_map;
|
||||||
|
@ -1222,6 +1264,8 @@ var
|
||||||
begin
|
begin
|
||||||
if (start=__end) then Exit;
|
if (start=__end) then Exit;
|
||||||
|
|
||||||
|
vm_nt_map_lock(map);
|
||||||
|
|
||||||
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
|
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
|
||||||
begin
|
begin
|
||||||
entry:=entry^.next;
|
entry:=entry^.next;
|
||||||
|
@ -1256,6 +1300,8 @@ begin
|
||||||
|
|
||||||
entry:=entry^.next;
|
entry:=entry^.next;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
vm_nt_map_unlock(map);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
//rdi, rsi
|
//rdi, rsi
|
||||||
|
@ -1292,6 +1338,8 @@ var
|
||||||
begin
|
begin
|
||||||
if (start=__end) then Exit;
|
if (start=__end) then Exit;
|
||||||
|
|
||||||
|
vm_nt_map_lock(map);
|
||||||
|
|
||||||
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
|
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
|
||||||
begin
|
begin
|
||||||
entry:=entry^.next;
|
entry:=entry^.next;
|
||||||
|
@ -1343,6 +1391,8 @@ begin
|
||||||
|
|
||||||
entry:=entry^.next;
|
entry:=entry^.next;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
vm_nt_map_unlock(map);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1369,6 +1419,8 @@ begin
|
||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
vm_nt_map_lock(map);
|
||||||
|
|
||||||
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
|
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
|
||||||
begin
|
begin
|
||||||
entry:=entry^.next;
|
entry:=entry^.next;
|
||||||
|
@ -1436,6 +1488,8 @@ begin
|
||||||
|
|
||||||
entry:=entry^.next;
|
entry:=entry^.next;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
vm_nt_map_unlock(map);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -26,27 +26,21 @@ const
|
||||||
DO_DELETE =1;
|
DO_DELETE =1;
|
||||||
DO_INCREMENT=2;
|
DO_INCREMENT=2;
|
||||||
|
|
||||||
H_ZERO =0;
|
type
|
||||||
H_JIT_CHUNK=1;
|
T_THANDLE_TYPE=(H_ZERO,H_JIT_CHUNK,H_GPU_IMAGE,H_GPU_BUF);
|
||||||
H_GPU_IMAGE=2;
|
T_TRIGGER_MODE=(M_CPU_WRITE,M_DMEM_WRITE,M_GPU_PLANNED,M_GPU_APPLY);
|
||||||
H_GPU_BUF =3;
|
|
||||||
|
|
||||||
type
|
type
|
||||||
t_on_destroy=function(handle:Pointer):Integer;
|
t_on_destroy=function(handle:Pointer):Integer;
|
||||||
t_on_trigger=function(handle:Pointer;mode:Integer):Integer;
|
t_on_trigger=function(handle:Pointer;mode:T_TRIGGER_MODE):Integer;
|
||||||
|
|
||||||
p_vm_track_object=^t_vm_track_object;
|
p_vm_track_object=^t_vm_track_object;
|
||||||
t_vm_track_object=record
|
t_vm_track_object=packed record
|
||||||
del_link :TAILQ_ENTRY; //p_vm_track_map->delete_deferred
|
del_link :TAILQ_ENTRY; //p_vm_track_map->delete_deferred
|
||||||
//iter_link :TAILQ_ENTRY;
|
//iter_link :TAILQ_ENTRY;
|
||||||
//
|
//
|
||||||
handle :Pointer;
|
handle :Pointer;
|
||||||
//
|
//
|
||||||
ref_count :DWORD;
|
|
||||||
htype :Byte;
|
|
||||||
mark_del :Byte;
|
|
||||||
prot :Byte;
|
|
||||||
//
|
|
||||||
main :t_vm_track_interval;
|
main :t_vm_track_interval;
|
||||||
align :t_vm_track_interval;
|
align :t_vm_track_interval;
|
||||||
instances :TAILQ_HEAD; //p_vm_track_object_instance
|
instances :TAILQ_HEAD; //p_vm_track_object_instance
|
||||||
|
@ -54,6 +48,10 @@ type
|
||||||
on_destroy:t_on_destroy;
|
on_destroy:t_on_destroy;
|
||||||
on_trigger:t_on_trigger;
|
on_trigger:t_on_trigger;
|
||||||
//
|
//
|
||||||
|
ref_count :DWORD;
|
||||||
|
htype :T_THANDLE_TYPE;
|
||||||
|
mark_del :Byte;
|
||||||
|
prot :Byte;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
pp_vm_track_map_entry=^p_vm_track_map_entry;
|
pp_vm_track_map_entry=^p_vm_track_map_entry;
|
||||||
|
@ -65,7 +63,6 @@ type
|
||||||
right :p_vm_track_map_entry; // right child in binary search tree
|
right :p_vm_track_map_entry; // right child in binary search tree
|
||||||
start :vm_offset_t; // start address
|
start :vm_offset_t; // start address
|
||||||
__end :vm_offset_t; // end address
|
__end :vm_offset_t; // end address
|
||||||
source :vm_offset_t; // source of mirror
|
|
||||||
instances:Pointer; // p_vm_track_object_instance
|
instances:Pointer; // p_vm_track_object_instance
|
||||||
instcount:QWORD;
|
instcount:QWORD;
|
||||||
//
|
//
|
||||||
|
@ -82,6 +79,7 @@ type
|
||||||
obj_link :TAILQ_ENTRY; //p_vm_track_object ->instances
|
obj_link :TAILQ_ENTRY; //p_vm_track_object ->instances
|
||||||
entry :p_vm_track_map_entry;
|
entry :p_vm_track_map_entry;
|
||||||
obj :p_vm_track_object;
|
obj :p_vm_track_object;
|
||||||
|
source :vm_offset_t; // source of mirror
|
||||||
end;
|
end;
|
||||||
|
|
||||||
p_vm_track_deferred=^t_vm_track_deferred;
|
p_vm_track_deferred=^t_vm_track_deferred;
|
||||||
|
@ -117,7 +115,7 @@ procedure vm_track_map_init(map:p_vm_track_map;min,max:vm_offset_t);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
function vm_track_object_allocate (handle:Pointer;start,__end:vm_offset_t;htype,prot:Byte):p_vm_track_object;
|
function vm_track_object_allocate (handle:Pointer;start,__end:vm_offset_t;htype:T_THANDLE_TYPE;prot:Byte):p_vm_track_object;
|
||||||
procedure vm_track_object_deallocate(obj:p_vm_track_object);
|
procedure vm_track_object_deallocate(obj:p_vm_track_object);
|
||||||
procedure vm_track_object_reference (obj:p_vm_track_object);
|
procedure vm_track_object_reference (obj:p_vm_track_object);
|
||||||
|
|
||||||
|
@ -137,9 +135,9 @@ function _vm_track_map_insert_mirror(map:p_vm_track_map;start,__end,dst:vm_offs
|
||||||
|
|
||||||
function vm_track_map_remove_object(map:p_vm_track_map;obj:p_vm_track_object):Integer;
|
function vm_track_map_remove_object(map:p_vm_track_map;obj:p_vm_track_object):Integer;
|
||||||
function vm_track_map_remove_memory(map:p_vm_track_map;start,__end:vm_offset_t):Integer;
|
function vm_track_map_remove_memory(map:p_vm_track_map;start,__end:vm_offset_t):Integer;
|
||||||
function vm_track_map_trigger (map:p_vm_track_map;start,__end:vm_offset_t;exclude:Pointer;mode:Integer):Integer;
|
function vm_track_map_trigger (map:p_vm_track_map;start,__end:vm_offset_t;exclude:Pointer;mode:T_TRIGGER_MODE):Integer;
|
||||||
|
|
||||||
function vm_track_map_next_object (map:p_vm_track_map;start:vm_offset_t;obj:p_vm_track_object;htype:Byte):p_vm_track_object;
|
function vm_track_map_next_object (map:p_vm_track_map;start:vm_offset_t;obj:p_vm_track_object;htype:T_THANDLE_TYPE):p_vm_track_object;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
@ -148,7 +146,7 @@ procedure pmap_prot_track(pmap :Pointer;
|
||||||
__end:vm_offset_t;
|
__end:vm_offset_t;
|
||||||
prots:Byte); external;
|
prots:Byte); external;
|
||||||
|
|
||||||
function vm_track_object_allocate(handle:Pointer;start,__end:vm_offset_t;htype,prot:Byte):p_vm_track_object;
|
function vm_track_object_allocate(handle:Pointer;start,__end:vm_offset_t;htype:T_THANDLE_TYPE;prot:Byte):p_vm_track_object;
|
||||||
begin
|
begin
|
||||||
Result:=AllocMem(SizeOf(t_vm_track_object));
|
Result:=AllocMem(SizeOf(t_vm_track_object));
|
||||||
|
|
||||||
|
@ -211,7 +209,7 @@ begin
|
||||||
end;
|
end;
|
||||||
}
|
}
|
||||||
|
|
||||||
function vm_track_object_trigger(map:p_vm_track_map;obj:p_vm_track_object;start,__end:vm_offset_t;mode:Integer):Integer;
|
function vm_track_object_trigger(obj:p_vm_track_object;start,__end:vm_offset_t;mode:T_TRIGGER_MODE):Integer;
|
||||||
begin
|
begin
|
||||||
Result:=DO_NOTHING;
|
Result:=DO_NOTHING;
|
||||||
|
|
||||||
|
@ -430,15 +428,16 @@ begin
|
||||||
Exit(y);
|
Exit(y);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _vm_track_entry_add_obj(pmap:Pointer;entry:p_vm_track_map_entry;obj:p_vm_track_object);
|
procedure _vm_track_entry_add_obj(pmap:Pointer;entry:p_vm_track_map_entry;obj:p_vm_track_object;source:vm_offset_t);
|
||||||
var
|
var
|
||||||
node:p_vm_track_object_instance;
|
node:p_vm_track_object_instance;
|
||||||
prot:Byte;
|
prot:Byte;
|
||||||
begin
|
begin
|
||||||
node:=AllocMem(SizeOf(t_vm_track_object_instance));
|
node:=AllocMem(SizeOf(t_vm_track_object_instance));
|
||||||
|
|
||||||
node^.entry:=entry;
|
node^.entry :=entry;
|
||||||
node^.obj :=obj;
|
node^.obj :=obj;
|
||||||
|
node^.source:=source;
|
||||||
|
|
||||||
vm_track_insert_instance(entry^.instances,node);
|
vm_track_insert_instance(entry^.instances,node);
|
||||||
Inc(entry^.instcount);
|
Inc(entry^.instcount);
|
||||||
|
@ -475,7 +474,7 @@ begin
|
||||||
//
|
//
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure vm_track_entry_add_obj(pmap:Pointer;entry:p_vm_track_map_entry;obj:p_vm_track_object);
|
procedure vm_track_entry_add_obj(pmap:Pointer;entry:p_vm_track_map_entry;obj:p_vm_track_object;source:vm_offset_t);
|
||||||
var
|
var
|
||||||
root:p_vm_track_object_instance;
|
root:p_vm_track_object_instance;
|
||||||
begin
|
begin
|
||||||
|
@ -488,7 +487,7 @@ begin
|
||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
_vm_track_entry_add_obj(pmap,entry,obj);
|
_vm_track_entry_add_obj(pmap,entry,obj,source);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _vm_track_entry_del_node(pmap:Pointer;entry:p_vm_track_map_entry;node:p_vm_track_object_instance):Boolean;
|
function _vm_track_entry_del_node(pmap:Pointer;entry:p_vm_track_map_entry;node:p_vm_track_object_instance):Boolean;
|
||||||
|
@ -577,7 +576,7 @@ end;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
function in_obj_list(b:p_vm_track_map_entry;obj:p_vm_track_object):Boolean;
|
function in_obj_list(b:p_vm_track_map_entry;obj:p_vm_track_object;source:vm_offset_t):Boolean;
|
||||||
var
|
var
|
||||||
root:p_vm_track_object_instance;
|
root:p_vm_track_object_instance;
|
||||||
begin
|
begin
|
||||||
|
@ -591,10 +590,10 @@ begin
|
||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Result:=(root^.obj=obj);
|
Result:=(root^.obj=obj) and (root^.source=source);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function compare_obj_list(a,b:p_vm_track_map_entry):Boolean;
|
function compare_obj_list(a:p_vm_track_map_entry;offset:vm_offset_t;b:p_vm_track_map_entry):Boolean;
|
||||||
var
|
var
|
||||||
node:p_vm_track_object_instance;
|
node:p_vm_track_object_instance;
|
||||||
begin
|
begin
|
||||||
|
@ -608,7 +607,7 @@ begin
|
||||||
while (node<>nil) do
|
while (node<>nil) do
|
||||||
begin
|
begin
|
||||||
|
|
||||||
if not in_obj_list(b,node^.obj) then
|
if not in_obj_list(b,node^.obj,node^.source+offset) then
|
||||||
begin
|
begin
|
||||||
Exit(False);
|
Exit(False);
|
||||||
end;
|
end;
|
||||||
|
@ -619,7 +618,35 @@ begin
|
||||||
Result:=True;
|
Result:=True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure copy_obj_list(src,dst:p_vm_track_map_entry);
|
procedure inc_obj_list(src:p_vm_track_map_entry;offset:vm_offset_t);
|
||||||
|
var
|
||||||
|
node:p_vm_track_object_instance;
|
||||||
|
begin
|
||||||
|
node:=vm_track_first_instance(src^.instances);
|
||||||
|
|
||||||
|
while (node<>nil) do
|
||||||
|
begin
|
||||||
|
node^.source:=node^.source+offset;
|
||||||
|
|
||||||
|
node:=vm_track_next_instance(src^.instances,node);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure dec_obj_list(src:p_vm_track_map_entry;offset:vm_offset_t);
|
||||||
|
var
|
||||||
|
node:p_vm_track_object_instance;
|
||||||
|
begin
|
||||||
|
node:=vm_track_first_instance(src^.instances);
|
||||||
|
|
||||||
|
while (node<>nil) do
|
||||||
|
begin
|
||||||
|
node^.source:=node^.source-offset;
|
||||||
|
|
||||||
|
node:=vm_track_next_instance(src^.instances,node);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure copy_obj_list(src,dst:p_vm_track_map_entry;offset:vm_offset_t);
|
||||||
var
|
var
|
||||||
node:p_vm_track_object_instance;
|
node:p_vm_track_object_instance;
|
||||||
begin
|
begin
|
||||||
|
@ -630,7 +657,7 @@ begin
|
||||||
|
|
||||||
while (node<>nil) do
|
while (node<>nil) do
|
||||||
begin
|
begin
|
||||||
_vm_track_entry_add_obj(nil,dst,node^.obj);
|
_vm_track_entry_add_obj(nil,dst,node^.obj,node^.source+offset);
|
||||||
|
|
||||||
node:=vm_track_next_instance(src^.instances,node);
|
node:=vm_track_next_instance(src^.instances,node);
|
||||||
end;
|
end;
|
||||||
|
@ -921,8 +948,7 @@ function vm_track_map_insert_internal(
|
||||||
map :p_vm_track_map;
|
map :p_vm_track_map;
|
||||||
after :p_vm_track_map_entry;
|
after :p_vm_track_map_entry;
|
||||||
start :vm_offset_t;
|
start :vm_offset_t;
|
||||||
__end :vm_offset_t;
|
__end :vm_offset_t):p_vm_track_map_entry;
|
||||||
source:vm_offset_t):p_vm_track_map_entry;
|
|
||||||
var
|
var
|
||||||
new_entry:p_vm_track_map_entry;
|
new_entry:p_vm_track_map_entry;
|
||||||
begin
|
begin
|
||||||
|
@ -931,8 +957,6 @@ begin
|
||||||
if (after<>@map^.header) and
|
if (after<>@map^.header) and
|
||||||
(start<after^.__end) then
|
(start<after^.__end) then
|
||||||
begin
|
begin
|
||||||
source:=source+(after^.__end-start);
|
|
||||||
|
|
||||||
start:=after^.__end;
|
start:=after^.__end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -953,7 +977,6 @@ begin
|
||||||
new_entry:=vm_track_entry_create(map);
|
new_entry:=vm_track_entry_create(map);
|
||||||
new_entry^.start :=start;
|
new_entry^.start :=start;
|
||||||
new_entry^.__end :=__end;
|
new_entry^.__end :=__end;
|
||||||
new_entry^.source:=source;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
* Insert the new after into the list
|
* Insert the new after into the list
|
||||||
|
@ -975,12 +998,12 @@ begin
|
||||||
begin
|
begin
|
||||||
prevsize:=prev^.__end - prev^.start;
|
prevsize:=prev^.__end - prev^.start;
|
||||||
if (prev^.__end=entry^.start) and
|
if (prev^.__end=entry^.start) and
|
||||||
(prev^.source + prevsize=entry^.source) and
|
compare_obj_list(prev,prevsize,entry) then
|
||||||
compare_obj_list(prev,entry) then
|
|
||||||
begin
|
begin
|
||||||
vm_track_map_entry_unlink(map, prev);
|
vm_track_map_entry_unlink(map, prev);
|
||||||
entry^.start :=prev^.start;
|
entry^.start :=prev^.start;
|
||||||
entry^.source:=prev^.source;
|
|
||||||
|
dec_obj_list(entry,prevsize);
|
||||||
|
|
||||||
vm_track_entry_dispose(map, nil, prev);
|
vm_track_entry_dispose(map, nil, prev);
|
||||||
end;
|
end;
|
||||||
|
@ -991,8 +1014,7 @@ begin
|
||||||
begin
|
begin
|
||||||
esize:=entry^.__end - entry^.start;
|
esize:=entry^.__end - entry^.start;
|
||||||
if (entry^.__end=next^.start) and
|
if (entry^.__end=next^.start) and
|
||||||
(entry^.source + esize=next^.source) and
|
compare_obj_list(entry,esize,next) then
|
||||||
compare_obj_list(entry,next) then
|
|
||||||
begin
|
begin
|
||||||
vm_track_map_entry_unlink(map, next);
|
vm_track_map_entry_unlink(map, next);
|
||||||
entry^.__end:=next^.__end;
|
entry^.__end:=next^.__end;
|
||||||
|
@ -1000,6 +1022,7 @@ begin
|
||||||
vm_track_entry_dispose(map, nil, next);
|
vm_track_entry_dispose(map, nil, next);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _vm_track_map_clip_start(map:p_vm_track_map;entry:p_vm_track_map_entry;start:vm_offset_t);
|
procedure _vm_track_map_clip_start(map:p_vm_track_map;entry:p_vm_track_map_entry;start:vm_offset_t);
|
||||||
|
@ -1015,10 +1038,11 @@ begin
|
||||||
|
|
||||||
new_entry^.__end:=start;
|
new_entry^.__end:=start;
|
||||||
|
|
||||||
entry^.source:=entry^.source + (start - entry^.start);
|
copy_obj_list(entry,new_entry,0);
|
||||||
entry^.start :=start;
|
|
||||||
|
|
||||||
copy_obj_list(entry,new_entry);
|
inc_obj_list(entry,(start - entry^.start));
|
||||||
|
|
||||||
|
entry^.start:=start;
|
||||||
|
|
||||||
vm_track_map_entry_link(map, entry^.prev, new_entry);
|
vm_track_map_entry_link(map, entry^.prev, new_entry);
|
||||||
end;
|
end;
|
||||||
|
@ -1044,9 +1068,7 @@ begin
|
||||||
|
|
||||||
entry^.__end:=__end;
|
entry^.__end:=__end;
|
||||||
|
|
||||||
new_entry^.source:=new_entry^.source + (__end - entry^.start);
|
copy_obj_list(entry,new_entry,(__end - entry^.start));
|
||||||
|
|
||||||
copy_obj_list(entry,new_entry);
|
|
||||||
|
|
||||||
vm_track_map_entry_link(map, entry, new_entry);
|
vm_track_map_entry_link(map, entry, new_entry);
|
||||||
end;
|
end;
|
||||||
|
@ -1061,7 +1083,7 @@ end;
|
||||||
|
|
||||||
function _vm_track_map_insert(map:p_vm_track_map;start,__end,source:vm_offset_t;obj:p_vm_track_object):Integer;
|
function _vm_track_map_insert(map:p_vm_track_map;start,__end,source:vm_offset_t;obj:p_vm_track_object):Integer;
|
||||||
var
|
var
|
||||||
current,entry:p_vm_track_map_entry;
|
entry:p_vm_track_map_entry;
|
||||||
begin
|
begin
|
||||||
if (start>=__end) then
|
if (start>=__end) then
|
||||||
begin
|
begin
|
||||||
|
@ -1080,23 +1102,21 @@ begin
|
||||||
vm_track_map_clip_start(map, entry, start);
|
vm_track_map_clip_start(map, entry, start);
|
||||||
end else
|
end else
|
||||||
begin
|
begin
|
||||||
entry:=vm_track_map_insert_internal(map,entry,start,__end,source);
|
entry:=vm_track_map_insert_internal(map,entry,start,__end);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
current:=entry;
|
while (entry<>@map^.header) and (entry^.start<__end) do
|
||||||
while (current<>@map^.header) and (current^.start<__end) do
|
|
||||||
begin
|
begin
|
||||||
vm_track_map_clip_end(map, current, __end);
|
vm_track_map_clip_end(map, entry, __end);
|
||||||
|
|
||||||
current:=vm_track_map_insert_internal(map,current,
|
entry:=vm_track_map_insert_internal(map,entry,
|
||||||
current^.__end, //start
|
entry^.__end, //start
|
||||||
__end, //__end
|
__end //__end
|
||||||
source+(current^.__end-start)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
vm_track_entry_add_obj(map^.pmap,current,obj);
|
vm_track_entry_add_obj(map^.pmap,entry,obj,source+(entry^.start-start));
|
||||||
|
|
||||||
current:=current^.next;
|
entry:=entry^.next;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Result:=(KERN_SUCCESS);
|
Result:=(KERN_SUCCESS);
|
||||||
|
@ -1417,9 +1437,9 @@ begin
|
||||||
Result:=(KERN_SUCCESS);
|
Result:=(KERN_SUCCESS);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function vm_track_map_trigger(map:p_vm_track_map;start,__end:vm_offset_t;exclude:Pointer;mode:Integer):Integer;
|
function vm_track_map_trigger(map:p_vm_track_map;start,__end:vm_offset_t;exclude:Pointer;mode:T_TRIGGER_MODE):Integer;
|
||||||
var
|
var
|
||||||
current,entry:p_vm_track_map_entry;
|
entry:p_vm_track_map_entry;
|
||||||
node:p_vm_track_object_instance;
|
node:p_vm_track_object_instance;
|
||||||
|
|
||||||
diff:vm_offset_t;
|
diff:vm_offset_t;
|
||||||
|
@ -1456,20 +1476,10 @@ begin
|
||||||
entry:=entry^.next;
|
entry:=entry^.next;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
current:=entry;
|
while (entry<>@map^.header) and (entry^.start<__end) do
|
||||||
while (current<>@map^.header) and (current^.start<__end) do
|
|
||||||
begin
|
begin
|
||||||
node:=vm_track_first_instance(entry^.instances);
|
node:=vm_track_first_instance(entry^.instances);
|
||||||
|
|
||||||
//remap with source
|
|
||||||
//diff:=entry^.start-start;
|
|
||||||
//
|
|
||||||
//s_start:=entry^.source-diff;
|
|
||||||
//s___end:=s_start+size;
|
|
||||||
|
|
||||||
s_start:=start;
|
|
||||||
s___end:=__end;
|
|
||||||
|
|
||||||
while (node<>nil) do
|
while (node<>nil) do
|
||||||
begin
|
begin
|
||||||
//vm_track_list_add_obj(list,node^.obj); //deferred
|
//vm_track_list_add_obj(list,node^.obj); //deferred
|
||||||
|
@ -1477,7 +1487,14 @@ begin
|
||||||
//remap with source
|
//remap with source
|
||||||
if (node^.obj<>exclude) then
|
if (node^.obj<>exclude) then
|
||||||
begin
|
begin
|
||||||
ret:=vm_track_object_trigger(map,node^.obj,s_start,s___end,mode);
|
|
||||||
|
//remap with source
|
||||||
|
diff:=entry^.start-start;
|
||||||
|
//
|
||||||
|
s_start:=node^.source-diff;
|
||||||
|
s___end:=s_start+size;
|
||||||
|
|
||||||
|
ret:=vm_track_object_trigger(node^.obj,s_start,s___end,mode);
|
||||||
|
|
||||||
if ((ret and DO_DELETE)<>0) then
|
if ((ret and DO_DELETE)<>0) then
|
||||||
begin
|
begin
|
||||||
|
@ -1494,7 +1511,7 @@ begin
|
||||||
node:=vm_track_next_instance(entry^.instances,node);
|
node:=vm_track_next_instance(entry^.instances,node);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
current:=current^.next;
|
entry:=entry^.next;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
//iterate
|
//iterate
|
||||||
|
@ -1532,7 +1549,7 @@ begin
|
||||||
vm_track_map_unlock(map);
|
vm_track_map_unlock(map);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function vm_track_map_next_object(map:p_vm_track_map;start:vm_offset_t;obj:p_vm_track_object;htype:Byte):p_vm_track_object;
|
function vm_track_map_next_object(map:p_vm_track_map;start:vm_offset_t;obj:p_vm_track_object;htype:T_THANDLE_TYPE):p_vm_track_object;
|
||||||
var
|
var
|
||||||
entry:p_vm_track_map_entry;
|
entry:p_vm_track_map_entry;
|
||||||
node:p_vm_track_object_instance;
|
node:p_vm_track_object_instance;
|
||||||
|
|
|
@ -12,6 +12,7 @@ uses
|
||||||
|
|
||||||
kern_proc,
|
kern_proc,
|
||||||
vm_map,
|
vm_map,
|
||||||
|
vm_tracking_map,
|
||||||
|
|
||||||
Vulkan,
|
Vulkan,
|
||||||
vDependence,
|
vDependence,
|
||||||
|
@ -690,7 +691,7 @@ begin
|
||||||
begin
|
begin
|
||||||
|
|
||||||
//deffered trigger
|
//deffered trigger
|
||||||
vm_map_track_trigger(p_proc.p_vmspace,node^.start,node^.__end,node^.exclude,2);
|
vm_map_track_trigger(p_proc.p_vmspace,node^.start,node^.__end,node^.exclude,M_GPU_APPLY);
|
||||||
|
|
||||||
FPlannedTriggers.delete(node);
|
FPlannedTriggers.delete(node);
|
||||||
OnFree(node);
|
OnFree(node);
|
||||||
|
@ -706,7 +707,7 @@ Var
|
||||||
node:p_cmd_track_deferred;
|
node:p_cmd_track_deferred;
|
||||||
begin
|
begin
|
||||||
//planned trigger
|
//planned trigger
|
||||||
vm_map_track_trigger(p_proc.p_vmspace,start,__end,exclude,1);
|
vm_map_track_trigger(p_proc.p_vmspace,start,__end,exclude,M_GPU_PLANNED);
|
||||||
|
|
||||||
tmp:=Default(t_cmd_track_deferred);
|
tmp:=Default(t_cmd_track_deferred);
|
||||||
tmp.start :=start;
|
tmp.start :=start;
|
||||||
|
|
|
@ -211,7 +211,7 @@ begin
|
||||||
Result:=DO_DELETE;
|
Result:=DO_DELETE;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function on_trigger(handle:Pointer;mode:Integer):Integer; SysV_ABI_CDecl;
|
function on_trigger(handle:Pointer;mode:T_TRIGGER_MODE):Integer; SysV_ABI_CDecl;
|
||||||
var
|
var
|
||||||
image:TvCustomImage2;
|
image:TvCustomImage2;
|
||||||
i:Integer;
|
i:Integer;
|
||||||
|
@ -223,15 +223,17 @@ begin
|
||||||
//Writeln('on_trigger image');
|
//Writeln('on_trigger image');
|
||||||
|
|
||||||
case mode of
|
case mode of
|
||||||
0://direct
|
M_CPU_WRITE,
|
||||||
|
M_DMEM_WRITE:
|
||||||
|
//direct
|
||||||
begin
|
begin
|
||||||
System.InterlockedIncrement(image.change_rate.trigger);
|
System.InterlockedIncrement(image.change_rate.trigger);
|
||||||
end;
|
end;
|
||||||
1://planned
|
M_GPU_PLANNED://planned
|
||||||
begin
|
begin
|
||||||
System.InterlockedIncrement(image.change_rate.planned);
|
System.InterlockedIncrement(image.change_rate.planned);
|
||||||
end;
|
end;
|
||||||
2://differed
|
M_GPU_APPLY://differed
|
||||||
begin
|
begin
|
||||||
i:=System.InterlockedExchangeAdd(image.change_rate.planned,0);
|
i:=System.InterlockedExchangeAdd(image.change_rate.planned,0);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue