Przeglądaj źródła

+ completed x86-64/linux system unit

florian 21 lat temu
rodzic
commit
c9122a4719

+ 6 - 1
rtl/i386/i386.inc

@@ -25,12 +25,14 @@ procedure fpc_cpuinit;
 begin
 begin
 end;
 end;
 
 
+
 function geteipasebx : pointer;assembler;[public,alias:'FPC_GETEIPINEBX'];
 function geteipasebx : pointer;assembler;[public,alias:'FPC_GETEIPINEBX'];
 asm
 asm
   movl (%esp),%ebx
   movl (%esp),%ebx
   ret
   ret
 end;
 end;
 
 
+
 {$ifndef FPC_SYSTEM_HAS_MOVE}
 {$ifndef FPC_SYSTEM_HAS_MOVE}
 {$define FPC_SYSTEM_HAS_MOVE}
 {$define FPC_SYSTEM_HAS_MOVE}
 procedure Move(const source;var dest;count:longint);assembler;
 procedure Move(const source;var dest;count:longint);assembler;
@@ -1455,7 +1457,10 @@ end;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.58  2004-01-11 11:10:07  jonas
+  Revision 1.59  2004-02-05 01:16:12  florian
+    + completed x86-64/linux system unit
+
+  Revision 1.58  2004/01/11 11:10:07  jonas
     + cgeneric.inc: implementations of rtl routines based on libc
     + cgeneric.inc: implementations of rtl routines based on libc
     * system.inc: include cgeneric.inc before powerpc.inc/i386.inc/... if
     * system.inc: include cgeneric.inc before powerpc.inc/i386.inc/... if
       FPC_USE_LIBC is defined
       FPC_USE_LIBC is defined

+ 5 - 2
rtl/inc/except.inc

@@ -38,7 +38,7 @@ Type
   TExceptObjectClass = Class of TObject;
   TExceptObjectClass = Class of TObject;
 
 
 Const
 Const
-  CatchAllExceptions = SizeInt(-1);
+  CatchAllExceptions : PtrInt = -1;
 {$ifdef SUPPORT_THREADVAR}
 {$ifdef SUPPORT_THREADVAR}
 ThreadVar
 ThreadVar
 {$else SUPPORT_THREADVAR}
 {$else SUPPORT_THREADVAR}
@@ -311,7 +311,10 @@ begin
 end;
 end;
 {
 {
   $Log$
   $Log$
-  Revision 1.13  2003-11-26 20:12:08  michael
+  Revision 1.14  2004-02-05 01:16:12  florian
+    + completed x86-64/linux system unit
+
+  Revision 1.13  2003/11/26 20:12:08  michael
   + New runerror 231 (exception stack error) and 232 (nothread support)
   + New runerror 231 (exception stack error) and 232 (nothread support)
 
 
   Revision 1.12  2003/10/06 15:59:20  florian
   Revision 1.12  2003/10/06 15:59:20  florian

+ 6 - 3
rtl/inc/filerec.inc

@@ -26,8 +26,8 @@ const
 type
 type
   FileRec = Packed Record
   FileRec = Packed Record
     Handle    : THandle;
     Handle    : THandle;
-    Mode,
-    RecSize   : longint;
+    Mode      : longint;
+    RecSize   : SizeInt;
     _private  : array[1..32] of byte;
     _private  : array[1..32] of byte;
     UserData  : array[1..16] of byte;
     UserData  : array[1..16] of byte;
     name      : array[0..filerecnamelength] of char;
     name      : array[0..filerecnamelength] of char;
@@ -35,7 +35,10 @@ type
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.4  2003-11-03 09:42:27  marco
+  Revision 1.5  2004-02-05 01:16:12  florian
+    + completed x86-64/linux system unit
+
+  Revision 1.4  2003/11/03 09:42:27  marco
    * Peter's Cardinal<->Longint fixes patch
    * Peter's Cardinal<->Longint fixes patch
 
 
   Revision 1.3  2002/09/07 15:07:45  peter
   Revision 1.3  2002/09/07 15:07:45  peter

+ 5 - 2
rtl/inc/textrec.inc

@@ -32,7 +32,7 @@ type
     bufsize,
     bufsize,
     _private,
     _private,
     bufpos,
     bufpos,
-    bufend    : longint;
+    bufend    : SizeInt;
     bufptr    : ^textbuf;
     bufptr    : ^textbuf;
     openfunc,
     openfunc,
     inoutfunc,
     inoutfunc,
@@ -45,7 +45,10 @@ type
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.4  2003-11-03 09:42:28  marco
+  Revision 1.5  2004-02-05 01:16:12  florian
+    + completed x86-64/linux system unit
+
+  Revision 1.4  2003/11/03 09:42:28  marco
    * Peter's Cardinal<->Longint fixes patch
    * Peter's Cardinal<->Longint fixes patch
 
 
   Revision 1.3  2002/09/07 15:07:46  peter
   Revision 1.3  2002/09/07 15:07:46  peter

+ 5 - 4
rtl/linux/i386/sighnd.inc

@@ -77,12 +77,13 @@ end;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.2  2003-11-01 01:58:11  marco
+  Revision 1.3  2004-02-05 01:16:12  florian
+    + completed x86-64/linux system unit
+
+  Revision 1.2  2003/11/01 01:58:11  marco
    * more small fixes.
    * more small fixes.
 
 
   Revision 1.1  2003/11/01 01:27:20  marco
   Revision 1.1  2003/11/01 01:27:20  marco
    * initial version from 1.0.x branch
    * initial version from 1.0.x branch
-
-
 }
 }
