mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 14:09:17 +02:00
* Optimize syscalls for arm-linux.
git-svn-id: trunk@8191 -
This commit is contained in:
parent
27db4ec55a
commit
4b8777eb5a
@ -22,272 +22,79 @@
|
|||||||
--- Main:The System Call Self ---
|
--- Main:The System Call Self ---
|
||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
|
|
||||||
function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL0'];
|
function FpSysCall(sysnr:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
|
||||||
{
|
{
|
||||||
This function puts the registers in place, does the call, and then
|
Perform syscall and set errno variable if needed.
|
||||||
copies back the registers as they are after the SysCall.
|
|
||||||
}
|
}
|
||||||
var
|
|
||||||
_r4 : dword;
|
|
||||||
asm
|
asm
|
||||||
str r4,_r4
|
swi #0x900071
|
||||||
swi #0x900071
|
cmn r0,#126
|
||||||
cmn r0,#126
|
movls pc,lr
|
||||||
bls .LDone
|
stmfd sp!,{lr}
|
||||||
rsb r4,r0,#0
|
rsb r0,r0,#0
|
||||||
ldr r2,.Lthread_var
|
bl seterrno
|
||||||
ldr r2,[r2]
|
mvn r0,#0
|
||||||
ldr r0,.LErrno
|
ldmfd sp!,{pc}
|
||||||
cmp r2,#0
|
end;
|
||||||
bne .LThread
|
|
||||||
str r4,[r0,#4]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LThread:
|
|
||||||
ldr r0,[r0]
|
|
||||||
mov lr,pc
|
|
||||||
mov pc,r2
|
|
||||||
str r4,[r0]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LErrno:
|
|
||||||
.word Errno
|
|
||||||
.Lthread_var:
|
|
||||||
.word fpc_threadvar_relocate_proc
|
|
||||||
.LDone:
|
|
||||||
ldr r4,_r4
|
|
||||||
end ['r4'];
|
|
||||||
|
|
||||||
|
|
||||||
function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
|
procedure FPC_SYSCALL; external name 'FPC_SYSCALL0';
|
||||||
|
|
||||||
|
function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
|
||||||
{
|
{
|
||||||
This function puts the registers in place, does the call, and then
|
Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
|
||||||
copies back the registers as they are after the SysCall.
|
|
||||||
}
|
}
|
||||||
var
|
|
||||||
_r4 : dword;
|
|
||||||
asm
|
asm
|
||||||
str r4,_r4
|
b FPC_SYSCALL
|
||||||
swi #0x900071
|
end;
|
||||||
cmn r0,#126
|
|
||||||
bls .LDone
|
|
||||||
rsb r4,r0,#0
|
|
||||||
ldr r2,.Lthread_var
|
|
||||||
ldr r2,[r2]
|
|
||||||
ldr r0,.LErrno
|
|
||||||
cmp r2,#0
|
|
||||||
bne .LThread
|
|
||||||
str r4,[r0,#4]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LThread:
|
|
||||||
ldr r0,[r0]
|
|
||||||
mov lr,pc
|
|
||||||
mov pc,r2
|
|
||||||
str r4,[r0]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LErrno:
|
|
||||||
.word Errno
|
|
||||||
.Lthread_var:
|
|
||||||
.word fpc_threadvar_relocate_proc
|
|
||||||
.LDone:
|
|
||||||
ldr r4,_r4
|
|
||||||
end ['r4'];
|
|
||||||
|
|
||||||
|
|
||||||
function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
|
function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
|
||||||
{
|
{
|
||||||
This function puts the registers in place, does the call, and then
|
Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
|
||||||
copies back the registers as they are after the SysCall.
|
|
||||||
}
|
}
|
||||||
var
|
|
||||||
_r4 : dword;
|
|
||||||
asm
|
asm
|
||||||
str r4,_r4
|
b FPC_SYSCALL
|
||||||
swi #0x900071
|
end;
|
||||||
cmn r0,#126
|
|
||||||
bls .LDone
|
|
||||||
rsb r4,r0,#0
|
|
||||||
ldr r2,.Lthread_var
|
|
||||||
ldr r2,[r2]
|
|
||||||
ldr r0,.LErrno
|
|
||||||
cmp r2,#0
|
|
||||||
bne .LThread
|
|
||||||
str r4,[r0,#4]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LThread:
|
|
||||||
ldr r0,[r0]
|
|
||||||
mov lr,pc
|
|
||||||
mov pc,r2
|
|
||||||
str r4,[r0]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LErrno:
|
|
||||||
.word Errno
|
|
||||||
.Lthread_var:
|
|
||||||
.word fpc_threadvar_relocate_proc
|
|
||||||
.LDone:
|
|
||||||
ldr r4,_r4
|
|
||||||
end ['r4'];
|
|
||||||
|
|
||||||
|
|
||||||
function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
|
function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
|
||||||
{
|
{
|
||||||
This function puts the registers in place, does the call, and then
|
Jump to FPC_SYSCALL0 because code for FPC_SYSCALL0-FPC_SYSCALL3 is the same.
|
||||||
copies back the registers as they are after the SysCall.
|
|
||||||
}
|
}
|
||||||
var
|
|
||||||
_r4 : dword;
|
|
||||||
asm
|
asm
|
||||||
str r4,_r4
|
b FPC_SYSCALL
|
||||||
swi #0x900071
|
end;
|
||||||
cmn r0,#126
|
|
||||||
bls .LDone
|
|
||||||
rsb r4,r0,#0
|
|
||||||
ldr r2,.Lthread_var
|
|
||||||
ldr r2,[r2]
|
|
||||||
ldr r0,.LErrno
|
|
||||||
cmp r2,#0
|
|
||||||
bne .LThread
|
|
||||||
str r4,[r0,#4]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LThread:
|
|
||||||
ldr r0,[r0]
|
|
||||||
mov lr,pc
|
|
||||||
mov pc,r2
|
|
||||||
str r4,[r0]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LErrno:
|
|
||||||
.word Errno
|
|
||||||
.Lthread_var:
|
|
||||||
.word fpc_threadvar_relocate_proc
|
|
||||||
.LDone:
|
|
||||||
ldr r4,_r4
|
|
||||||
end ['r4'];
|
|
||||||
|
|
||||||
|
|
||||||
function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL4'];
|
function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; assembler; [public,alias:'FPC_SYSCALL4'];
|
||||||
{
|
{
|
||||||
This function puts the registers in place, does the call, and then
|
This function loads some parameters from stack and calls FPC_SYSCALL0.
|
||||||
copies back the registers as they are after the SysCall.
|
|
||||||
}
|
}
|
||||||
var
|
|
||||||
_r4 : dword;
|
|
||||||
asm
|
asm
|
||||||
str r4,_r4
|
|
||||||
ldr r4,param4
|
ldr r4,param4
|
||||||
swi #0x900071
|
bl FPC_SYSCALL
|
||||||
cmn r0,#126
|
|
||||||
bls .LDone
|
|
||||||
rsb r4,r0,#0
|
|
||||||
ldr r2,.Lthread_var
|
|
||||||
ldr r2,[r2]
|
|
||||||
ldr r0,.LErrno
|
|
||||||
cmp r2,#0
|
|
||||||
bne .LThread
|
|
||||||
str r4,[r0,#4]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LThread:
|
|
||||||
ldr r0,[r0]
|
|
||||||
mov lr,pc
|
|
||||||
mov pc,r2
|
|
||||||
str r4,[r0]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LErrno:
|
|
||||||
.word Errno
|
|
||||||
.Lthread_var:
|
|
||||||
.word fpc_threadvar_relocate_proc
|
|
||||||
.LDone:
|
|
||||||
ldr r4,_r4
|
|
||||||
end ['r4'];
|
end ['r4'];
|
||||||
|
|
||||||
|
|
||||||
function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
|
function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
|
||||||
{
|
{
|
||||||
This function puts the registers in place, does the call, and then
|
This function loads some parameters from stack and calls FPC_SYSCALL0.
|
||||||
copies back the registers as they are after the SysCall.
|
|
||||||
}
|
}
|
||||||
var
|
|
||||||
_r4,_r5 : dword;
|
|
||||||
asm
|
asm
|
||||||
str r4,_r4
|
|
||||||
str r5,_r5
|
|
||||||
ldr r5,param5
|
|
||||||
ldr r4,param4
|
ldr r4,param4
|
||||||
swi #0x900071
|
ldr r5,param5
|
||||||
cmn r0,#126
|
bl FPC_SYSCALL
|
||||||
bls .LDone
|
|
||||||
rsb r4,r0,#0
|
|
||||||
ldr r2,.Lthread_var
|
|
||||||
ldr r2,[r2]
|
|
||||||
ldr r0,.LErrno
|
|
||||||
cmp r2,#0
|
|
||||||
bne .LThread
|
|
||||||
str r4,[r0,#4]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LThread:
|
|
||||||
ldr r0,[r0]
|
|
||||||
mov lr,pc
|
|
||||||
mov pc,r2
|
|
||||||
str r4,[r0]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LErrno:
|
|
||||||
.word Errno
|
|
||||||
.Lthread_var:
|
|
||||||
.word fpc_threadvar_relocate_proc
|
|
||||||
.LDone:
|
|
||||||
ldr r4,_r4
|
|
||||||
ldr r5,_r5
|
|
||||||
end ['r4','r5'];
|
end ['r4','r5'];
|
||||||
|
|
||||||
|
|
||||||
function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
|
function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL6'];
|
||||||
{
|
{
|
||||||
This function puts the registers in place, does the call, and then
|
This function loads some parameters from stack and calls FPC_SYSCALL0.
|
||||||
copies back the registers as they are after the SysCall.
|
|
||||||
}
|
}
|
||||||
var
|
|
||||||
_r4,_r5,_r6 : dword;
|
|
||||||
asm
|
asm
|
||||||
str r4,_r4
|
|
||||||
str r5,_r5
|
|
||||||
str r6,_r6
|
|
||||||
ldr r6,param6
|
|
||||||
ldr r5,param5
|
|
||||||
ldr r4,param4
|
ldr r4,param4
|
||||||
swi #0x900071
|
ldr r5,param5
|
||||||
cmn r0,#126
|
ldr r6,param6
|
||||||
bls .LDone
|
bl FPC_SYSCALL
|
||||||
rsb r4,r0,#0
|
|
||||||
ldr r2,.Lthread_var
|
|
||||||
ldr r2,[r2]
|
|
||||||
ldr r0,.LErrno
|
|
||||||
cmp r2,#0
|
|
||||||
bne .LThread
|
|
||||||
str r4,[r0,#4]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LThread:
|
|
||||||
ldr r0,[r0]
|
|
||||||
mov lr,pc
|
|
||||||
mov pc,r2
|
|
||||||
str r4,[r0]
|
|
||||||
mvn r0,#0
|
|
||||||
b .LDone
|
|
||||||
.LErrno:
|
|
||||||
.word Errno
|
|
||||||
.Lthread_var:
|
|
||||||
.word fpc_threadvar_relocate_proc
|
|
||||||
.LDone:
|
|
||||||
ldr r4,_r4
|
|
||||||
ldr r5,_r5
|
|
||||||
ldr r6,_r6
|
|
||||||
end ['r4','r5','r6'];
|
end ['r4','r5','r6'];
|
||||||
|
Loading…
Reference in New Issue
Block a user