Sfoglia il codice sorgente

+ cpu unit for arm (linux only so far)

git-svn-id: trunk@33184 -
florian 9 anni fa
parent
commit
84bb46a35d
4 ha cambiato i file con 101 aggiunte e 7 eliminazioni
  1. 1 0
      .gitattributes
  2. 91 0
      rtl/arm/cpu.pp
  3. 4 3
      rtl/linux/Makefile
  4. 5 4
      rtl/linux/Makefile.fpc

+ 1 - 0
.gitattributes

@@ -8206,6 +8206,7 @@ rtl/android/mipsel/prt0.as svneol=native#text/plain
 rtl/android/sysandroid.inc svneol=native#text/plain
 rtl/android/sysandroid.inc svneol=native#text/plain
 rtl/arm/arm.inc svneol=native#text/plain
 rtl/arm/arm.inc svneol=native#text/plain
 rtl/arm/armdefines.inc svneol=native#text/plain
 rtl/arm/armdefines.inc svneol=native#text/plain
+rtl/arm/cpu.pp svneol=native#text/pascal
 rtl/arm/divide.inc svneol=native#text/plain
 rtl/arm/divide.inc svneol=native#text/plain
 rtl/arm/int64p.inc svneol=native#text/plain
 rtl/arm/int64p.inc svneol=native#text/plain
 rtl/arm/makefile.cpu svneol=native#text/plain
 rtl/arm/makefile.cpu svneol=native#text/plain

+ 91 - 0
rtl/arm/cpu.pp

@@ -0,0 +1,91 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2016 by the Free Pascal development team
+
+    This unit contains some routines to get informations about the
+    processor
+
+    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.
+
+ **********************************************************************}
+{$mode objfpc}
+unit cpu;
+
+  interface
+
+    function VFPv4Support : Boolean;
+
+  implementation
+
+     var
+       has_vfpv4_support,
+       gothwcaps : boolean;
+       hwcaps : dword;
+
+     const
+      AT_NULL         = 0;
+      AT_HWCAPS       = 16;
+
+    type
+      TAuxiliaryValue = DWord;
+
+      TInternalUnion = record
+        a_val: DWord;           //* Integer value */
+          {* We use to have pointer elements added here.  We cannot do that,
+             though, since it does not work when using 32-bit definitions
+             on 64-bit platforms and vice versa.  *}
+      end;
+
+      Elf32_auxv_t = record
+        a_type: DWord;              //* Entry type */
+        a_un: TInternalUnion;
+      end;
+      TElf32AuxiliaryVector = Elf32_auxv_t;
+      PElf32AuxiliaryVector = ^TElf32AuxiliaryVector;
+
+    var
+      psysinfo: LongWord = 0;
+
+    procedure InitHWCaps;
+      var
+        ep: PPChar;
+        auxv: PElf32AuxiliaryVector;
+      begin
+        psysinfo := 0;
+        ep := envp;
+        while ep^ <> nil do
+          Inc(ep);
+
+        Inc(ep);
+
+        auxv := PElf32AuxiliaryVector(ep);
+
+        while auxv^.a_type <> AT_NULL do
+          begin
+            if auxv^.a_type = AT_HWCAPS then
+              begin
+                hwcaps := auxv^.a_un.a_val;
+                gothwcaps := true;
+                Break;
+            end;
+            Inc(auxv);
+          end;
+      end;
+
+
+    function VFPv4Support : Boolean;
+      begin
+        Result:=has_vfpv4_support;
+      end;
+
+begin
+  gothwcaps:=false;
+  InitHWCaps;
+  has_vfpv4_support:=gothwcaps and ((hwcaps and (1 shl 16))<>0);
+end.
+

+ 4 - 3
rtl/linux/Makefile

@@ -363,6 +363,7 @@ override FPCOPT+=-Ur
 endif
 endif
 ifeq ($(ARCH),arm)
 ifeq ($(ARCH),arm)
 override LOADERS+=ucprt0
 override LOADERS+=ucprt0
+CPU_UNITS=cpu
 endif
 endif
 SYSTEMUNIT=system
 SYSTEMUNIT=system
 ifdef RELEASE
 ifdef RELEASE