- 
+

+ 8 - 1
rtl/linux/ossysc.inc

@@ -361,6 +361,10 @@ type
 {$define OLDMMAP}
 {$define OLDMMAP}
 {$endif cpuarm}
 {$endif cpuarm}
 
 
+{$ifdef cpux86_64}
+{$define OLDMMAP}
+{$endif cpux86_64}
+
 Function Fpmmap(adr:pointer;len:size_t;prot:cint;flags:cint;fd:cint;off:off_t):pointer;  [public, alias : 'FPC_SYSC_MMAP'];
 Function Fpmmap(adr:pointer;len:size_t;prot:cint;flags:cint;fd:cint;off:off_t):pointer;  [public, alias : 'FPC_SYSC_MMAP'];
 // OFF_T procedure, and returns a pointer, NOT cint.
 // OFF_T procedure, and returns a pointer, NOT cint.
 
 
@@ -475,7 +479,10 @@ end;
 
 
 {
 {
  $Log$
  $Log$
- Revision 1.14  2004-01-31 16:25:48  florian
+ Revision 1.15  2004-02-05 01:16:12  florian
+   + completed x86-64/linux system unit
+
+ Revision 1.14  2004/01/31 16:25:48  florian
    * use wait4 instead of waitpid on arm
    * use wait4 instead of waitpid on arm
 
 
  Revision 1.13  2004/01/23 00:00:06  florian
  Revision 1.13  2004/01/23 00:00:06  florian

+ 10 - 2
rtl/linux/signal.inc

@@ -133,7 +133,6 @@ type
 
 
 
 
 {$ifdef cpupowerpc}
 {$ifdef cpupowerpc}
-
   { from include/ppc/ptrace.h }
   { from include/ppc/ptrace.h }
   pptregs = ^tptregs;
   pptregs = ^tptregs;
   tptregs = record
   tptregs = record
@@ -242,6 +241,12 @@ type
   end;
   end;
 {$endif cpusparc}
 {$endif cpusparc}
 
 
+{$ifdef cpux86_64}
+{ get it from glibc/sysdeps/unix/sysv/linux/x86_64/sys/uncontext.h }
+  PSigContextRec = ^SigContextRec;
+  SigContextRec = record
+  end;
+{$endif cpux86_64}
 
 
 {$ifdef cpuarm}
 {$ifdef cpuarm}
   PSigContextRec = ^SigContextRec;
   PSigContextRec = ^SigContextRec;
@@ -342,7 +347,10 @@ type
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.15  2004-01-01 16:28:16  jonas
+  Revision 1.16  2004-02-05 01:16:12  florian
+    + completed x86-64/linux system unit
+
+  Revision 1.15  2004/01/01 16:28:16  jonas
     * fixed signal handling
     * fixed signal handling
 
 
   Revision 1.14  2003/11/21 00:40:06  florian
   Revision 1.14  2003/11/21 00:40:06  florian

+ 93 - 0
rtl/linux/x86_64/sighnd.inc

@@ -0,0 +1,93 @@
+{
+    $Id$
+    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.
+
+    Signal handler is arch dependant due to processor to language
+    exception conversion.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+
+const
+  FPU_All = $7f;
+
+function GetFPUState(const SigContext : SigContextRec) : longint;
+begin
+{!!!!!!!
+  if assigned(SigContext.fpstate) then
+    GetfpuState:=SigContext.fpstate^.sw;
+{$ifdef SYSTEM_DEBUG}
+  writeln('xx:',sigcontext.en_tw,' ',sigcontext.en_cw);
+{$endif SYSTEM_DEBUG}
+{$ifdef SYSTEM_DEBUG}
+  Writeln(stderr,'FpuState = ',GetFpuState);
+{$endif SYSTEM_DEBUG}
+}
+end;
+
+procedure SignalToRunerror(Sig: longint; SigContext: SigContextRec); cdecl;
+
+var
+  res,fpustate : word;
+begin
+  res:=0;
+  case sig of
+    SIGFPE :
+          begin
+    { this is not allways necessary but I don't know yet
+      how to tell if it is or not PM }
+          res:=200;
+          fpustate:=GetFPUState(SigContext);
+          if (FpuState and FPU_All) <> 0 then
+            begin
+              { first check the more precise options }
+              if (FpuState and FPU_DivisionByZero)<>0 then
+                res:=200
+              else if (FpuState and FPU_Overflow)<>0 then
+                res:=205
+              else if (FpuState and FPU_Underflow)<>0 then
+                res:=206
+              else if (FpuState and FPU_Denormal)<>0 then
+                res:=216
+              else if (FpuState and (FPU_StackOverflow or FPU_StackUnderflow))<>0 Then
+                res:=207
+              else if (FpuState and FPU_Invalid)<>0 then
+                res:=216
+              else
+                res:=207;  {'Coprocessor Error'}
+            end;
+            sysResetFPU;
+        end;
+    SIGILL,
+    SIGBUS,
+    SIGSEGV :
+        res:=216;
+  end;
+{ give runtime error at the position where the signal was raised }
+{!!!!
+  if res<>0 then
+    HandleErrorAddrFrame(res,pointer(SigContext.eip),pointer(SigContext.ebp));
+}
+end;
+
+{
+  $Log$
+  Revision 1.1  2004-02-05 01:16:12  florian
+    + completed x86-64/linux system unit
+
+  Revision 1.2  2003/11/01 01:58:11  marco
+   * more small fixes.
+
+  Revision 1.1  2003/11/01 01:27:20  marco
+   * initial version from 1.0.x branch
+}
+

+ 51 - 0
rtl/linux/x86_64/stat.inc

@@ -0,0 +1,51 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 1999-2004 by Jonas Maebe,
+    member of the Free Pascal development team.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+{$ifndef FPC_USE_LIBC} // kernel record
+
+  stat = packed record
+    st_dev : qword;
+    st_ino : qword;
+    st_nlink : qword;
+
+    st_mode : dword;
+    st_uid : dword;
+    st_gid : dword;
+    __pad0 : dword;
+    st_rdev : qword;
+    st_size : int64;
+    st_blksize : int64;
+    st_blocks : int64;      { Number 512-byte blocks allocated. }
+
+    st_atime : qword;
+    __reserved0 : qword;    { reserved for atime.nanoseconds }
+    st_mtime : qword;
+    __reserved1 : qword;    { reserved for atime.nanoseconds }
+    st_ctime : qword;
+    __reserved2 : qword;    { reserved for atime.nanoseconds }
+    __unused : array[0..2] of int64;
+  end;
+
+{$else}
+
+(* get it from glibc/sysdeps/unix/sysv/linux/x86_64/bits/stat.h and check defines with gcc *)
+
+{$endif}
+
+{
+  $Log$
+  Revision 1.1  2004-02-05 01:16:12  florian
+    + completed x86-64/linux system unit
+}

+ 5 - 3
rtl/linux/x86_64/syscall.inc

@@ -17,7 +17,7 @@
  **********************************************************************}
  **********************************************************************}
 
 
 
 
-{$ASMMODE ATT}
+{$ASMMODE GAS}
 
 
 function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL0'];
 function FpSysCall(sysnr:TSysParam):TSysResult; assembler;[public,alias:'FPC_SYSCALL0'];
 
 
@@ -266,7 +266,6 @@ Procedure FpSysCall( callnr:TSysParam;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.
 }
 }
