* several fixes, addition of Mach trap numbers (thye are simply syscalls

with a negative number)
This commit is contained in:
Jonas Maebe 2003-05-25 13:51:58 +00:00
parent eac3e6f828
commit 34cdc0a37f

View File

@ -1,110 +1,141 @@
{ {
$Id$ $Id$
Copyright (c) 2002 by Marco van de Voort This file is part of the Free Pascal run time library.
Copyright (c) 1999-2000 by Michael Van Canneyt,
member of the Free Pascal development team.
Syscall functions for i386 *BSD. See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
GNU General Public License for more details.
You should have received a copy of the GNU General Public License **********************************************************************}
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**************************************************************************** {No debugging for syslinux include !}
{$IFDEF SYS_LINUX}
procedure actualsyscall; assembler; {$UNDEF SYSCALL_DEBUG}
{$ENDIF SYS_LINUX}
asm
sc
b LSyscallError
blr
LSyscallError:
stw r3,errno
end;
function Do_SysCall(sysnr:LONGINT):longint; assembler; [public,alias:'FPC_DOSYS0']; {*****************************************************************************
--- Main:The System Call Self ---
*****************************************************************************}
function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL0'];
{
This function puts the registers in place, does the call, and then
copies back the registers as they are after the SysCall.
}
asm asm
mr r0,r3 mr r0,r3
b actualsyscall sc
blr
neg r3, r3
lis r4,(Errno+4)@ha
stw r3,(Errno+4)@l(r4)
li r3,-1
end; end;
function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
function Do_SysCall(sysnr,param1:longint):longint; assembler;[public,alias:'FPC_DOSYS1']; {
This function puts the registers in place, does the call, and then
asm copies back the registers as they are after the SysCall.
}
asm
mr r0,r3 mr r0,r3
mr r3,r4 mr r3,r4
b actualsyscall sc
end; blr
neg r3, r3
lis r4,(Errno+4)@ha
stw r3,(Errno+4)@l(r4)
li r3,-1
end;
function Do_SysCall(sysnr,param1:integer):longint; assembler;[public,alias:'FPC_DOSYS1w']; function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
{
asm This function puts the registers in place, does the call, and then
rlwinm r0,r3,0,0,15 copies back the registers as they are after the SysCall.
extsh r3,r4 }
b actualsyscall asm
end;
function Do_SysCall(sysnr,param1,param2:LONGINT):longint; assembler; [public,alias:'FPC_DOSYS2'];
asm
mr r0,r3 mr r0,r3
mr r3,r4 mr r3,r4
mr r4,r5 mr r4,r5
b actualsyscall sc
end; blr
neg r3, r3
lis r4,(Errno+4)@ha
stw r3,(Errno+4)@l(r4)
li r3,-1
end;
function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
function Do_SysCall(sysnr,param1,param2,param3:LONGINT):longint; assembler;[public,alias:'FPC_DOSYS3']; {
This function puts the registers in place, does the call, and then
asm copies back the registers as they are after the SysCall.
}
asm
mr r0,r3 mr r0,r3
mr r3,r4 mr r3,r4
mr r4,r5 mr r4,r5
mr r5,r6 mr r5,r6
b actualsyscall sc
blr
neg r3, r3
lis r4,(Errno+4)@ha
stw r3,(Errno+4)@l(r4)
li r3,-1
end; end;
function Do_SysCall(sysnr,param1,param2,param3,param4:LONGINT):longint; assembler;[public,alias:'FPC_DOSYS4']; 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
copies back the registers as they are after the SysCall.
}
asm asm
mr r0,r3 mr r0,r3
mr r3,r4 mr r3,r4
mr r4,r5 mr r4,r5
mr r5,r6 mr r5,r6
mr r6,r7 mr r6,r7
b actualsyscall sc
blr
neg r3, r3
lis r4,(Errno+4)@ha
stw r3,(Errno+4)@l(r4)
li r3,-1
end; end;
function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL5'];
function Do_SysCall(sysnr,param1,param2,param3,param4,param5:LONGINT):longint; assembler;[public,alias:'FPC_DOSYS5']; {
This function puts the registers in place, does the call, and then
asm copies back the registers as they are after the SysCall.
}
asm
mr r0,r3 mr r0,r3
mr r3,r4 mr r3,r4
mr r4,r5 mr r4,r5
mr r5,r6 mr r5,r6
mr r6,r7 mr r6,r7
mr r7,r8 mr r7,r8
b actualsyscall sc
blr
neg r3, r3
lis r4,(Errno+4)@ha
stw r3,(Errno+4)@l(r4)
li r3,-1
end; end;
function Do_SysCall(sysnr,param1,param2,param3,param4,param5,param6:LONGINT):int64; assembler;[public,alias:'FPC_DOSYS6']; 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
copies back the registers as they are after the SysCall.
}
asm asm
mr r0,r3 mr r0,r3
mr r3,r4 mr r3,r4
@ -113,12 +144,20 @@ asm
mr r6,r7 mr r6,r7
mr r7,r8 mr r7,r8
mr r8,r9 mr r8,r9
b actualsyscall sc
blr
neg r3, r3
lis r4,(Errno+4)@ha
stw r3,(Errno+4)@l(r4)
li r3,-1
end; end;
function Do_SysCall(sysnr,param1,param2,param3,param4,param5,param6,param7:LONGINT):int64; assembler; [public,alias:'FPC_DOSYS7']; function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6,param7:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL7'];
{
This function puts the registers in place, does the call, and then
copies back the registers as they are after the SysCall.
}
asm asm
mr r0,r3 mr r0,r3
mr r3,r4 mr r3,r4
@ -128,13 +167,41 @@ asm
mr r7,r8 mr r7,r8
mr r8,r9 mr r8,r9
mr r9,r10 mr r9,r10
b actualsyscall sc
blr
neg r3, r3
lis r4,(Errno+4)@ha
stw r3,(Errno+4)@l(r4)
li r3,-1
end; end;
{ {
$Log$ $Log$
Revision 1.1 2002-10-26 14:33:09 jonas Revision 1.2 2003-05-25 13:51:58 jonas
+ initial version * several fixes, addition of Mach trap numbers (thye are simply syscalls
: with a negative number)
Revision 1.6 2003/05/23 21:58:30 jonas
* fixed storing to errno for single threaded programs
Revision 1.5 2003/05/11 16:07:55 jonas
* fixed mmap for non-i386 non-m68k architectures (not sure about
x86-64)
Revision 1.4 2003/04/22 17:07:55 florian
* there where two SYSCALL1 procedures for the powerpc, fixed
Revision 1.3 2003/01/09 13:38:26 florian
* syscall stuff fixed
Revision 1.2 2002/12/22 16:00:28 jonas
+ added syscallh.inc, adapted syscall.inc
Revision 1.1 2002/11/09 20:32:14 marco
* powerpc version. Threadsafe errno access not yet done.
Revision 1.1 2002/10/14 19:39:44 peter
* syscall moved into seperate include
} }