This commit is contained in:
Pavel 2024-05-13 11:52:54 +03:00
parent 95ad2fd843
commit 7ef7b5d77c
10 changed files with 250 additions and 52 deletions

View File

@ -1,7 +1,7 @@
object frmCfgEditor: TfrmCfgEditor
Left = 298
Left = 407
Height = 323
Top = 125
Top = 214
Width = 400
Caption = 'Config Editor'
ClientHeight = 323
@ -13,11 +13,11 @@ object frmCfgEditor: TfrmCfgEditor
Height = 274
Top = 0
Width = 397
ActivePage = Tab_MainInfo
ActivePage = Tab_JIT
Align = alCustom
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Bottom = 10
TabIndex = 0
TabIndex = 2
TabOrder = 0
object Tab_MainInfo: TTabSheet
Caption = 'Main'
@ -161,6 +161,78 @@ object frmCfgEditor: TfrmCfgEditor
TabOrder = 4
end
end
object Tab_JIT: TTabSheet
Caption = 'JIT'
ClientHeight = 246
ClientWidth = 389
object Edt_JITInfo_print_asm: TCheckBox
AnchorSideLeft.Control = Tab_JIT
AnchorSideTop.Control = Tab_JIT
AnchorSideRight.Control = Tab_JIT
AnchorSideRight.Side = asrBottom
Left = 10
Height = 19
Top = 10
Width = 369
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'print asm code'
TabOrder = 0
end
object Edt_JITInfo_debug_info: TCheckBox
AnchorSideLeft.Control = Tab_JIT
AnchorSideTop.Control = Edt_JITInfo_print_asm
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_JIT
AnchorSideRight.Side = asrBottom
Left = 10
Height = 19
Top = 39
Width = 369
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Inline debug info'
TabOrder = 1
end
object Edt_JITInfo_relative_analize: TCheckBox
AnchorSideLeft.Control = Tab_JIT
AnchorSideTop.Control = Edt_JITInfo_debug_info
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_JIT
AnchorSideRight.Side = asrBottom
Left = 10
Height = 19
Top = 68
Width = 369
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Try relative analize'
TabOrder = 2
end
object Edt_JITInfo_memory_guard: TCheckBox
AnchorSideLeft.Control = Tab_JIT
AnchorSideTop.Control = Edt_JITInfo_relative_analize
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Tab_JIT
AnchorSideRight.Side = asrBottom
Left = 10
Height = 19
Top = 97
Width = 369
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 10
BorderSpacing.Top = 10
BorderSpacing.Right = 10
Caption = 'Guest memory guard'
TabOrder = 3
end
end
end
object BtnCancel: TButton
AnchorSideLeft.Control = Owner

View File

@ -18,14 +18,19 @@ type
BtnCancel: TButton;
BtnOk: TButton;
Edt_BootparamInfo_halt_on_exit: TCheckBox;
Edt_JITInfo_debug_info: TCheckBox;
Edt_JITInfo_relative_analize: TCheckBox;
Edt_JITInfo_print_asm: TCheckBox;
Edt_BootparamInfo_print_guest_syscall: TCheckBox;
Edt_BootparamInfo_print_pmap: TCheckBox;
Edt_BootparamInfo_print_jit_preload: TCheckBox;
Edt_JITInfo_memory_guard: TCheckBox;
Edt_MainInfo_fork_proc: TCheckBox;
Edt_MainInfo_LogFile: TEdit;
Edt_BootparamInfo_neo: TCheckBox;
EditPages: TPageControl;
Label1: TLabel;
Tab_JIT: TTabSheet;
Tab_MainInfo: TTabSheet;
Tab_BootparamInfo: TTabSheet;
procedure BtnCancelClick(Sender: TObject);
@ -37,7 +42,7 @@ type
private
public
FMainConfigInfo:TMainConfigInfo;
FConfigInfo:TConfigInfo;
end;
var
@ -206,7 +211,7 @@ var
begin
EditPages.ActivePageIndex:=0;
i:=FMainConfigInfo.GetPropertyIterator;
i:=FConfigInfo.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
@ -217,7 +222,7 @@ begin
tkClass:
begin
obj:=p.GetValue(FMainConfigInfo).AsObject;
obj:=p.GetValue(FConfigInfo).AsObject;
if (obj<>nil) then
if obj.InheritsFrom(TAbstractInfo) then
@ -244,7 +249,7 @@ var
p:TRttiProperty;
obj:TObject;
begin
i:=FMainConfigInfo.GetPropertyIterator;
i:=FConfigInfo.GetPropertyIterator;
try
while (i.GetProperty<>nil) do
begin
@ -255,7 +260,7 @@ begin
tkClass:
begin
obj:=p.GetValue(FMainConfigInfo).AsObject;
obj:=p.GetValue(FConfigInfo).AsObject;
if (obj<>nil) then
if obj.InheritsFrom(TAbstractInfo) then

