mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-19 23:39:31 +02:00
* fixed eabi syscalls: preserve non-volative registers
git-svn-id: trunk@11197 -
This commit is contained in:
parent
da923586c6
commit
3341418267
@ -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}
|
||||
|
Loading…
Reference in New Issue
Block a user