* Optimize syscalls for arm-linux.

git-svn-id: trunk@8191 -
This commit is contained in:
yury 2007-07-29 15:57:15 +00:00
parent 27db4ec55a
commit 4b8777eb5a

View File

@ -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'];