Browse Source

--- Merging r17037 into '.':
U rtl/unix/aliasptp.inc
--- Merging r17038 into '.':
U rtl/freebsd/sysnr.inc
U rtl/freebsd/freebsd.pas
--- Merging r17060 into '.':
U rtl/x86_64/cpu.pp

# revisions: 17037,17038,17060
------------------------------------------------------------------------
r17037 | marco | 2011-02-27 21:14:11 +0100 (Sun, 27 Feb 2011) | 1 line
Changed paths:
M /trunk/rtl/unix/aliasptp.inc

* added alias for statsfs
------------------------------------------------------------------------
------------------------------------------------------------------------
r17038 | marco | 2011-02-27 21:15:39 +0100 (Sun, 27 Feb 2011) | 1 line
Changed paths:
M /trunk/rtl/freebsd/freebsd.pas
M /trunk/rtl/freebsd/sysnr.inc

* added getfsstat
------------------------------------------------------------------------
------------------------------------------------------------------------
r17060 | marco | 2011-03-02 15:45:38 +0100 (Wed, 02 Mar 2011) | 3 lines
Changed paths:
M /trunk/rtl/x86_64/cpu.pp

* fix for older GAS assemblers that don't parse (rex64Z) "lock cmpxchg8b (%r8)" properly, as used on FreeBSD7 and up till 8.2.


------------------------------------------------------------------------

git-svn-id: branches/fixes_2_4@17061 -

marco 14 years ago
parent
commit
c6999eb6eb
4 changed files with 21 additions and 1 deletions
  1. 8 0
      rtl/freebsd/freebsd.pas
  2. 1 0
      rtl/freebsd/sysnr.inc
  3. 1 0
      rtl/unix/aliasptp.inc
  4. 11 1
      rtl/x86_64/cpu.pp

+ 8 - 0
rtl/freebsd/freebsd.pas

@@ -185,6 +185,10 @@ Type
   function kse_release(timeout: PTimeSpec): cInt; extdecl;
   function kse_switchin(tmbx: PKseThrMailBox; flags: cInt): cInt; extdecl;
 
+{$ifndef FPC_USE_LIBC}
+function fpgetfsstat(buf:pstatfs;bufsize:clong;flags:cint):cint;
+{$endif} 
+
 Const
  MAP_FILE         = $0000;  { map from file (default) }
  MAP_ANON         = $1000;  { allocated from memory, swap space }
@@ -294,6 +298,10 @@ begin
   kse_switchin:=do_SysCall(syscall_nr_kse_switchin, TSysParam(tmbx), TSysParam(flags));
 end;
 
+function fpgetfsstat(buf:pstatfs;bufsize:clong;flags:cint):cint;
+begin
+  fpgetfsstat:=do_syscall(syscall_nr_getfsstat,TSysParam(buf),TSysParam(Bufsize),TSysParam(Flags));
+end;
 {$ENDIF}
 
 end.

+ 1 - 0
rtl/freebsd/sysnr.inc

@@ -230,6 +230,7 @@ syscall_nr_getdirentries                =196;
 }
 
 {More or less checked/in use FreeBSD syscalls}
+ syscall_nr_getfsstat                   = 18;
  syscall_nr_readv                       = 120;
  syscall_nr_writev                      = 121;
  syscall_nr_pread                       = 173;

+ 1 - 0
rtl/unix/aliasptp.inc

@@ -74,6 +74,7 @@ type
     pthread_t         = UnixType.pthread_t;
 
     tstatfs  = UnixType.TStatFs;
+    pstatfs  = UnixType.PStatFs;
 
 CONST
     ARG_MAX       = UnixType.ARG_MAX;

+ 11 - 1
rtl/x86_64/cpu.pp

@@ -18,6 +18,13 @@ unit cpu;
 
   interface
 
+  {$ifdef freebsd}                 // FreeBSD 7/8 have binutils version that don't support cmpxchg16b
+			           // Unless overridebinutils is defined (for ports usage), use db instead of the instruction
+     {$ifndef overridebinutils}
+       {$define oldbinutils}
+     {$endif} 
+  {$endif}
+
     uses
       sysutils;
 
@@ -60,8 +67,11 @@ unit cpu;
         movq (%r9),%rax
         movq 8(%r9),%rdx
 
+        {$ifdef oldbinutils}
+           .byte 0xF0,0x49,0x0F,0xC7,0x08 
+        {$else}
         lock cmpxchg16b (%r8)
-
+        {$endif}
         { restore result pointer }
         popq %rcx