Browse Source

* syscalls implemented

peter 22 years ago
parent
commit
9e1bc11060
1 changed files with 211 additions and 103 deletions
  1. 211 103
      rtl/linux/sparc/syscall.inc

+ 211 - 103
rtl/linux/sparc/syscall.inc

@@ -22,165 +22,270 @@
                      --- 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;[public,alias:'FPC_SYSCALL0'];
 {
 {
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
-begin{asm}
-{  mr  r0,r3
-  sc
-  bnslr
-  neg   r3, r3
-  lis   r4,Errno@ha
-  stw   r3,Errno@l(r4)
-  li    r3,-1}
+asm
+        or      %i0,%g0,%g1
+        ta      0x10
+        bcc     .LSyscOK0
+        nop
+        sethi   %hi(FPC_THREADVAR_RELOCATE),%o0
+        or      %o0,%lo(FPC_THREADVAR_RELOCATE),%o0
+        ld      [%o0],%o7
+        subcc   %o7,%g0,%g0
+        bne     .LThread0
+        nop
+        sethi   %hi(U_SYSTEM_ERRNO+4),%o0
+        ba      .LNoThread0
+        or      %o0,%lo(U_SYSTEM_ERRNO+4),%o0
+.LThread0:
+        sethi   %hi(U_SYSTEM_ERRNO),%o0
+        ld      [%o7],%o1
+        or      %o0,%lo(U_SYSTEM_ERRNO),%o0
+        call    %o1
+.LNoThread0:
+        st      %i0,[%o0]
+        mov     -1,%o0
+.LSyscOK0:
 end;
 end;
 
 
-function FpSysCall(sysnr,param1:TSysParam):TSysResult; {assembler;}[public,alias:'FPC_SYSCALL1'];
+
+function FpSysCall(sysnr,param1:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL1'];
 {
 {
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
-begin{asm}
-{  mr  r0,r3
-  mr  r3,r4
-  sc
-  bnslr
-  neg   r3, r3
-  lis   r4,Errno@ha
-  stw   r3,Errno@l(r4)
-  li    r3,-1}
+asm
+        or      %i0,%g0,%g1
+        or      %i1,%g0,%o0
+        ta      0x10
+        bcc     .LSyscOK1
+        nop
+        sethi   %hi(FPC_THREADVAR_RELOCATE),%o0
+        or      %o0,%lo(FPC_THREADVAR_RELOCATE),%o0
+        ld      [%o0],%o7
+        subcc   %o7,%g0,%g0
+        bne     .LThread1
+        nop
+        sethi   %hi(U_SYSTEM_ERRNO+4),%o0
+        ba      .LNoThread1
+        or      %o0,%lo(U_SYSTEM_ERRNO+4),%o0
+.LThread1:
+        sethi   %hi(U_SYSTEM_ERRNO),%o0
+        ld      [%o7],%o1
+        or      %o0,%lo(U_SYSTEM_ERRNO),%o0
+        call    %o1
+.LNoThread1:
+        st      %i0,[%o0]
+        mov     -1,%o0
+.LSyscOK1:
 end;
 end;
 
 
 
 
-function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; {assembler;}[public,alias:'FPC_SYSCALL2'];
+function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL2'];
 {
 {
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
-begin{asm}
-{  mr  r0,r3
-  mr  r3,r4
-  mr  r4,r5
-  sc
-   bnslr
-   neg   r3, r3
-   lis   r4,Errno@ha
-   stw   r3,Errno@l(r4)
-   li    r3,-1}
+asm
+        or      %i0,%g0,%g1
+        or      %i1,%g0,%o0
+        or      %i2,%g0,%o1
+        ta      0x10
+        bcc     .LSyscOK2
+        nop
+        sethi   %hi(FPC_THREADVAR_RELOCATE),%o0
+        or      %o0,%lo(FPC_THREADVAR_RELOCATE),%o0
+        ld      [%o0],%o7
+        subcc   %o7,%g0,%g0
+        bne     .LThread2
+        nop
+        sethi   %hi(U_SYSTEM_ERRNO+4),%o0
+        ba      .LNoThread2
+        or      %o0,%lo(U_SYSTEM_ERRNO+4),%o0
+.LThread2:
+        sethi   %hi(U_SYSTEM_ERRNO),%o0
+        ld      [%o7],%o1
+        or      %o0,%lo(U_SYSTEM_ERRNO),%o0
+        call    %o1
+.LNoThread2:
+        st      %i0,[%o0]
+        mov     -1,%o0
+.LSyscOK2:
 end;
 end;
 
 
-function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; {assembler;}[public,alias:'FPC_SYSCALL3'];
+
+function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL3'];
 {
 {
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
-begin{asm}
-{  mr  r0,r3
-  mr  r3,r4
-  mr  r4,r5
-  mr  r5,r6
-  sc
-   bnslr
-   neg   r3, r3
-   lis   r4,Errno@ha
-   stw   r3,Errno@l(r4)
-   li    r3,-1}
-
+asm
+        or      %i0,%g0,%g1
+        or      %i1,%g0,%o0
+        or      %i2,%g0,%o1
+        or      %i3,%g0,%o2
+        ta      0x10
+        bcc     .LSyscOK3
+        nop
+        sethi   %hi(FPC_THREADVAR_RELOCATE),%o0
+        or      %o0,%lo(FPC_THREADVAR_RELOCATE),%o0
+        ld      [%o0],%o7
+        subcc   %o7,%g0,%g0
+        bne     .LThread3
+        nop
+        sethi   %hi(U_SYSTEM_ERRNO+4),%o0
+        ba      .LNoThread3
+        or      %o0,%lo(U_SYSTEM_ERRNO+4),%o0
+.LThread3:
+        sethi   %hi(U_SYSTEM_ERRNO),%o0
+        ld      [%o7],%o1
+        or      %o0,%lo(U_SYSTEM_ERRNO),%o0
+        call    %o1
+.LNoThread3:
+        st      %i0,[%o0]
+        mov     -1,%o0
+.LSyscOK3:
 end;
 end;
 
 
 
 
-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 puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
-begin{asm}
-{  mr  r0,r3
-  mr  r3,r4
-  mr  r4,r5
-  mr  r5,r6
-  mr  r6,r7
-  sc
-   bnslr
-   neg   r3, r3
-   lis   r4,Errno@ha
-   stw   r3,Errno@l(r4)
-   li    r3,-1}
+asm
+        or      %i0,%g0,%g1
+        or      %i1,%g0,%o0
+        or      %i2,%g0,%o1
+        or      %i3,%g0,%o2
+        or      %i4,%g0,%o3
+        ta      0x10
+        bcc     .LSyscOK4
+        nop
+        sethi   %hi(FPC_THREADVAR_RELOCATE),%o0
+        or      %o0,%lo(FPC_THREADVAR_RELOCATE),%o0
+        ld      [%o0],%o7
+        subcc   %o7,%g0,%g0
+        bne     .LThread4
+        nop
+        sethi   %hi(U_SYSTEM_ERRNO+4),%o0
+        ba      .LNoThread4
+        or      %o0,%lo(U_SYSTEM_ERRNO+4),%o0
+.LThread4:
+        sethi   %hi(U_SYSTEM_ERRNO),%o0
+        ld      [%o7],%o1
+        or      %o0,%lo(U_SYSTEM_ERRNO),%o0
+        call    %o1
+.LNoThread4:
+        st      %i0,[%o0]
+        mov     -1,%o0
+.LSyscOK4:
 end;
 end;
 
 
-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 puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
-begin{asm}
-{  mr  r0,r3
-  mr  r3,r4
-  mr  r4,r5
-  mr  r5,r6
-  mr  r6,r7
-  mr  r7,r8
-  sc
-   bnslr
-   neg   r3, r3
-   lis   r4,Errno@ha
-   stw   r3,Errno@l(r4)
-   li    r3,-1}
+asm
+        or      %i0,%g0,%g1
+        or      %i1,%g0,%o0
+        or      %i2,%g0,%o1
+        or      %i3,%g0,%o2
+        or      %i4,%g0,%o3
+        or      %i5,%g0,%o4
+        ta      0x10
+        bcc     .LSyscOK5
+        nop
+        sethi   %hi(FPC_THREADVAR_RELOCATE),%o0
+        or      %o0,%lo(FPC_THREADVAR_RELOCATE),%o0
+        ld      [%o0],%o7
+        subcc   %o7,%g0,%g0
+        bne     .LThread5
+        nop
+        sethi   %hi(U_SYSTEM_ERRNO+4),%o0
+        ba      .LNoThread5
+        or      %o0,%lo(U_SYSTEM_ERRNO+4),%o0
+.LThread5:
+        sethi   %hi(U_SYSTEM_ERRNO),%o0
+        ld      [%o7],%o1
+        or      %o0,%lo(U_SYSTEM_ERRNO),%o0
+        call    %o1
+.LNoThread5:
+        st      %i0,[%o0]
+        mov     -1,%o0
+.LSyscOK5:
 end;
 end;
 
 
 
 
-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 puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
-begin{asm}
-{  mr  r0,r3
-  mr  r3,r4
-  mr  r4,r5
-  mr  r5,r6
-  mr  r6,r7
-  mr  r7,r8
-  sc
-   bnslr
-   neg   r3, r3
-   lis   r4,Errno@ha
-   stw   r3,Errno@l(r4)
-   li    r3,-1}
+asm
+        or      %i0,%g0,%g1
+        or      %i1,%g0,%o0
+        or      %i2,%g0,%o1
+        or      %i3,%g0,%o2
+        or      %i4,%g0,%o3
+        ld      [%i6+92],%o5
+        or      %i5,%g0,%o4
+        ta      0x10
+        bcc     .LSyscOK6
+        nop
+        sethi   %hi(FPC_THREADVAR_RELOCATE),%o0
+        or      %o0,%lo(FPC_THREADVAR_RELOCATE),%o0
+        ld      [%o0],%o7
+        subcc   %o7,%g0,%g0
+        bne     .LThread6
+        nop
+        sethi   %hi(U_SYSTEM_ERRNO+4),%o0
+        ba      .LNoThread6
+        or      %o0,%lo(U_SYSTEM_ERRNO+4),%o0
+.LThread6:
+        sethi   %hi(U_SYSTEM_ERRNO),%o0
+        ld      [%o7],%o1
+        or      %o0,%lo(U_SYSTEM_ERRNO),%o0
+        call    %o1
+.LNoThread6:
+        st      %i0,[%o0]
+        mov     -1,%o0
+.LSyscOK6:
 end;
 end;
 
 
 
 
 // Old style syscall:
 // Old style syscall:
 // Better use ktrace/strace/gdb for debugging.
 // Better use ktrace/strace/gdb for debugging.
 
 
-Procedure FpSysCall( callnr:longint;var regs : SysCallregs );{assembler;}
+Procedure FpSysCall( callnr:longint;var regs : SysCallregs );assembler;
 {
 {
   This function puts the registers in place, does the call, and then
   This function puts the registers in place, does the call, and then
   copies back the registers as they are after the SysCall.
   copies back the registers as they are after the SysCall.
 }
 }
-begin{asm}
-{ load the registers... }
-(*  lwz  r5, 12(r4)
-  lwz  r6, 16(r4)
-  lwz  r7, 20(r4)
-  mr   r0, r3
-  lwz  r3, 4(r4)
-  stw  r4, regs
-  lwz  r4, 8(r4)
+asm
+  or   %i0,%g0,%g1
+  ld   [%i1],%o0
+  ld   [%i1+4],%o1
+  ld   [%i1+8],%o2
+  ld   [%i1+12],%o3
+  ld   [%i1+16],%o4
 { Go ! }
 { Go ! }
-  sc
-  nop
+  ta   0x10
 { Put back the registers... }
 { Put back the registers... }
-  lwz    r8, regs
-  stw    r3, 0(r8)
-  stw    r4, 4(r8)
-  stw    r5, 8(r8)
-  stw    r6, 12(r8)
-  stw    r7, 16(r8)*)
+  st   %o0,[%i1]
+  st   %o1,[%i1+4]
+  st   %o2,[%i1+8]
+  st   %o3,[%i1+12]
+  st   %o4,[%i1+16]
 end;
 end;
 
 
+
 {$IFDEF SYSCALL_DEBUG}
 {$IFDEF SYSCALL_DEBUG}
 Const
 Const
   DoSysCallDebug : Boolean = False;
   DoSysCallDebug : Boolean = False;
@@ -237,7 +342,10 @@ end;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.5  2003-06-02 22:05:03  mazen
+  Revision 1.6  2003-07-03 21:03:57  peter
+    * syscalls implemented
+
+  Revision 1.5  2003/06/02 22:05:03  mazen
   * fixing naming conflict in public clause of
   * fixing naming conflict in public clause of
    FPC_SYSCALL? definition
    FPC_SYSCALL? definition