@@ -3673,7 +3674,7 @@ ports$(PPUEXT) : $(UNIXINC)/ports.pp unix$(PPUEXT) objpas$(PPUEXT)
 	$(COMPILER) $(UNIXINC)/ports.pp
 	$(COMPILER) $(UNIXINC)/ports.pp
 dl$(PPUEXT) : $(UNIXINC)/dl.pp $(SYSTEMUNIT)$(PPUEXT) unixtype$(PPUEXT) ctypes$(PPUEXT)
 dl$(PPUEXT) : $(UNIXINC)/dl.pp $(SYSTEMUNIT)$(PPUEXT) unixtype$(PPUEXT) ctypes$(PPUEXT)
 	$(COMPILER) $(UNIXINC)/dl.pp
 	$(COMPILER) $(UNIXINC)/dl.pp
-dynlibs$(PPUEXT) : $(INC)/dynlibs.pas $(UNIXINC)/dynlibs.inc dl$(PPUEXT) objpas$(PPUEXT) rtlconsts$(PPUEXT) sysutils$(PPUEXT) 
+dynlibs$(PPUEXT) : $(INC)/dynlibs.pas $(UNIXINC)/dynlibs.inc dl$(PPUEXT) objpas$(PPUEXT) rtlconsts$(PPUEXT) sysutils$(PPUEXT)
 	$(COMPILER) $(INC)/dynlibs.pas
 	$(COMPILER) $(INC)/dynlibs.pas
 initc$(PPUEXT) : $(UNIXINC)/initc.pp ctypes$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 initc$(PPUEXT) : $(UNIXINC)/initc.pp ctypes$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 	$(COMPILER) $(UNIXINC)/initc.pp
 	$(COMPILER) $(UNIXINC)/initc.pp
