* fixed eabi syscalls: preserve non-volative registers

git-svn-id: trunk@11197 -
This commit is contained in:
florian 2008-06-04 18:18:08 +00:00
parent da923586c6
commit 3341418267

View File

@ -28,16 +28,12 @@ function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public
Perform syscall and set errno variable if needed.
}
asm
// for now we are lazy
str r7,[sp,#-4]!
mov r7,r0
mov r0,r1
mov r1,r2
mov r2,r3
mov r3,r4
mov r4,r5
mov r5,r6
swi #0x0
ldr r7,[sp],#4
cmn r0,#126
ldr r7,[sp],#4
movls pc,lr
stmfd sp!,{lr}
rsb r0,r0,#0
@ -45,7 +41,144 @@ asm
mvn r0,#0
ldmfd sp!,{pc}
end;
function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
{
Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
}
asm
str r7,[sp,#-4]!
mov r7,r0
mov r0,r1
swi #0x0
cmn r0,#126
ldr r7,[sp],#4
movls pc,lr
stmfd sp!,{lr}
rsb r0,r0,#0
bl seterrno
mvn r0,#0
ldmfd sp!,{pc}
end;
function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
{
Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
}
asm
str r7,[sp,#-4]!
mov r7,r0
mov r0,r1
mov r1,r2
swi #0x0
cmn r0,#126
ldr r7,[sp],#4
movls pc,lr
stmfd sp!,{lr}
rsb r0,r0,#0
bl seterrno
mvn r0,#0
ldmfd sp!,{pc}
end;
function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
{
Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
}
asm
str r7,[sp,#-4]!
mov r7,r0
mov r0,r1
mov r1,r2
mov r2,r3
swi #0x0
cmn r0,#126
ldr r7,[sp],#4
movls pc,lr
stmfd sp!,{lr}
rsb r0,r0,#0
bl seterrno
mvn r0,#0
ldmfd sp!,{pc}
end;
function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
{
This function loads some parameters from stack and calls FPC_SYSCALL0.
}
asm
str r7,[sp,#-4]!
mov r7,r0
mov r0,r1
mov r1,r2
mov r2,r3
ldr r3,param4
swi #0x0
cmn r0,#126
ldr r7,[sp],#4
movls pc,lr
stmfd sp!,{lr}
rsb r0,r0,#0
bl seterrno
mvn r0,#0
ldmfd sp!,{pc}
end;
function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
{
This function loads some parameters from stack and calls FPC_SYSCALL0.
}
asm
stmfd sp!,{r4,r7}
mov r7,r0
mov r0,r1
mov r1,r2
mov r2,r3
ldr r3,param4
ldr r4,param5
swi #0x0
cmn r0,#126
ldmfd sp!,{r4,r7}
movls pc,lr
stmfd sp!,{lr}
rsb r0,r0,#0
bl seterrno
mvn r0,#0
ldmfd sp!,{pc}
end;
function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
{
This function loads some parameters from stack and calls FPC_SYSCALL0.
}
asm
stmfd sp!,{r4,r5,r7}
mov r7,r0
mov r0,r1
mov r1,r2
mov r2,r3
ldr r3,param4
ldr r4,param5
ldr r5,param6
swi #0x0
cmn r0,#126
ldmfd sp!,{r4,r5,r7}
movls pc,lr
stmfd sp!,{lr}
rsb r0,r0,#0
bl seterrno
mvn r0,#0
ldmfd sp!,{pc}
end;
{$else FPC_ABI_EABI}
function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
{
Perform syscall and set errno variable if needed.
@ -60,8 +193,6 @@ asm
mvn r0,#0
ldmfd sp!,{pc}
end;
{$endif FPC_ABI_EABI}
procedure FPC_SYSCALL; external name 'FPC_SYSCALL0';
@ -129,3 +260,4 @@ asm
bl FPC_SYSCALL
ldmfd sp!,{r4,r5,r6}
end;
{$endif FPC_ABI_EABI}