View File

@ -1,7 +1,7 @@
object frmGameEditor: TfrmGameEditor
Left = 778
Left = 693
Height = 319
Top = 146
Top = 166
Width = 397
Caption = 'Game editor'
ClientHeight = 319

View File

@ -52,6 +52,21 @@ type
property print_jit_preload :Boolean read Fprint_jit_preload write Fprint_jit_preload ;
end;
TJITInfo=class(TAbstractInfo)
private
Fprint_asm :Boolean;
Fdebug_info :Boolean;
Frelative_analize:Boolean;
Fmemory_guard :Boolean;
published
property print_asm :Boolean read Fprint_asm write Fprint_asm ;
property debug_info :Boolean read Fdebug_info write Fdebug_info ;
property relative_analize:Boolean read Frelative_analize write Frelative_analize;
property memory_guard :Boolean read Fmemory_guard write Fmemory_guard ;
public
Constructor Create; override;
end;
TMainInfo=class(TAbstractInfo)
private
FLogFile :RawByteString;
@ -63,13 +78,15 @@ type
Constructor Create; override;
end;
TMainConfigInfo=class(TAbstractInfo)
TConfigInfo=class(TAbstractInfo)
private
FMainInfo :TMainInfo;
FBootParamInfo:TBootParamInfo;
FJITInfo :TJITInfo;
published
property MainInfo :TMainInfo read FMainInfo write FMainInfo;
property MainInfo :TMainInfo read FMainInfo write FMainInfo;
property BootParamInfo:TBootParamInfo read FBootParamInfo write FBootParamInfo;
property JITInfo :TJITInfo read FJITInfo write FJITInfo;
end;
TGameInfo=class(TAbstractInfo)
@ -109,9 +126,22 @@ type
FMountList:TMountList;
FLock :Boolean;
public
Constructor Create; override;
Constructor Create; override;
Destructor Destroy; override;
Procedure Serialize(Stream:TStream); override;
Procedure Serialize (Stream:TStream); override;
Procedure Deserialize(Stream:TStream); override;
end;
TGameStartupInfo=class(TAbstractInfo)
public
FReader :Boolean;
FPipe :THandle;
FConfInfo:TConfigInfo;
FGameItem:TGameItem;
public
Constructor Create(Reader:Boolean); reintroduce;
Destructor Destroy; override;
Procedure Serialize (Stream:TStream); override;
Procedure Deserialize(Stream:TStream); override;
end;
@ -349,7 +379,6 @@ begin
obj.Free;
end;
p.SetValue(Self,TObject(nil));
end;
i.Next;
@ -455,6 +484,12 @@ begin
end;
end;
Constructor TJITInfo.Create;
begin
inherited;
Frelative_analize:=True;
end;
Constructor TMainInfo.Create;
begin
inherited;
@ -483,7 +518,6 @@ begin
inherited;
FGameInfo :=TGameInfo .Create;
FMountList:=TMountList.Create;
inherited;
end;
Destructor TGameItem.Destroy;
@ -493,6 +527,8 @@ begin
inherited;
end;
//
Procedure TGameItem.Serialize(Stream:TStream);
begin
FGameInfo .Serialize(Stream);
@ -505,6 +541,44 @@ begin
FMountList.Deserialize(Stream);
end;
//
Constructor TGameStartupInfo.Create(Reader:Boolean);
begin
inherited Create;
FReader:=Reader;
if FReader then
begin
FConfInfo:=TConfigInfo.Create;
FGameItem:=TGameItem.Create;
end;
end;
Destructor TGameStartupInfo.Destroy;
begin
if FReader then
begin
FreeAndNil(FConfInfo);
FreeAndNil(FGameItem);
end;
inherited;
end;
Procedure TGameStartupInfo.Serialize(Stream:TStream);
begin
Stream.Write(FPipe,SizeOf(THandle));
FConfInfo.Serialize(Stream);
FGameItem.Serialize(Stream);
end;
Procedure TGameStartupInfo.Deserialize(Stream:TStream);
begin
FPipe:=0;
Stream.Read(FPipe,SizeOf(THandle));
FConfInfo.Deserialize(Stream);
FGameItem.Deserialize(Stream);
end;
end.