@@ -3693,11 +3694,11 @@ sysutils$(PPUEXT) : $(UNIXINC)/sysutils.pp $(wildcard $(OBJPASDIR)/sysutils/*.in
 		    linux$(PPUEXT)
 		    linux$(PPUEXT)
 	$(COMPILER) -Fi$(OBJPASDIR)/sysutils $(UNIXINC)/sysutils.pp
 	$(COMPILER) -Fi$(OBJPASDIR)/sysutils $(UNIXINC)/sysutils.pp
 classes$(PPUEXT) : $(UNIXINC)/classes.pp $(wildcard $(OBJPASDIR)/classes/*.inc) \
 classes$(PPUEXT) : $(UNIXINC)/classes.pp $(wildcard $(OBJPASDIR)/classes/*.inc) \
-		   sysutils$(PPUEXT) typinfo$(PPUEXT) rtlconsts$(PPUEXT) fgl$(PPUEXT) types$(PPUEXT) unix$(PPUEXT) 
+		   sysutils$(PPUEXT) typinfo$(PPUEXT) rtlconsts$(PPUEXT) fgl$(PPUEXT) types$(PPUEXT) unix$(PPUEXT)
 	$(COMPILER) -Fi$(OBJPASDIR)/classes $(UNIXINC)/classes.pp
 	$(COMPILER) -Fi$(OBJPASDIR)/classes $(UNIXINC)/classes.pp
 typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT) sysutils$(PPUEXT) rtlconsts$(PPUEXT)
 typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT) sysutils$(PPUEXT) rtlconsts$(PPUEXT)
 	$(COMPILER) -Sg $(OBJPASDIR)/typinfo.pp
 	$(COMPILER) -Sg $(OBJPASDIR)/typinfo.pp
-character$(PPUEXT): sysutils$(PPUEXT) $(OBJPASDIR)/character.pas objpas$(PPUEXT) rtlconsts$(PPUEXT) 
+character$(PPUEXT): sysutils$(PPUEXT) $(OBJPASDIR)/character.pas objpas$(PPUEXT) rtlconsts$(PPUEXT)
 	$(COMPILER) $(OBJPASDIR)/character.pas
 	$(COMPILER) $(OBJPASDIR)/character.pas
 math$(PPUEXT): $(OBJPASDIR)/math.pp objpas$(PPUEXT) sysutils$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 math$(PPUEXT): $(OBJPASDIR)/math.pp objpas$(PPUEXT) sysutils$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 	$(COMPILER) $(OBJPASDIR)/math.pp
 	$(COMPILER) $(OBJPASDIR)/math.pp

+ 5 - 4
rtl/linux/Makefile.fpc

@@ -20,7 +20,7 @@ units=$(SYSTEMUNIT) fpintres $(SYSINIT_UNITS) \
 implicitunits=exeinfo \
 implicitunits=exeinfo \
       cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 \
       cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 \
       cp437 cp646 cp850 cp856 cp866 cp874 cp8859_1 cp8859_5 cp8859_2 cp852 \
       cp437 cp646 cp850 cp856 cp866 cp874 cp8859_1 cp8859_5 cp8859_2 cp852 \
-      unicodedata unicodenumtable 
+      unicodedata unicodenumtable
 
 
 rsts=math typinfo sysconst rtlconsts
 rsts=math typinfo sysconst rtlconsts
 
 
@@ -93,6 +93,7 @@ endif
 
 
 ifeq ($(ARCH),arm)
 ifeq ($(ARCH),arm)
 override LOADERS+=ucprt0
 override LOADERS+=ucprt0
+CPU_UNITS=cpu
 endif
 endif
 
 
 SYSTEMUNIT=system
 SYSTEMUNIT=system
@@ -288,7 +289,7 @@ ports$(PPUEXT) : $(UNIXINC)/ports.pp unix$(PPUEXT) objpas$(PPUEXT)
 dl$(PPUEXT) : $(UNIXINC)/dl.pp $(SYSTEMUNIT)$(PPUEXT) unixtype$(PPUEXT) ctypes$(PPUEXT)
 dl$(PPUEXT) : $(UNIXINC)/dl.pp $(SYSTEMUNIT)$(PPUEXT) unixtype$(PPUEXT) ctypes$(PPUEXT)
 	$(COMPILER) $(UNIXINC)/dl.pp
 	$(COMPILER) $(UNIXINC)/dl.pp
 
 
-dynlibs$(PPUEXT) : $(INC)/dynlibs.pas $(UNIXINC)/dynlibs.inc dl$(PPUEXT) objpas$(PPUEXT) rtlconsts$(PPUEXT) sysutils$(PPUEXT) 
+dynlibs$(PPUEXT) : $(INC)/dynlibs.pas $(UNIXINC)/dynlibs.inc dl$(PPUEXT) objpas$(PPUEXT) rtlconsts$(PPUEXT) sysutils$(PPUEXT)
 	$(COMPILER) $(INC)/dynlibs.pas
 	$(COMPILER) $(INC)/dynlibs.pas
 
 
 initc$(PPUEXT) : $(UNIXINC)/initc.pp ctypes$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 initc$(PPUEXT) : $(UNIXINC)/initc.pp ctypes$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
@@ -324,14 +325,14 @@ sysutils$(PPUEXT) : $(UNIXINC)/sysutils.pp $(wildcard $(OBJPASDIR)/sysutils/*.in
         $(COMPILER) -Fi$(OBJPASDIR)/sysutils $(UNIXINC)/sysutils.pp
         $(COMPILER) -Fi$(OBJPASDIR)/sysutils $(UNIXINC)/sysutils.pp
 
 
 classes$(PPUEXT) : $(UNIXINC)/classes.pp $(wildcard $(OBJPASDIR)/classes/*.inc) \
 classes$(PPUEXT) : $(UNIXINC)/classes.pp $(wildcard $(OBJPASDIR)/classes/*.inc) \
-                   sysutils$(PPUEXT) typinfo$(PPUEXT) rtlconsts$(PPUEXT) fgl$(PPUEXT) types$(PPUEXT) unix$(PPUEXT) 
+                   sysutils$(PPUEXT) typinfo$(PPUEXT) rtlconsts$(PPUEXT) fgl$(PPUEXT) types$(PPUEXT) unix$(PPUEXT)
         $(COMPILER) -Fi$(OBJPASDIR)/classes $(UNIXINC)/classes.pp
         $(COMPILER) -Fi$(OBJPASDIR)/classes $(UNIXINC)/classes.pp
 
 
 typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT) sysutils$(PPUEXT) rtlconsts$(PPUEXT)
 typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT) sysutils$(PPUEXT) rtlconsts$(PPUEXT)
         $(COMPILER) -Sg $(OBJPASDIR)/typinfo.pp
         $(COMPILER) -Sg $(OBJPASDIR)/typinfo.pp
 
 
 # let it depend on buildcollations to prevent simultaneous building of unicodedata
 # let it depend on buildcollations to prevent simultaneous building of unicodedata
-character$(PPUEXT): sysutils$(PPUEXT) $(OBJPASDIR)/character.pas objpas$(PPUEXT) rtlconsts$(PPUEXT) 
+character$(PPUEXT): sysutils$(PPUEXT) $(OBJPASDIR)/character.pas objpas$(PPUEXT) rtlconsts$(PPUEXT)
         $(COMPILER) $(OBJPASDIR)/character.pas
         $(COMPILER) $(OBJPASDIR)/character.pas
 
 
 math$(PPUEXT): $(OBJPASDIR)/math.pp objpas$(PPUEXT) sysutils$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)
 math$(PPUEXT): $(OBJPASDIR)/math.pp objpas$(PPUEXT) sysutils$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)