-{$ASMMODE ATT}
 {$define fpc_syscall_ok}
 {$define fpc_syscall_ok}
 asm
 asm
 { load the registers... }
 { load the registers... }
@@ -341,7 +340,10 @@ end;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.1  2003-04-30 22:11:06  florian
+  Revision 1.2  2004-02-05 01:16:12  florian
+    + completed x86-64/linux system unit
+
+  Revision 1.1  2003/04/30 22:11:06  florian
     + for a lot of x86-64 dependend files mostly dummies added
     + for a lot of x86-64 dependend files mostly dummies added
 }
 }
 
 

+ 5 - 2
rtl/x86_64/math.inc

@@ -117,7 +117,7 @@
             fwait
             fwait
             movw -4(%rbp),%cx
             movw -4(%rbp),%cx
             orw $0x0c3f,%cx
             orw $0x0c3f,%cx
-            movw %cx,-8(rbp)
+            movw %cx,-8(%rbp)
             fldcw -8(%rbp)
             fldcw -8(%rbp)
             fwait
             fwait
             fldt d
             fldt d
@@ -198,6 +198,9 @@
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.1  2003-04-30 22:11:06  florian
+  Revision 1.2  2004-02-05 01:16:12  florian
+    + completed x86-64/linux system unit
+
+  Revision 1.1  2003/04/30 22:11:06  florian
     + for a lot of x86-64 dependend files mostly dummies added
     + for a lot of x86-64 dependend files mostly dummies added
 }
 }

