mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 17:09:09 +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.
|
Perform syscall and set errno variable if needed.
|
||||||
}
|
}
|
||||||
asm
|
asm
|
||||||
// for now we are lazy
|
str r7,[sp,#-4]!
|
||||||
mov r7,r0
|
mov r7,r0
|
||||||
mov r0,r1
|
|
||||||
mov r1,r2
|
|
||||||
mov r2,r3
|
|
||||||
mov r3,r4
|
|
||||||
mov r4,r5
|
|
||||||
mov r5,r6
|
|
||||||
swi #0x0
|
swi #0x0
|
||||||
|
ldr r7,[sp],#4
|
||||||
cmn r0,#126
|
cmn r0,#126
|
||||||
|
ldr r7,[sp],#4
|
||||||
movls pc,lr
|
movls pc,lr
|
||||||
stmfd sp!,{lr}
|
stmfd sp!,{lr}
|
||||||
rsb r0,r0,#0
|
rsb r0,r0,#0
|
||||||
@ -45,7 +41,144 @@ asm
|
|||||||
mvn r0,#0
|
mvn r0,#0
|
||||||
ldmfd sp!,{pc}
|
ldmfd sp!,{pc}
|
||||||
end;
|
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}
|
{$else FPC_ABI_EABI}
|
||||||
|
|
||||||
function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
|
function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
|
||||||
{
|
{
|
||||||
Perform syscall and set errno variable if needed.
|
Perform syscall and set errno variable if needed.
|
||||||
@ -60,8 +193,6 @@ asm
|
|||||||
mvn r0,#0
|
mvn r0,#0
|
||||||
ldmfd sp!,{pc}
|
ldmfd sp!,{pc}
|
||||||
end;
|
end;
|
||||||
{$endif FPC_ABI_EABI}
|
|
||||||
|
|
||||||
|
|
||||||
procedure FPC_SYSCALL; external name 'FPC_SYSCALL0';
|
procedure FPC_SYSCALL; external name 'FPC_SYSCALL0';
|
||||||
|
|
||||||
@ -129,3 +260,4 @@ asm
|
|||||||
bl FPC_SYSCALL
|
bl FPC_SYSCALL
|
||||||
ldmfd sp!,{r4,r5,r6}
|
ldmfd sp!,{r4,r5,r6}
|
||||||
end;
|
end;
|
||||||
|
{$endif FPC_ABI_EABI}
|
||||||
|
Loading…
Reference in New Issue
Block a user