mirror of
https://github.com/moparisthebest/Simba
synced 2025-02-07 10:40:19 -05:00
PS update
git-svn-id: http://www.villavu.com/repositories/merlijn/mufasa@63 3f818213-9676-44b0-a9b4-5e4c4e03d09d
This commit is contained in:
parent
0c380b49ec
commit
c14ee4987d
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
unit uPSR_dll;
|
unit uPSR_dll;
|
||||||
|
|
||||||
{$I PascalScript.inc}
|
{$I PascalScript.inc}
|
||||||
@ -16,12 +15,8 @@ function UnloadProc(Caller: TPSExec; p: TPSExternalProcRec; Global, Stack: TPSSt
|
|||||||
implementation
|
implementation
|
||||||
uses
|
uses
|
||||||
{$IFDEF UNIX}
|
{$IFDEF UNIX}
|
||||||
{$IFDEF Darwin}
|
|
||||||
LCLIntf, Unix, baseunix, dynlibs, termio, sockets;
|
LCLIntf, Unix, baseunix, dynlibs, termio, sockets;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
dl;{$IFNDEF FPC}, Windows{$ENDIF}
|
|
||||||
{$ENDIF}
|
|
||||||
{$ELSE}
|
|
||||||
Windows;
|
Windows;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
@ -36,11 +31,7 @@ type
|
|||||||
TLoadedDll = record
|
TLoadedDll = record
|
||||||
dllnamehash: Longint;
|
dllnamehash: Longint;
|
||||||
dllname: tbtstring;
|
dllname: tbtstring;
|
||||||
{$IFDEF LINUX}
|
|
||||||
dllhandle: Pointer;
|
|
||||||
{$ELSE}
|
|
||||||
dllhandle: THandle;
|
dllhandle: THandle;
|
||||||
{$ENDIF}
|
|
||||||
end;
|
end;
|
||||||
TMyExec = class(TPSExec);
|
TMyExec = class(TPSExec);
|
||||||
PInteger = ^Integer;
|
PInteger = ^Integer;
|
||||||
@ -77,11 +68,7 @@ end;
|
|||||||
|
|
||||||
procedure DllFree(Sender: TPSExec; P: PLoadedDll);
|
procedure DllFree(Sender: TPSExec; P: PLoadedDll);
|
||||||
begin
|
begin
|
||||||
{$IFDEF LINUX}
|
|
||||||
dlclose(p^.dllhandle);
|
|
||||||
{$ELSE}
|
|
||||||
FreeLibrary(p^.dllhandle);
|
FreeLibrary(p^.dllhandle);
|
||||||
{$ENDIF}
|
|
||||||
Dispose(p);
|
Dispose(p);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -90,11 +77,7 @@ var
|
|||||||
s, s2, s3: tbtstring;
|
s, s2, s3: tbtstring;
|
||||||
h, i: Longint;
|
h, i: Longint;
|
||||||
ph: PLoadedDll;
|
ph: PLoadedDll;
|
||||||
{$IFDEF LINUX}
|
|
||||||
dllhandle: Pointer;
|
|
||||||
{$ELSE}
|
|
||||||
dllhandle: THandle;
|
dllhandle: THandle;
|
||||||
{$ENDIF}
|
|
||||||
loadwithalteredsearchpath: Boolean;
|
loadwithalteredsearchpath: Boolean;
|
||||||
begin
|
begin
|
||||||
s := p.Decl;
|
s := p.Decl;
|
||||||
@ -119,18 +102,14 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
{$IFDEF UNIX}
|
{$IFDEF UNIX}
|
||||||
{$IFDEF DARWIN}
|
|
||||||
dllhandle := LoadLibrary(PChar(s2));
|
dllhandle := LoadLibrary(PChar(s2));
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
dllhandle := dlopen(PChar(s2), RTLD_LAZY);
|
|
||||||
{$ENDIF}
|
|
||||||
{$ELSE}
|
|
||||||
if loadwithalteredsearchpath then
|
if loadwithalteredsearchpath then
|
||||||
dllhandle := LoadLibraryExA(PAnsiChar(AnsiString(s2)), 0, LOAD_WITH_ALTERED_SEARCH_PATH)
|
dllhandle := LoadLibraryExA(PAnsiChar(AnsiString(s2)), 0, LOAD_WITH_ALTERED_SEARCH_PATH)
|
||||||
else
|
else
|
||||||
dllhandle := LoadLibraryA(PAnsiChar(AnsiString(s2)));
|
dllhandle := LoadLibraryA(PAnsiChar(AnsiString(s2)));
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
if dllhandle = {$IFDEF LINUX}nil{$ELSE}0{$ENDIF}then
|
if dllhandle = 0 then
|
||||||
begin
|
begin
|
||||||
p.Ext2 := Pointer(1);
|
p.Ext2 := Pointer(1);
|
||||||
Result := False;
|
Result := False;
|
||||||
@ -146,12 +125,8 @@ begin
|
|||||||
begin
|
begin
|
||||||
dllhandle := ph^.dllhandle;
|
dllhandle := ph^.dllhandle;
|
||||||
end;
|
end;
|
||||||
until dllhandle <> {$IFDEF LINUX}nil{$ELSE}0{$ENDIF};
|
until dllhandle <> 0;
|
||||||
{$IFDEF LINUX}
|
|
||||||
p.Ext1 := dlsym(dllhandle, pchar(s3));
|
|
||||||
{$ELSE}
|
|
||||||
p.Ext1 := GetProcAddress(dllhandle, pansichar(s3));
|
p.Ext1 := GetProcAddress(dllhandle, pansichar(s3));
|
||||||
{$ENDIF}
|
|
||||||
if p.Ext1 = nil then
|
if p.Ext1 = nil then
|
||||||
begin
|
begin
|
||||||
p.Ext2 := Pointer(1);
|
p.Ext2 := Pointer(1);
|
||||||
@ -284,11 +259,7 @@ begin
|
|||||||
if (ph = nil) then break;
|
if (ph = nil) then break;
|
||||||
if (ph.dllnamehash = h) and (ph.dllname = sname) then
|
if (ph.dllnamehash = h) and (ph.dllname = sname) then
|
||||||
begin
|
begin
|
||||||
{$IFDEF LINUX}
|
|
||||||
dlclose(ph^.dllhandle);
|
|
||||||
{$ELSE}
|
|
||||||
FreeLibrary(ph^.dllhandle);
|
FreeLibrary(ph^.dllhandle);
|
||||||
{$ENDIF}
|
|
||||||
Caller.DeleteResource(ph);
|
Caller.DeleteResource(ph);
|
||||||
dispose(ph);
|
dispose(ph);
|
||||||
end;
|
end;
|
||||||
|
@ -21,8 +21,8 @@ asm
|
|||||||
|
|
||||||
fpc inserts an 20h emty space
|
fpc inserts an 20h emty space
|
||||||
*)
|
*)
|
||||||
push ebp
|
push rbp
|
||||||
mov ebp,esp
|
mov rbp,rsp
|
||||||
// call debugbreak
|
// call debugbreak
|
||||||
push rcx // address
|
push rcx // address
|
||||||
push rdx // _rax
|
push rdx // _rax
|
||||||
@ -70,80 +70,92 @@ asm
|
|||||||
ret
|
ret
|
||||||
end;
|
end;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
|
type
|
||||||
|
TRegisters = packed record
|
||||||
|
_RDI, // 0
|
||||||
|
_RSI, // 8
|
||||||
|
_RDX, // 16
|
||||||
|
_RCX, // 24
|
||||||
|
_R8, // 32
|
||||||
|
_R9: IPointer; // 40
|
||||||
|
_XMM1, // 48
|
||||||
|
_XMM2, // 56
|
||||||
|
_XMM3, // 64
|
||||||
|
_XMM4, // 72
|
||||||
|
_XMM5, // 80
|
||||||
|
_XMM6, // 88
|
||||||
|
_XMM7: Double; // 96
|
||||||
|
end;
|
||||||
|
|
||||||
procedure x64call(
|
procedure x64call(
|
||||||
Address: Pointer;
|
Address: Pointer;
|
||||||
out _RAX: IPointer;
|
out _RAX: IPointer;
|
||||||
_RDI, _RSI, _RDX, _RCX, _R8, _R9: IPointer;
|
|
||||||
var _XMM0: Double;
|
var Registers: TRegisters;
|
||||||
var _XMM1, _XMM2, _XMM3, _XMM4, _XMM5, _XMM6, _XMM7: Double;
|
aStack: Pointer; aItems: Integer; var _XMM0: Double); assembler; nostackframe;
|
||||||
aStack: Pointer; aItems: Integer); assembler; nostackframe;
|
|
||||||
|
|
||||||
|
|
||||||
asm
|
asm
|
||||||
(* Registers:
|
(* Registers:
|
||||||
RDI: Address
|
RDI: Address
|
||||||
RSI: _RAX
|
RSI: _RAX
|
||||||
RDX: _RDI
|
RDX: Registers
|
||||||
RCX: _RSI
|
RCX: aStack
|
||||||
R8: _RDX
|
R8: aItems
|
||||||
R9: _RCX
|
R9: XMM0
|
||||||
|
|
||||||
|
|
||||||
|
rbp-8 addr
|
||||||
|
rbp-16 _rax
|
||||||
|
rbp-24 _xmm0
|
||||||
*)
|
*)
|
||||||
push ebp
|
push rbp
|
||||||
mov ebp,esp
|
mov rbp,rsp
|
||||||
push rdi // address
|
push rdi // address
|
||||||
push rsi // _rax
|
push rsi // _rax
|
||||||
push rdx // _rdi
|
push r9 // xmm0
|
||||||
push rcx // _rsi
|
mov rax, rdx
|
||||||
push r8 // _rdx
|
|
||||||
push r9 // _rcx
|
|
||||||
mov rcx, aItems
|
|
||||||
mov rdx, aStack
|
|
||||||
jmp @compareitems
|
jmp @compareitems
|
||||||
@work:
|
@work:
|
||||||
push [rdx]
|
push [rcx]
|
||||||
dec rcx
|
dec r8
|
||||||
sub rdx,8
|
sub rcx,8
|
||||||
@compareitems:
|
@compareitems:
|
||||||
or rcx, rcx
|
or r8, r8
|
||||||
jnz @work
|
jnz @work
|
||||||
|
|
||||||
// copy registers
|
// copy registers
|
||||||
movd xmm0,[_XMM0]
|
movd xmm0,[rbp-24]
|
||||||
movd xmm1,_XMM1
|
movd xmm1,[rax+48]
|
||||||
movd xmm2,_XMM2
|
movd xmm2,[rax+56]
|
||||||
movd xmm3,_XMM3
|
movd xmm3,[rax+64]
|
||||||
movd xmm4,_XMM4
|
movd xmm4,[rax+72]
|
||||||
movd xmm5,_XMM5
|
movd xmm5,[rax+80]
|
||||||
movd xmm6,_XMM6
|
movd xmm6,[rax+88]
|
||||||
movd xmm7,_XMM7
|
movd xmm7,[rax+96]
|
||||||
mov RAX, [rbp-8]
|
mov RDI, [rax]
|
||||||
mov RDI, [rbp-24]
|
mov RSI, [rax+ 8]
|
||||||
mov RSI, [rbp-32]
|
mov RDX, [rax+16]
|
||||||
mov RDX, [rbp-40]
|
mov RCX, [rax+24]
|
||||||
mov RCX, [rbp-48]
|
mov R8, [rax+32]
|
||||||
mov R8, _R8
|
mov R9, [rax+40]
|
||||||
mov R9, _R9
|
|
||||||
|
|
||||||
// weird thing on windows, it needs 32 bytes in the CALLEE side to do whatever in; not sure about linux
|
// weird thing on windows, it needs 32 bytes in the CALLEE side to do whatever in; not sure about linux
|
||||||
//sub RSP, 32
|
//sub RSP, 32
|
||||||
|
|
||||||
|
mov rax, [rbp-8]
|
||||||
call RAX
|
call RAX
|
||||||
|
|
||||||
// add RSP, 32 // undo the damage done earlier
|
// add RSP, 32 // undo the damage done earlier
|
||||||
|
|
||||||
// copy result back
|
// copy result back
|
||||||
mov RDX, [rbp-16]
|
mov rsi, [rbp-16]
|
||||||
mov [RDX], RAX
|
mov [rsi], RAX
|
||||||
movd [_XMM0],xmm0
|
mov rsi, [rbp-24]
|
||||||
|
movd [rsi],xmm0
|
||||||
|
|
||||||
pop r9
|
pop r9 // xmm0
|
||||||
pop r8
|
pop rsi // _rax
|
||||||
pop rdx
|
pop rdi // address
|
||||||
pop rcx
|
|
||||||
pop rsi
|
|
||||||
pop rdi
|
|
||||||
leave
|
leave
|
||||||
ret
|
ret
|
||||||
end;
|
end;
|
||||||
@ -152,13 +164,13 @@ end;
|
|||||||
function TPSExec.InnerfuseCall(_Self, Address: Pointer; CallingConv: TPSCallingConvention; Params: TPSList; res: PPSVariantIFC): Boolean;
|
function TPSExec.InnerfuseCall(_Self, Address: Pointer; CallingConv: TPSCallingConvention; Params: TPSList; res: PPSVariantIFC): Boolean;
|
||||||
var
|
var
|
||||||
Stack: array of Byte;
|
Stack: array of Byte;
|
||||||
_RAX,
|
_RAX: IPointer;
|
||||||
{$IFDEF WINDOWS}
|
{$IFDEF WINDOWS}
|
||||||
_RCX, _RDX, _R8, _R9: IPointer;
|
_RCX, _RDX, _R8, _R9: IPointer;
|
||||||
_XMM0, _XMM1, _XMM2, _XMM3: Double;
|
_XMM0, _XMM1, _XMM2, _XMM3: Double;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
_RDI, _RSI, _RDX, _RCX, _R8, _R9: IPointer;
|
_XMM0: Double;
|
||||||
_XMM0, _XMM1, _XMM2, _XMM3, _XMM4, _XMM5, _XMM6, _XMM7: Double;
|
Registers: TRegisters;
|
||||||
RegUsageFloat: Byte;
|
RegUsageFloat: Byte;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
RegUsage: Byte;
|
RegUsage: Byte;
|
||||||
@ -201,12 +213,12 @@ var
|
|||||||
var p: Pointer;
|
var p: Pointer;
|
||||||
begin
|
begin
|
||||||
case RegUsage of
|
case RegUsage of
|
||||||
0: begin inc(RegUsage); _RDI:=Data; end;
|
0: begin inc(RegUsage); Registers._RDI:=Data; end;
|
||||||
1: begin inc(RegUsage); _RSI:=Data; end;
|
1: begin inc(RegUsage); Registers._RSI:=Data; end;
|
||||||
2: begin inc(RegUsage); _RDX:=Data; end;
|
2: begin inc(RegUsage); Registers._RDX:=Data; end;
|
||||||
3: begin inc(RegUsage); _RCX:=Data; end;
|
3: begin inc(RegUsage); Registers._RCX:=Data; end;
|
||||||
4: begin inc(RegUsage); _R8:=Data; end;
|
4: begin inc(RegUsage); Registers._R8:=Data; end;
|
||||||
5: begin inc(RegUsage); _R9:=Data; end;
|
5: begin inc(RegUsage); Registers._R9:=Data; end;
|
||||||
else begin
|
else begin
|
||||||
SetLength(Stack, Length(Stack)+8);
|
SetLength(Stack, Length(Stack)+8);
|
||||||
p := @Stack[LEngth(Stack)-8];
|
p := @Stack[LEngth(Stack)-8];
|
||||||
@ -251,13 +263,13 @@ var
|
|||||||
begin
|
begin
|
||||||
case RegUsageFloat of
|
case RegUsageFloat of
|
||||||
0: begin inc(RegUsageFloat); _XMM0:=Data; end;
|
0: begin inc(RegUsageFloat); _XMM0:=Data; end;
|
||||||
1: begin inc(RegUsageFloat); _XMM1:=Data; end;
|
1: begin inc(RegUsageFloat); Registers._XMM1:=Data; end;
|
||||||
2: begin inc(RegUsageFloat); _XMM2:=Data; end;
|
2: begin inc(RegUsageFloat); Registers._XMM2:=Data; end;
|
||||||
3: begin inc(RegUsageFloat); _XMM3:=Data; end;
|
3: begin inc(RegUsageFloat); Registers._XMM3:=Data; end;
|
||||||
4: begin inc(RegUsageFloat); _XMM4:=Data; end;
|
4: begin inc(RegUsageFloat); Registers._XMM4:=Data; end;
|
||||||
5: begin inc(RegUsageFloat); _XMM5:=Data; end;
|
5: begin inc(RegUsageFloat); Registers._XMM5:=Data; end;
|
||||||
6: begin inc(RegUsageFloat); _XMM6:=Data; end;
|
6: begin inc(RegUsageFloat); Registers._XMM6:=Data; end;
|
||||||
7: begin inc(RegUsageFloat); _XMM7:=Data; end;
|
7: begin inc(RegUsageFloat); Registers._XMM7:=Data; end;
|
||||||
else begin
|
else begin
|
||||||
SetLength(Stack, Length(Stack)+8);
|
SetLength(Stack, Length(Stack)+8);
|
||||||
p := @Stack[LEngth(Stack)-8];
|
p := @Stack[LEngth(Stack)-8];
|
||||||
@ -413,14 +425,16 @@ begin
|
|||||||
res.VarParam := true;
|
res.VarParam := true;
|
||||||
try
|
try
|
||||||
{$IFNDEF WINDOWS}
|
{$IFNDEF WINDOWS}
|
||||||
_RSI := 0;
|
(*_RSI := 0;
|
||||||
_RDI := 0;
|
_RDI := 0;
|
||||||
_XMM4 := 0;
|
_XMM4 := 0;
|
||||||
_XMM5 := 0;
|
_XMM5 := 0;
|
||||||
_XMM6 := 0;
|
_XMM6 := 0;
|
||||||
_XMM7 := 0;
|
_XMM7 := 0;*)
|
||||||
|
FillChar(Registers, Sizeof(REgisters), 0);
|
||||||
|
_XMM0 := 0;
|
||||||
RegUsageFloat := 0;
|
RegUsageFloat := 0;
|
||||||
{$ENDIF}
|
{$ELSE}
|
||||||
_RCX := 0;
|
_RCX := 0;
|
||||||
_RDX := 0;
|
_RDX := 0;
|
||||||
_R8 := 0;
|
_R8 := 0;
|
||||||
@ -429,10 +443,11 @@ begin
|
|||||||
_XMM1 := 0;
|
_XMM1 := 0;
|
||||||
_XMM2 := 0;
|
_XMM2 := 0;
|
||||||
_XMM3 := 0;
|
_XMM3 := 0;
|
||||||
|
{$ENDIF}
|
||||||
|
_RAX := 0;
|
||||||
RegUsage := 0;
|
RegUsage := 0;
|
||||||
if assigned(_Self) then begin
|
if assigned(_Self) then begin
|
||||||
RegUsage := 1;
|
StoreReg(IPointer(_Self));
|
||||||
_RCX := IPointer(_Self);
|
|
||||||
end;
|
end;
|
||||||
for I := 0 to Params.Count - 1 do
|
for I := 0 to Params.Count - 1 do
|
||||||
begin
|
begin
|
||||||
@ -454,7 +469,7 @@ begin
|
|||||||
{$IFDEF WINDOWS}
|
{$IFDEF WINDOWS}
|
||||||
x64call(Address, _RAX, _RCX, _RDX, _R8, _R9, _XMM0, _XMM1, _XMM2, _XMM3, pp, Length(Stack) div 8);
|
x64call(Address, _RAX, _RCX, _RDX, _R8, _R9, _XMM0, _XMM1, _XMM2, _XMM3, pp, Length(Stack) div 8);
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
x64call(Address, _RAX, _RDI, _RSI, _RDX, _RCX, _R8, _R9,_XMM0,_XMM1, _XMM2, _XMM3, _XMM4, _XMM5, _XMM6, _XMM7, pp, Length(Stack) div 8);
|
x64call(Address, _RAX, Registers, pp, Length(Stack) div 8, _XMM0);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
case res^.aType.BaseType of
|
case res^.aType.BaseType of
|
||||||
btSet:
|
btSet:
|
||||||
@ -494,7 +509,7 @@ begin
|
|||||||
{$IFDEF WINDOWS}
|
{$IFDEF WINDOWS}
|
||||||
x64call(Address, _RAX, _RCX, _RDX, _R8, _R9, _XMM0, _XMM1, _XMM2, _XMM3, pp, Length(Stack) div 8);
|
x64call(Address, _RAX, _RCX, _RDX, _R8, _R9, _XMM0, _XMM1, _XMM2, _XMM3, pp, Length(Stack) div 8);
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
x64call(Address, _RAX, _RDI, _RSI, _RDX, _RCX, _R8, _R9,_XMM0,_XMM1, _XMM2, _XMM3, _XMM4, _XMM5, _XMM6, _XMM7, pp, Length(Stack) div 8);
|
x64call(Address, _RAX, Registers, pp, Length(Stack) div 8, _XMM0);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
Result := True;
|
Result := True;
|
||||||
|
Loading…
Reference in New Issue
Block a user