View File

@ -21,7 +21,8 @@ type
hOutput:THandle;
hError :THandle;
fork_proc:Boolean;
FConfInfo:TConfigInfo;
FGameItem:TGameItem;
end;
TGameProcessSimple=class(TGameProcess)
@ -31,7 +32,7 @@ type
Destructor Destroy; override;
end;
function run_item(const cfg:TGameRunConfig;Item:TGameItem):TGameProcess;
function run_item(const cfg:TGameRunConfig):TGameProcess;
implementation
@ -51,6 +52,9 @@ uses
md_game_process,
kern_jit,
kern_jit_ctx,
dev_dce,
display_soft,
@ -61,6 +65,8 @@ uses
ps4_libSceMbus,
ps4_libSceDialogs,
ps4_libSceAvSetting,
//ps4_libSceDiscMap,
//ps4_libSceNpManager,
//internal libs
kern_rtld,
@ -109,13 +115,35 @@ begin
//debug_tty.t_update :=@WakeMainThread;
end;
procedure prepare(Item:TGameItem); SysV_ABI_CDecl;
procedure load_config(ConfInfo:TConfigInfo);
begin
sys_bootparam.set_neo_mode(ConfInfo.BootParamInfo.Neo);
sys_bootparam.p_halt_on_exit :=ConfInfo.BootParamInfo.halt_on_exit;
sys_bootparam.p_print_guest_syscall:=ConfInfo.BootParamInfo.print_guest_syscall;
sys_bootparam.p_print_pmap :=ConfInfo.BootParamInfo.print_pmap;
sys_bootparam.p_print_jit_preload :=ConfInfo.BootParamInfo.print_jit_preload;
//
kern_jit.print_asm :=ConfInfo.JITInfo.print_asm;
kern_jit.debug_info:=ConfInfo.JITInfo.debug_info;
kern_jit_ctx.jit_relative_analize:=ConfInfo.JITInfo.relative_analize;
kern_jit_ctx.jit_memory_guard :=ConfInfo.JITInfo.memory_guard;
//
end;
procedure prepare(GameStartupInfo:TGameStartupInfo); SysV_ABI_CDecl;
var
td:p_kthread;
err:Integer;
len:Integer;
exec:array[0..PATH_MAX] of Char;
argv:array[0..1] of PChar;
Item:TGameItem;
begin
//re_init_tty;
//init_tty:=@re_init_tty;
@ -123,6 +151,8 @@ begin
//init all
sys_init;
load_config(GameStartupInfo.FConfInfo);
if (p_host_ipc<>nil) then
begin
THostIpcConnect(p_host_ipc).thread_new;
@ -134,6 +164,8 @@ begin
dev_dce.dce_interface:=display_soft.TDisplayHandleSoft;
Item:=GameStartupInfo.FGameItem;
g_appinfo.mmap_flags:=1; //is_big_app ???
g_appinfo.CUSANAME:=Item.FGameInfo.TitleId;
//g_appinfo.hasParamSfo
@ -190,10 +222,14 @@ begin
td:=curkthread;
td^.td_pflags:=td^.td_pflags and (not TDP_KTHREAD);
//
FreeAndNil(GameStartupInfo);
//
err:=main_execve(argv[0],@argv[0],nil);
if (err<>0) then
begin
print_error_td('error execve "'+Item.FGameInfo.Exec+'" code='+IntToStr(err));
print_error_td('error execve "'+exec+'" code='+IntToStr(err));
end;
//
@ -229,14 +265,14 @@ var
kipc:THostIpcPipeKERN;
mem:TPCharStream;
Item:TGameItem;
GameStartupInfo:TGameStartupInfo;
begin
//while not IsDebuggerPresent do sleep(100);
mem:=TPCharStream.Create(data,size);
mem.Read(pipefd,SizeOf(THandle));
Item:=TGameItem.Create;
Item.Deserialize(mem);
GameStartupInfo:=TGameStartupInfo.Create(True);
GameStartupInfo.Deserialize(mem);
mem.Free;
@ -245,6 +281,7 @@ begin
parent:=md_pidfd_open(md_getppid);
pipefd:=GameStartupInfo.FPipe;
pipefd:=md_pidfd_getfd(parent,pipefd);
kipc:=THostIpcPipeKERN.Create;
@ -253,13 +290,13 @@ begin
p_host_ipc:=kipc;
td:=nil;
r:=kthread_add(@prepare,Item,@td,0,'[main]');
r:=kthread_add(@prepare,GameStartupInfo,@td,0,'[main]');
Assert(r=0);
msleep_td(0);
end;
function run_item(const cfg:TGameRunConfig;Item:TGameItem):TGameProcess;
function run_item(const cfg:TGameRunConfig):TGameProcess;
var
r:Integer;
@ -274,19 +311,24 @@ var
s_kern_ipc:THostIpcSimpleKERN;
s_mgui_ipc:THostIpcSimpleMGUI;
GameStartupInfo:TGameStartupInfo;
mem:TMemoryStream;
begin
Result:=nil;
GameStartupInfo:=TGameStartupInfo.Create(False);
GameStartupInfo.FConfInfo:=cfg.FConfInfo;
GameStartupInfo.FGameItem:=cfg.FGameItem;
SetStdHandle(STD_OUTPUT_HANDLE,cfg.hOutput);
SetStdHandle(STD_ERROR_HANDLE ,cfg.hError );
fork_info:=Default(t_fork_proc);
if cfg.fork_proc then
if cfg.FConfInfo.MainInfo.fork_proc then
begin
Result:=TGameProcessPipe.Create;
Result.g_fork:=cfg.fork_proc;
Result.g_fork:=True;
with TGameProcessPipe(Result) do
begin
@ -303,9 +345,9 @@ begin
mem:=TMemoryStream.Create;
mem.Write(kern2mgui[1],SizeOf(THandle));
Item.Serialize(mem);
GameStartupInfo.FPipe:=kern2mgui[1];
GameStartupInfo.Serialize(mem);
FreeAndNil(GameStartupInfo);
fork_info.hInput :=GetStdHandle(STD_INPUT_HANDLE);
fork_info.hOutput:=cfg.hOutput;
@ -321,7 +363,7 @@ begin
end else
begin
Result:=TGameProcessSimple.Create;
Result.g_fork:=cfg.fork_proc;
Result.g_fork:=False;
with TGameProcessSimple(Result) do
begin
@ -337,7 +379,7 @@ begin
p_host_ipc:=s_kern_ipc;
Ftd:=nil;
r:=kthread_add(@prepare,Item,@Ftd,0,'[main]');
r:=kthread_add(@prepare,GameStartupInfo,@Ftd,0,'[main]');
fork_info.fork_pid:=GetProcessID;
end;

