diff --git a/fpPS4.lpi b/fpPS4.lpi
index 2c81f3bb..87920e18 100644
--- a/fpPS4.lpi
+++ b/fpPS4.lpi
@@ -1486,6 +1486,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/gui/cfg_edit.lfm b/gui/cfg_edit.lfm
index 344ce4e0..e908bfb1 100644
--- a/gui/cfg_edit.lfm
+++ b/gui/cfg_edit.lfm
@@ -1,7 +1,7 @@
object frmCfgEditor: TfrmCfgEditor
- Left = 473
+ Left = 422
Height = 319
- Top = 205
+ Top = 234
Width = 400
Caption = 'Config Editor'
ClientHeight = 319
@@ -543,7 +543,7 @@ object frmCfgEditor: TfrmCfgEditor
Anchors = [akLeft, akBottom]
BorderSpacing.Left = 10
BorderSpacing.Bottom = 10
- Caption = 'ok'
+ Caption = 'OK'
TabOrder = 1
OnClick = BtnOkClick
end
diff --git a/gui/game_edit.lfm b/gui/game_edit.lfm
index 28e58894..01c646b6 100644
--- a/gui/game_edit.lfm
+++ b/gui/game_edit.lfm
@@ -1,14 +1,14 @@
object frmGameEditor: TfrmGameEditor
- Left = 632
+ Left = 497
Height = 319
- Top = 214
+ Top = 119
Width = 397
Caption = 'Game editor'
ClientHeight = 319
ClientWidth = 397
OnClose = FormClose
Position = poMainFormCenter
- LCLVersion = '3.4.0.0'
+ LCLVersion = '3.6.0.0'
object EditPages: TPageControl
AnchorSideBottom.Control = BtnOk
Left = 0
@@ -108,7 +108,7 @@ object frmGameEditor: TfrmGameEditor
Anchors = [akLeft, akBottom]
BorderSpacing.Left = 10
BorderSpacing.Bottom = 10
- Caption = 'ok'
+ Caption = 'OK'
TabOrder = 1
OnClick = BtnOkClick
end
diff --git a/gui/game_info.pas b/gui/game_info.pas
index 81f0fd76..00a975cf 100644
--- a/gui/game_info.pas
+++ b/gui/game_info.pas
@@ -383,8 +383,9 @@ begin
tkAString:S:=S+'"'+StringToJSONString(value.AsString,False)+'"';
tkInteger:S:=S+IntToStr(value.AsInteger);
+ tkQWord :S:=S+IntToStr(value.AsUInt64);
- tkBool:S:=S+BoolToStr(value.AsBoolean,'true','false');
+ tkBool :S:=S+BoolToStr(value.AsBoolean,'true','false');
else
Assert(False);
@@ -633,8 +634,9 @@ begin
tkAString:Stream.WriteAnsiString(p.GetValue(Self).AsString);
tkInteger:Stream.WriteDWord(p.GetValue(Self).AsInteger);
+ tkQWord :Stream.WriteQWord(p.GetValue(Self).AsInteger);
- tkBool:Stream.WriteByte(Byte(p.GetValue(Self).AsBoolean));
+ tkBool :Stream.WriteByte(Byte(p.GetValue(Self).AsBoolean));
tkClass:
begin
@@ -673,13 +675,15 @@ begin
TypeKind:=p.PropertyType.TypeKind;
case TypeKind of
+
tkSString,
tkLString,
tkAString:p.SetValue(Self,Stream.ReadAnsiString);
tkInteger:p.SetValue(Self,Integer(Stream.ReadDWord));
+ tkQWord :p.SetValue(Self,QWord (Stream.ReadQWord));
- tkBool:p.SetValue(Self,Boolean(Stream.ReadByte));
+ tkBool :p.SetValue(Self,Boolean(Stream.ReadByte));
tkClass:
begin
@@ -727,6 +731,7 @@ begin
tkLString,
tkAString,
tkInteger,
+ tkQWord ,
tkBool :p.SetValue(dst,p.GetValue(Self));
tkClass:
@@ -855,6 +860,7 @@ begin
tkLString,
tkAString,
tkInteger,
+ tkQWord ,
tkBool :Stream.WriteValue(p.Name,p.GetValue(Self));
tkClass:
@@ -882,13 +888,101 @@ begin
end;
Procedure TAbstractArray.Serialize(Stream:TStream);
+var
+ i,c:SizeInt;
+ V:TValue;
+ obj:TObject;
begin
- Assert(false);
+ c:=GetArrayCount;
+
+ Stream.WriteQWord(c); //Size Header
+
+ if (c<>0) then
+ For i:=0 to c-1 do
+ begin
+ V:=GetArrayItem(i);
+
+ Stream.WriteDWord(DWORD(V.Kind)); //Type Header
+
+ case V.Kind of
+
+ tkSString,
+ tkLString,
+ tkAString:Stream.WriteAnsiString(V.AsString);
+
+ tkInteger:Stream.WriteDWord(V.AsInteger);
+ tkQWord :Stream.WriteQWord(V.AsUInt64);
+
+ tkBool :Stream.WriteByte(Byte(V.AsBoolean));
+
+ tkClass:
+ begin
+ //Use Class Header?
+ obj:=V.AsObject;
+
+ if (obj<>nil) then
+ if obj.InheritsFrom(TAbstractObject) then
+ begin
+ TAbstractObject(obj).Serialize(Stream);
+ end;
+ end;
+
+ else
+ Assert(false);
+ end;
+
+ end;
end;
Procedure TAbstractArray.Deserialize(Stream:TStream);
+var
+ i,c:SizeInt;
+ Kind:TTypeKind;
+ V:TValue;
+ obj:TObject;
begin
- Assert(false);
+ c:=Stream.ReadQWord; //Size Header
+
+ if (c<>0) then
+ For i:=0 to c-1 do
+ begin
+ V:=Default(TValue);
+
+ Kind:=TTypeKind(Stream.ReadDWord); //Type Header
+
+ case Kind of
+
+ tkSString,
+ tkLString,
+ tkAString:V:=Stream.ReadAnsiString;
+
+ tkInteger:V:=Integer(Stream.ReadDWord);
+ tkQWord :V:=QWord (Stream.ReadQWord);
+
+ tkBool :V:=Boolean(Stream.ReadByte);
+
+ tkClass:
+ begin
+ //Use Class Header?
+ V:=AddObject;
+
+ obj:=V.AsObject;
+
+ if (obj<>nil) then
+ if obj.InheritsFrom(TAbstractObject) then
+ begin
+ TAbstractObject(obj).Deserialize(Stream);
+ end;
+ end;
+
+ else
+ Assert(false);
+ end;
+
+ //save
+ AddValue(V);
+ end;
+
end;
Procedure TAbstractArray.CopyTo(dst:TAbstractObject);
@@ -916,6 +1010,7 @@ begin
tkLString,
tkAString,
tkInteger,
+ tkQWord ,
tkBool :Stream.WriteValue('',V);
tkClass:
diff --git a/gui/game_run.pas b/gui/game_run.pas
index 82073c34..f7fc37ae 100644
--- a/gui/game_run.pas
+++ b/gui/game_run.pas
@@ -8,11 +8,13 @@ uses
windows,
Classes,
SysUtils,
+ CharStream,
Dialogs,
kern_thr,
md_sleep,
md_pipe,
host_ipc,
+ host_ipc_interface,
md_host_ipc,
game_info;
@@ -262,25 +264,6 @@ begin
end;
-type
- TPCharStream=class(TCustomMemoryStream)
- public
- constructor Create(P:PChar;len:SizeUint); virtual; overload;
- procedure SetNew(P:PChar;len:SizeUint);
- end;
-
-constructor TPCharStream.Create(P:PChar;len:SizeUint);
-begin
- inherited Create;
- SetPointer(P,len);
-end;
-
-procedure TPCharStream.SetNew(P:PChar;len:SizeUint);
-begin
- SetPosition(0);
- SetPointer(P,len);
-end;
-
procedure fork_process(data:Pointer;size:QWORD); SysV_ABI_CDecl;
var
td:p_kthread;
@@ -314,7 +297,9 @@ begin
kipc:=THostIpcPipeKERN.Create;
kipc.set_pipe(pipefd);
- p_host_ipc:=kipc;
+ p_host_ipc :=kipc;
+ p_host_handler:=THostIpcHandler.Create;
+ p_host_ipc .FHandler:=p_host_handler;
td:=nil;
r:=kthread_add(@prepare,GameStartupInfo,@td,0,'[main]');
@@ -407,7 +392,9 @@ begin
g_ipc:=s_mgui_ipc;
- p_host_ipc:=s_kern_ipc;
+ p_host_ipc :=s_kern_ipc;
+ p_host_handler:=THostIpcHandler.Create;
+ p_host_ipc .FHandler:=p_host_handler;
Ftd:=nil;
r:=kthread_add(@prepare,GameStartupInfo,@Ftd,0,'[main]');
diff --git a/gui/main.pas b/gui/main.pas
index 4d9c89e9..ccc5b9f6 100644
--- a/gui/main.pas
+++ b/gui/main.pas
@@ -147,10 +147,11 @@ type
FGameMainForm:TGameMainForm;
- function OnKevent (mlen:DWORD;buf:Pointer):Ptruint; //KEV_EVENT
- function OnMainWindows(mlen:DWORD;buf:Pointer):Ptruint; //MAIN_WINDOWS
- function OnCaptionFPS (mlen:DWORD;buf:Pointer):Ptruint; //CAPTION_FPS
- function OnError (mlen:DWORD;buf:Pointer):Ptruint; //ERROR
+ function OnKevent (mlen:DWORD;buf:Pointer):Ptruint; //KEV_EVENT
+ function OnMainWindows (mlen:DWORD;buf:Pointer):Ptruint; //MAIN_WINDOWS
+ function OnCaptionFPS (mlen:DWORD;buf:Pointer):Ptruint; //CAPTION_FPS
+ function OnError (mlen:DWORD;buf:Pointer):Ptruint; //ERROR
+ function OnParamSfoInit(mlen:DWORD;buf:Pointer):Ptruint; //PARAM_SFO_INIT
function get_caption_format:RawByteString;
function OpenMainWindows():THandle;
@@ -177,6 +178,8 @@ var
implementation
uses
+ param_sfo_gui,
+
game_find,
windows,
@@ -396,6 +399,51 @@ begin
end;
end;
+function TfrmMain.OnParamSfoInit(mlen:DWORD;buf:Pointer):Ptruint; //PARAM_SFO_INIT
+var
+ ParamSfo:TParamSfoFile;
+ mem:TMemoryStream;
+ V:RawByteString;
+begin
+ Result:=Ptruint(-1);
+
+ if (FGameItem=nil) then Exit;
+
+ V:=FGameItem.MountList.app0;
+
+ ParamSfo:=LoadParamSfoFile(ExcludeTrailingPathDelimiter(V)+
+ DirectorySeparator+
+ 'sce_sys'+
+ DirectorySeparator+
+ 'param.sfo');
+
+ if (ParamSfo=nil) then
+ begin
+ V:='"{$GAME}/sce_sys/param.sfo" not found, continue?';
+
+ if (MessageDlgEx(V,mtError,[mbOK,mbAbort],Self)=mrOK) then
+ begin
+ Exit(0);
+ end else
+ begin
+ Exit(Ptruint(-1));
+ end;
+ end;
+
+ if (FGameProcess<>nil) then
+ if (FGameProcess.g_ipc<>nil) then
+ begin
+ mem:=TMemoryStream.Create;
+ ParamSfo.Serialize(mem);
+ FreeAndNil(ParamSfo);
+
+ FGameProcess.g_ipc.SendSync(HashIpcStr('PARAM_SFO_LOAD'),mem.Size,mem.Memory);
+ end;
+
+ FreeAndNil(ParamSfo);
+ Result:=0;
+end;
+
//ShowMessage(GetEnumName(TypeInfo(mtype),ord(mtype)));
var
@@ -675,10 +723,11 @@ var
begin
IpcHandler:=THostIpcHandler.Create;
- IpcHandler.AddCallback('KEV_EVENT' ,@OnKevent );
- IpcHandler.AddCallback('MAIN_WINDOWS',@OnMainWindows);
- IpcHandler.AddCallback('CAPTION_FPS' ,@OnCaptionFPS );
- IpcHandler.AddCallback('ERROR' ,@OnError );
+ IpcHandler.AddCallback('KEV_EVENT' ,@OnKevent );
+ IpcHandler.AddCallback('MAIN_WINDOWS' ,@OnMainWindows );
+ IpcHandler.AddCallback('CAPTION_FPS' ,@OnCaptionFPS );
+ IpcHandler.AddCallback('ERROR' ,@OnError );
+ IpcHandler.AddCallback('PARAM_SFO_INIT',@OnParamSfoInit);
ReadConfigFile;
diff --git a/gui/param_sfo_gui.pas b/gui/param_sfo_gui.pas
index 2c776863..5aed477d 100644
--- a/gui/param_sfo_gui.pas
+++ b/gui/param_sfo_gui.pas
@@ -5,7 +5,9 @@ unit param_sfo_gui;
interface
uses
- sysutils;
+ sysutils,
+ rtti,
+ game_info;
const
//sfo_value_format
@@ -38,17 +40,33 @@ type
//
- TParamSfoValue=packed object
- format:ptruint;
- name,value:RawByteString;
- Function GetString:RawByteString;
- Function GetUInt :DWORD;
+ TParamSfoValue=class(TAbstractObject)
+ private
+ Fformat:ptruint;
+ Fname :RawByteString;
+ Fvalue :RawByteString;
+ published
+ property format:ptruint read Fformat write Fformat;
+ property name :RawByteString read Fname write Fname;
+ property value :RawByteString read Fvalue write Fvalue;
+ public
+ Function GetString:RawByteString;
+ Function GetUInt :DWORD;
end;
- TParamSfoFile=class
+ TParamSfoFile=class(TAbstractArray)
params:array of TParamSfoValue;
- Function GetString(const name:RawByteString):RawByteString;
- Function GetUInt (const name:RawByteString):DWORD;
+ //
+ Destructor Destroy; override;
+ //
+ Function GetString(const name:RawByteString):RawByteString;
+ Function GetUInt (const name:RawByteString):DWORD;
+ //
+ Function GetArrayCount:SizeInt; override;
+ Function GetArrayItem(i:SizeInt):TValue; override;
+ Function AddObject:TAbstractObject; override;
+ Function AddArray :TAbstractArray; override;
+ procedure AddValue(Value:TValue); override;
end;
function LoadParamSfoFile(const path:RawByteString):TParamSfoFile;
@@ -159,6 +177,7 @@ begin
SetLength(value,size);
Move(PChar(value_table+entry_table[i].value_offset)^,PChar(value)^,size);
+ Result.params[i]:=TParamSfoValue.Create;
Result.params[i].format:=entry_table[i].format;
Result.params[i].name :=name;
Result.params[i].value :=value;
@@ -213,6 +232,19 @@ begin
end;
end;
+Destructor TParamSfoFile.Destroy;
+var
+ i:Integer;
+begin
+ if (Length(params)=0) then Exit;
+ For i:=0 to High(params) do
+ begin
+ FreeAndNil(params[i]);
+ end;
+ SetLength(params,0);
+ inherited;
+end;
+
Function TParamSfoFile.GetString(const name:RawByteString):RawByteString;
var
i:Integer;
@@ -247,6 +279,38 @@ begin
end;
end;
+//////
+
+Function TParamSfoFile.GetArrayCount:SizeInt;
+begin
+ Result:=Length(params);
+end;
+
+Function TParamSfoFile.GetArrayItem(i:SizeInt):TValue;
+begin
+ if (i>=Length(params)) then
+ begin
+ Result:=TValue.Empty;
+ end else
+ begin
+ Result:=params[i];
+ end;
+end;
+
+Function TParamSfoFile.AddObject:TAbstractObject;
+begin
+ Result:=TParamSfoValue.Create;
+end;
+
+Function TParamSfoFile.AddArray:TAbstractArray;
+begin
+ Result:=nil;
+end;
+
+procedure TParamSfoFile.AddValue(Value:TValue);
+begin
+ Insert(Value.AsObject,params,Length(params));
+end;
end.
diff --git a/rtl/charstream.pas b/rtl/charstream.pas
new file mode 100644
index 00000000..7bd6fbbd
--- /dev/null
+++ b/rtl/charstream.pas
@@ -0,0 +1,32 @@
+unit CharStream;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+uses
+ Classes;
+
+type
+ TPCharStream=class(TCustomMemoryStream)
+ public
+ constructor Create(P:PChar;len:SizeUint); virtual; overload;
+ procedure SetNew(P:PChar;len:SizeUint);
+ end;
+
+implementation
+
+constructor TPCharStream.Create(P:PChar;len:SizeUint);
+begin
+ inherited Create;
+ SetPointer(P,len);
+end;
+
+procedure TPCharStream.SetNew(P:PChar;len:SizeUint);
+begin
+ SetPosition(0);
+ SetPointer(P,len);
+end;
+
+end.
+
diff --git a/src/param_sfo_ipc.pas b/src/param_sfo_ipc.pas
new file mode 100644
index 00000000..f0355f66
--- /dev/null
+++ b/src/param_sfo_ipc.pas
@@ -0,0 +1,96 @@
+unit param_sfo_ipc;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+procedure init_param_sfo;
+function ParamSfoGetString(const name:RawByteString):RawByteString;
+function ParamSfoGetUInt (const name:RawByteString):DWORD;
+
+implementation
+
+uses
+ SysUtils,
+ CharStream,
+ atomic,
+ sys_bootparam,
+ host_ipc_interface,
+ param_sfo_gui,
+ kern_rwlock;
+
+var
+ param_sfo_lock :Pointer=nil;
+ param_sfo_lazy_init:Integer=0;
+ param_sfo_file :TParamSfoFile=nil;
+
+type
+ TParamSfoLoaderIpc=object
+ function OnLoad(mlen:DWORD;buf:Pointer):Ptruint;
+ end;
+
+function TParamSfoLoaderIpc.OnLoad(mlen:DWORD;buf:Pointer):Ptruint;
+var
+ mem:TPCharStream;
+begin
+ Result:=0;
+
+ Writeln('PARAM_SFO_LOAD');
+
+ mem:=TPCharStream.Create(buf,mlen);
+
+ param_sfo_file:=TParamSfoFile.Create;
+ param_sfo_file.Deserialize(mem);
+
+ mem.Free;
+end;
+
+procedure init_param_sfo;
+var
+ Loader:TParamSfoLoaderIpc;
+ err:Integer;
+begin
+ if( param_sfo_lazy_init=2) then Exit;
+
+ if CAS(param_sfo_lazy_init,0,1) then
+ begin
+ rw_wlock(param_sfo_lock);
+
+ p_host_handler.AddCallback('PARAM_SFO_LOAD',@Loader.OnLoad);
+
+ err:=p_host_ipc.SendSync(HashIpcStr('PARAM_SFO_INIT'),0,nil);
+
+ if (err<>0) then
+ begin
+ Assert(false,'PARAM_SFO_INIT error='+IntToStr(err));
+ end;
+
+ param_sfo_lazy_init:=2;
+ rw_wunlock(param_sfo_lock);
+ end else
+ begin
+ //sunc
+ rw_wlock (param_sfo_lock);
+ rw_wunlock(param_sfo_lock);
+ end;
+end;
+
+function ParamSfoGetString(const name:RawByteString):RawByteString;
+begin
+ init_param_sfo;
+ rw_rlock(param_sfo_lock);
+ Result:=param_sfo_file.GetString(name);
+ rw_runlock(param_sfo_lock);
+end;
+
+function ParamSfoGetUInt(const name:RawByteString):DWORD;
+begin
+ init_param_sfo;
+ rw_rlock(param_sfo_lock);
+ Result:=param_sfo_file.GetUInt(name);
+ rw_runlock(param_sfo_lock);
+end;
+
+
+end.
+
diff --git a/src/ps4_libsceappcontent.pas b/src/ps4_libsceappcontent.pas
index 01812ddb..1112058f 100644
--- a/src/ps4_libsceappcontent.pas
+++ b/src/ps4_libsceappcontent.pas
@@ -10,6 +10,9 @@ uses
implementation
+uses
+ param_sfo_ipc;
+
{
uses
sys_path,
@@ -85,6 +88,8 @@ function ps4_sceAppContentInitialize(initParam:PSceAppContentInitParam;bootParam
begin
Writeln('sceAppContentInitialize');
+ param_sfo_ipc.init_param_sfo;
+
Result:=0;
end;
@@ -94,12 +99,10 @@ begin
if (value=nil) then Exit(SCE_APP_CONTENT_ERROR_PARAMETER);
Case SCE_APP_CONTENT_APPPARAM_ID_SKU_FLAG of
SCE_APP_CONTENT_APPPARAM_ID_SKU_FLAG :value^:=SCE_APP_CONTENT_APPPARAM_SKU_FLAG_FULL;
- {
- SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_1:value^:=ParamSfoGetInt('USER_DEFINED_PARAM_1');
- SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_2:value^:=ParamSfoGetInt('USER_DEFINED_PARAM_2');
- SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_3:value^:=ParamSfoGetInt('USER_DEFINED_PARAM_3');
- SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_4:value^:=ParamSfoGetInt('USER_DEFINED_PARAM_4');
- }
+ SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_1:value^:=ParamSfoGetUInt('USER_DEFINED_PARAM_1');
+ SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_2:value^:=ParamSfoGetUInt('USER_DEFINED_PARAM_2');
+ SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_3:value^:=ParamSfoGetUInt('USER_DEFINED_PARAM_3');
+ SCE_APP_CONTENT_APPPARAM_ID_USER_DEFINED_PARAM_4:value^:=ParamSfoGetUInt('USER_DEFINED_PARAM_4');
else
Result:=SCE_APP_CONTENT_ERROR_PARAMETER;
end;
@@ -135,6 +138,7 @@ begin
Result:=FormatTmpPath(PChar(mountPoint));
_sig_unlock;
}
+ Result:=-1;
end;
function ps4_sceAppContentTemporaryDataMount(mountPoint:pSceAppContentMountPoint):Integer;
@@ -144,6 +148,7 @@ begin
Result:=FetchTmpMount(PChar(mountPoint),SCE_APP_CONTENT_TEMPORARY_DATA_OPTION_FORMAT);
_sig_unlock;
}
+ Result:=-1;
end;
function ps4_sceAppContentTemporaryDataMount2(option:DWORD;mountPoint:pSceAppContentMountPoint):Integer;
@@ -153,6 +158,7 @@ begin
Result:=FetchTmpMount(PChar(mountPoint),option);
_sig_unlock;
}
+ Result:=-1;
end;
function ps4_sceAppContentTemporaryDataUnmount(mountPoint:pSceAppContentMountPoint):Integer;
@@ -162,6 +168,7 @@ begin
Result:=UnMountTmpPath(PChar(mountPoint));
_sig_unlock;
}
+ Result:=-1;
end;
function ps4_sceAppContentTemporaryDataGetAvailableSpaceKb(mountPoint:pSceAppContentMountPoint;availableSpaceKb:PQWORD):Integer;
@@ -171,6 +178,7 @@ begin
Result:=GetTmpPathAvailableSpaceKb(PChar(mountPoint),availableSpaceKb);
_sig_unlock;
}
+ Result:=-1;
end;
function ps4_sceAppContentDownloadDataGetAvailableSpaceKb(mountPoint:pSceAppContentMountPoint;availableSpaceKb:PQWORD):Integer;
@@ -180,6 +188,7 @@ begin
Result:=GetDownloadAvailableSpaceKb(PChar(mountPoint),availableSpaceKb);
_sig_unlock;
}
+ Result:=-1;
end;
function ps4_sceAppContentGetEntitlementKey(serviceLabel:SceNpServiceLabel;
diff --git a/sys/host_ipc.pas b/sys/host_ipc.pas
index 3bb6cf27..bc486e32 100644
--- a/sys/host_ipc.pas
+++ b/sys/host_ipc.pas
@@ -52,8 +52,9 @@ type
procedure Pack(mtype,mlen,mtid:DWORD;buf:Pointer);
function Recv:PQNode;
procedure Flush;
- procedure RecvSync(node:PQNode);
- function RecvKevent(mlen:DWORD;buf:Pointer):Ptruint;
+ procedure RecvResultNode (node:PQNode);
+ procedure RecvResultDirect(mlen,mtid:DWORD;buf:Pointer);
+ function RecvKevent (mlen:DWORD;buf:Pointer):Ptruint;
procedure UpdateKevent();
procedure WakeupKevent(); virtual;
public
@@ -165,7 +166,7 @@ begin
end;
end;
-procedure THostIpcConnect.RecvSync(node:PQNode);
+procedure THostIpcConnect.RecvResultNode(node:PQNode);
var
value:Ptruint;
mlen:DWORD;
@@ -183,6 +184,22 @@ begin
TriggerNodeSync(node^.header.mtid,value);
end;
+procedure THostIpcConnect.RecvResultDirect(mlen,mtid:DWORD;buf:Pointer);
+var
+ value:Ptruint;
+begin
+ value:=0;
+
+ if (mlen>SizeOf(Ptruint)) then
+ begin
+ mlen:=SizeOf(Ptruint);
+ end;
+
+ Move(buf^,value,mlen);
+
+ TriggerNodeSync(mtid,value);
+end;
+
procedure kq_wakeup(data:Pointer); SysV_ABI_CDecl;
begin
THostIpcConnect(data).WakeupKevent();
@@ -249,7 +266,7 @@ begin
if (node^.header.mtype=iRESULT) then
begin
- RecvSync(node);
+ RecvResultNode(node);
end else
begin
OnMsg:=GetCallback(node^.header.mtype);
@@ -441,7 +458,14 @@ procedure THostIpcSimpleKERN.Send(mtype,mlen,mtid:DWORD;buf:Pointer);
begin
if (FDest<>nil) then
begin
- FDest.Pack(mtype,mlen,mtid,buf);
+ if (mtype=iRESULT) then
+ begin
+ //Trigger Direct on Simple mode!
+ FDest.RecvResultDirect(mlen,mtid,buf);
+ end else
+ begin
+ FDest.Pack(mtype,mlen,mtid,buf);
+ end;
//
if Assigned(Classes.WakeMainThread) then
begin
diff --git a/sys/md/md_host_ipc.pas b/sys/md/md_host_ipc.pas
index 08202671..637e5250 100644
--- a/sys/md/md_host_ipc.pas
+++ b/sys/md/md_host_ipc.pas
@@ -44,6 +44,7 @@ type
THostIpcPipeMGUI=class(THostIpcPipe)
Ftd_handle:TThreadID;
procedure Recv_pipe; override;
+ Function Push(Node:Pointer):Boolean; override;
procedure thread_new; override;
procedure thread_free; override;
end;
@@ -131,8 +132,6 @@ begin
if ((events and (BEV_EVENT_ERROR or BEV_EVENT_EOF))<>0) then
begin
-
-
Exit;
end;
@@ -214,6 +213,18 @@ begin
end;
end;
+Function THostIpcPipeMGUI.Push(Node:Pointer):Boolean;
+begin
+ if (PQNode(Node)^.header.mtype=iRESULT) then
+ begin
+ //Trigger Direct on GUI side!
+ RecvResultNode(Node);
+ end else
+ begin
+ Result:=inherited;
+ end;
+end;
+
procedure THostIpcPipeMGUI.thread_new;
begin
if (Ftd_handle=0) then
diff --git a/sys/sys_bootparam.pas b/sys/sys_bootparam.pas
index 1a325ccd..3747c501 100644
--- a/sys/sys_bootparam.pas
+++ b/sys/sys_bootparam.pas
@@ -8,7 +8,7 @@ uses
host_ipc_interface;
const
- CPUID_BASE_MODE=$710f13; //$710f31
+ CPUID_BASE_MODE=$710f13; // $710f31
CPUID_NEO_MODE =$740f00;
var
@@ -26,6 +26,7 @@ var
p_print_gpu_hint :Boolean=False;
p_host_ipc :THostIpcInterface=nil;
+ p_host_handler :THostIpcHandler =nil;
function p_host_ipc_td:Pointer;