+ 65 - 1
rtl/x86_64/x86_64.inc

@@ -25,7 +25,52 @@
                                Primitives
                                Primitives
 ****************************************************************************}
 ****************************************************************************}
 
 
+procedure fpc_cpuinit;
+begin
+end;
+
+
+{$define FPC_SYSTEM_HAS_SPTR}
+Function Sptr : Pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+        movl    %rsp,%rax
+end ['RAX'];
+
+
+{$define FPC_SYSTEM_HAS_GET_FRAME}
+function get_frame:pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+        movq    %rbp,%rax
+end ['RAX'];
+
+
+{$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
+function get_caller_addr(framebp:pointer):pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+{$ifndef REGCALL}
+        movq    framebp,%rax
+{$endif}
+        orq     %rax,%rax
+        jz      .Lg_a_null
+        movq    4(%rax),%rax
+.Lg_a_null:
+end ['RAX'];
+
+
+{$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
+function get_caller_frame(framebp:pointer):pointer;assembler;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+{$ifndef REGCALL}
+        movl    framebp,%rax
+{$endif}
+        orl     %rax,%rax
+        jz      .Lgnf_null
+        movl    (%rax),%rax
+.Lgnf_null:
+end ['RAX'];
 {$define FPC_SYSTEM_HAS_MOVE}
 {$define FPC_SYSTEM_HAS_MOVE}
+
+
 procedure Move(const source;var dest;count:longint);assembler;
 procedure Move(const source;var dest;count:longint);assembler;
   asm
   asm
      { rdi destination
      { rdi destination
@@ -237,9 +282,28 @@ procedure inclocked(var l : longint);assembler;
 .Linclockedend:
 .Linclockedend:
   end;
   end;
 
 
+{****************************************************************************
+                                  FPU
+****************************************************************************}
+
+const
+  fpucw : word = $1332;
+  { Internal constants for use in system unit }
+  FPU_Invalid = 1;
+  FPU_Denormal = 2;
+  FPU_DivisionByZero = 4;
+  FPU_Overflow = 8;
+  FPU_Underflow = $10;
+  FPU_StackUnderflow = $20;
+  FPU_StackOverflow = $40;
+  FPU_ExceptionMask = $ff;
+
 {
 {
   $Log$
   $Log$
-  Revision 1.4  2004-01-20 12:52:18  florian
+  Revision 1.5  2004-02-05 01:16:12  florian
+    + completed x86-64/linux system unit
+
+  Revision 1.4  2004/01/20 12:52:18  florian
     * some problems with x86-64 inline assembler fixed
     * some problems with x86-64 inline assembler fixed
 
 
   Revision 1.3  2003/05/01 08:05:23  florian
   Revision 1.3  2003/05/01 08:05:23  florian