diff --git a/.gitattributes b/.gitattributes index 1cfaf56bf4..c2654ef558 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8206,6 +8206,7 @@ rtl/android/mipsel/prt0.as svneol=native#text/plain rtl/android/sysandroid.inc svneol=native#text/plain rtl/arm/arm.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/int64p.inc svneol=native#text/plain rtl/arm/makefile.cpu svneol=native#text/plain diff --git a/rtl/arm/cpu.pp b/rtl/arm/cpu.pp new file mode 100644 index 0000000000..440fb04f87 --- /dev/null +++ b/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. + diff --git a/rtl/linux/Makefile b/rtl/linux/Makefile index 776a6737d3..1f6f998482 100644 --- a/rtl/linux/Makefile +++ b/rtl/linux/Makefile @@ -363,6 +363,7 @@ override FPCOPT+=-Ur endif ifeq ($(ARCH),arm) override LOADERS+=ucprt0 +CPU_UNITS=cpu endif SYSTEMUNIT=system ifdef RELEASE @@ -3673,7 +3674,7 @@ ports$(PPUEXT) : $(UNIXINC)/ports.pp unix$(PPUEXT) objpas$(PPUEXT) $(COMPILER) $(UNIXINC)/ports.pp dl$(PPUEXT) : $(UNIXINC)/dl.pp $(SYSTEMUNIT)$(PPUEXT) unixtype$(PPUEXT) ctypes$(PPUEXT) $(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 initc$(PPUEXT) : $(UNIXINC)/initc.pp ctypes$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) $(COMPILER) $(UNIXINC)/initc.pp @@ -3693,11 +3694,11 @@ sysutils$(PPUEXT) : $(UNIXINC)/sysutils.pp $(wildcard $(OBJPASDIR)/sysutils/*.in linux$(PPUEXT) $(COMPILER) -Fi$(OBJPASDIR)/sysutils $(UNIXINC)/sysutils.pp 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 typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT) sysutils$(PPUEXT) rtlconsts$(PPUEXT) $(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 math$(PPUEXT): $(OBJPASDIR)/math.pp objpas$(PPUEXT) sysutils$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT) $(COMPILER) $(OBJPASDIR)/math.pp diff --git a/rtl/linux/Makefile.fpc b/rtl/linux/Makefile.fpc index a50490a6d6..3d324e72b8 100644 --- a/rtl/linux/Makefile.fpc +++ b/rtl/linux/Makefile.fpc @@ -20,7 +20,7 @@ units=$(SYSTEMUNIT) fpintres $(SYSINIT_UNITS) \ implicitunits=exeinfo \ cp1250 cp1251 cp1252 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 \ cp437 cp646 cp850 cp856 cp866 cp874 cp8859_1 cp8859_5 cp8859_2 cp852 \ - unicodedata unicodenumtable + unicodedata unicodenumtable rsts=math typinfo sysconst rtlconsts @@ -93,6 +93,7 @@ endif ifeq ($(ARCH),arm) override LOADERS+=ucprt0 +CPU_UNITS=cpu endif 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) $(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 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 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 typinfo$(PPUEXT): $(OBJPASDIR)/typinfo.pp objpas$(PPUEXT) sysutils$(PPUEXT) rtlconsts$(PPUEXT) $(COMPILER) -Sg $(OBJPASDIR)/typinfo.pp # 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 math$(PPUEXT): $(OBJPASDIR)/math.pp objpas$(PPUEXT) sysutils$(PPUEXT) $(SYSTEMUNIT)$(PPUEXT)