View File

@ -1,7 +1,7 @@
object frmMain: TfrmMain
Left = 342
Left = 305
Height = 343
Top = 294
Top = 335
Width = 623
Caption = 'fpPS4'
ClientHeight = 343

View File

@ -83,7 +83,7 @@ type
FIniFile:TIniFile;
FMainConfigInfo:TMainConfigInfo;
FConfigInfo:TConfigInfo;
FAddHandle:THandle;
FGetHandle:THandle;
@ -267,7 +267,7 @@ begin
IpcHandler.Form:=Self;
//main
FMainConfigInfo.MainInfo.ReadIni(FIniFile,'main');
FConfigInfo.MainInfo.ReadIni(FIniFile,'main');
//main
//games
@ -387,13 +387,13 @@ procedure TfrmMain.FormCreate(Sender: TObject);
var
r:RawByteString;
begin
FMainConfigInfo:=TMainConfigInfo.Create;
FConfigInfo:=TConfigInfo.Create;
FIniFile:=TIniFile.Create('fpps4.ini');
ReadIniFile;
OpenLog(FMainConfigInfo.MainInfo.LogFile);
OpenLog(FConfigInfo.MainInfo.LogFile);
if (Application.Tag<>0) then
begin
@ -609,7 +609,7 @@ begin
if (frmCfgEditor=nil) then
begin
frmCfgEditor:=TfrmCfgEditor.Create(Self);
frmCfgEditor.FMainConfigInfo:=FMainConfigInfo;
frmCfgEditor.FConfigInfo:=FConfigInfo;
end;
frmCfgEditor.FormInit;
@ -651,11 +651,12 @@ begin
cfg.hOutput:=FAddHandle;
cfg.hError :=FAddHandle;
cfg.fork_proc:=FMainConfigInfo.MainInfo.fork_proc;
cfg.FConfInfo:=FConfigInfo;
cfg.FGameItem:=Item;
if Item.FLock then Exit;
FGameProcess:=run_item(cfg,Item);
FGameProcess:=run_item(cfg);
if (FGameProcess<>nil) then
begin

