* adds support for sysenter syscall style for i386 on 2.6 kernels

git-svn-id: trunk@6992 -
This commit is contained in:
Almindor 2007-03-25 10:06:23 +00:00
parent c2cec3a8c0
commit c626740043
3 changed files with 106 additions and 2 deletions

View File

@ -17,13 +17,74 @@
{$ASMMODE ATT}
{*************************SYSENTER CODE********************************}
{ included by system.pp in linux rtl }
const
AT_NULL = 0;
{* Pointer to the global system page used for system calls and other
nice things. *}
AT_SYSINFO = 32;
AT_SYSINFO_EHDR = 33;
type
TAuxiliaryValue = cuInt32;
TInternalUnion = record
a_val: cuint32; //* Integer value */
{* We use to have pointer elements added here. We cannot do that,
though, since it does not work when using 32-bit definitions
on 64-bit platforms and vice versa. *}
end;
Elf32_auxv_t = record
a_type: cuint32; //* Entry type */
a_un: TInternalUnion;
end;
TElf32AuxiliaryVector = Elf32_auxv_t;
PElf32AuxiliaryVector = ^TElf32AuxiliaryVector;
procedure InitSyscallIntf;
var
ep: PPChar;
auxv: PElf32AuxiliaryVector;
begin
psysinfo := 0;
ep := envp;
while ep^ <> nil do
Inc(ep);
Inc(ep);
auxv := PElf32AuxiliaryVector(ep);
repeat
if auxv^.a_type = AT_SYSINFO then begin
psysinfo := auxv^.a_un.a_val;
if psysinfo <> 0 then
sysenter_supported := 1; // descision factor in asm syscall routines
Break;
end;
Inc(auxv);
until auxv^.a_type = AT_NULL;
end;
{***********************SYSENTER CODE END******************************}
Procedure fpc_geteipasebx;[external name 'fpc_geteipasebx'];
function FpSysCall(sysnr:TSysParam):TSysResult; assembler; register; [public,alias:'FPC_SYSCALL0'];
{ Var sysnr located in register eax }
asm
// movl sysnr,%eax
int $0x80
cmp $0, sysenter_supported
jne .LSysEnter
int $0x80
jmp .LTail
.LSysEnter:
call psysinfo
.LTail:
cmpl $-4095,%eax
jb .LSyscOK
negl %eax
@ -39,7 +100,13 @@ asm
movl %ebx,%ecx
// movl sysnr,%eax
movl %edx,%ebx
cmp $0, sysenter_supported
jne .LSysEnter
int $0x80
jmp .LTail
.LSysEnter:
call psysinfo
.LTail:
movl %ecx,%ebx
cmpl $-4095,%eax
jb .LSyscOK
@ -58,7 +125,13 @@ asm
// movl sysnr,%eax
movl %edx,%ebx
// movl param2,%ecx
cmp $0, sysenter_supported
jne .LSysEnter
int $0x80
jmp .LTail
.LSysEnter:
call psysinfo
.LTail:
pop %ebx
cmpl $-4095,%eax
jb .LSyscOK
@ -79,7 +152,13 @@ asm
movl %edx,%ebx
// movl param2,%ecx
movl param3,%edx
cmp $0, sysenter_supported
jne .LSysEnter
int $0x80
jmp .LTail
.LSysEnter:
call psysinfo
.LTail:
pop %ebx
cmpl $-4095,%eax
jb .LSyscOK
@ -103,7 +182,13 @@ asm
// movl param2,%ecx
movl param3,%edx
movl param4,%esi
cmp $0, sysenter_supported
jne .LSysEnter
int $0x80
jmp .LTail
.LSysEnter:
call psysinfo
.LTail:
pop %esi
pop %ebx
cmpl $-4095,%eax
@ -131,7 +216,13 @@ asm
movl param3,%edx
movl param4,%esi
movl param5,%edi
cmp $0, sysenter_supported
jne .LSysEnter
int $0x80
jmp .LTail
.LSysEnter:
call psysinfo
.LTail:
pop %edi
pop %esi
pop %ebx
@ -163,7 +254,13 @@ asm
movl param4,%esi
movl param5,%edi
movl param6,%ebp
cmp $0, sysenter_supported
jne .LSysEnter
int $0x80
jmp .LTail
.LSysEnter:
call psysinfo
.LTail:
pop %ebp
pop %edi
pop %esi

View File

@ -32,6 +32,10 @@ Type
// 64-bit machines don't have only 64-bit params.
TSysParam = Longint;
var
psysinfo: LongWord;
sysenter_supported: LongInt = 0;
function Do_SysCall(sysnr:TSysParam):TSysResult; register; external name 'FPC_SYSCALL0';
function Do_SysCall(sysnr,param1:TSysParam):TSysResult; register; external name 'FPC_SYSCALL1';

View File

@ -227,7 +227,6 @@ begin
reenable_signal:=geterrno=0;
end;
// signal handler is arch dependant due to processorexception to language
// exception translation
@ -299,6 +298,10 @@ end;
var
initialstkptr : Pointer;external name '__stkptr';
begin
{$IFDEF i386}
InitSyscallIntf;
{$ENDIF}
SysResetFPU;
{$if defined(cpupowerpc)}
// some PPC kernels set the exception bits FE0/FE1 in the MSR to zero,