View File

@ -240,8 +240,12 @@ begin
dmap:=dmem_maps[default_pool_id];
//eflags = flags & MAP_NO_COALESCE | 0x20000 | 0x80000
cow:=(flags and MAP_NO_COALESCE) or MAP_COW_UNK;
//entry->eflags = flags & 0x400000 | 0x20000 | 0x80000
//0x400000 -> MAP_ENTRY_NO_COALESCE -> MAP_NO_COALESCE
//0x20000 -> not simplify ???
//0x80000 -> ???
cow:=(flags and MAP_NO_COALESCE);
vm_map_lock(map);

View File

@ -110,7 +110,7 @@ const
MAP_ENTRY_VN_WRITECNT =$10000; // writeable vnode mapping
//0x20000
//0x20000 not simplify ???
//0x40000
//0x80000
@ -138,7 +138,7 @@ const
MAP_ACC_NO_CHARGE =$8000;
MAP_COW_SYSTEM =$10000;
MAP_COW_UNK =$20000;
MAP_COW_NO_BUDGET =$20000;
MAP_COW_KERNEL =$40000;
MAP_COW_NO_COALESCE =$400000;
@ -1033,7 +1033,7 @@ begin
protoeflags:=0;
charge_prev_obj:=FALSE;
protoeflags:=protoeflags or (cow and (MAP_COW_NO_COALESCE or MAP_COW_UNK));
protoeflags:=protoeflags or (cow and (MAP_COW_NO_COALESCE or MAP_COW_NO_BUDGET));
if ((cow and MAP_COPY_ON_WRITE)<>0) then
begin
@ -1085,7 +1085,7 @@ charged:
//budget
if (max=0) or
((cow and MAP_COW_UNK)<>0) or
((cow and MAP_COW_NO_BUDGET)<>0) or
(p_proc.p_budget_ptype=-1) then
begin
//
@ -1488,7 +1488,7 @@ var
obj:vm_map_object;
sdk_5:Boolean;
begin
if ((entry^.eflags and (MAP_ENTRY_IS_SUB_MAP or MAP_COW_UNK or MAP_ENTRY_IN_TRANSITION))<>0) or
if ((entry^.eflags and (MAP_ENTRY_IS_SUB_MAP or $20000 or MAP_ENTRY_IN_TRANSITION))<>0) or
(entry^.inheritance=VM_INHERIT_HOLE) then
begin
Exit;

View File

@ -484,7 +484,7 @@ begin
if (handle_type=OBJT_BLOCKPOOL) then
begin
docow:=docow or (MAP_COW_UNK or MAP_COW_NO_COALESCE);
docow:=docow or (MAP_COW_NO_BUDGET or MAP_COW_NO_COALESCE);
end else
begin
docow:=docow or (flags and MAP_NO_COALESCE);