Merge pull request #22117 from dezgeg/aarch64-for-merge

Aarch64 (ARM64) support
This commit is contained in:
Tuomas Tynkkynen 2017-01-26 17:52:28 +02:00 committed by GitHub
commit e2a2f6d595
30 changed files with 305 additions and 27 deletions

@ -15,7 +15,7 @@ rec {
freebsd = ["i686-freebsd" "x86_64-freebsd"];
gnu = linux; /* ++ hurd ++ kfreebsd ++ ... */
illumos = ["x86_64-solaris"];
linux = ["i686-linux" "x86_64-linux" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "mips64el-linux"];
linux = ["i686-linux" "x86_64-linux" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "aarch64-linux" "mips64el-linux"];
netbsd = ["i686-netbsd" "x86_64-netbsd"];
openbsd = ["i686-openbsd" "x86_64-openbsd"];
unix = linux ++ darwin ++ freebsd ++ openbsd ++ netbsd ++ illumos;

@ -0,0 +1,63 @@
# To build, use:
# nix-build nixos -I nixos-config=nixos/modules/installer/cd-dvd/sd-image-aarch64.nix -A config.system.build.sdImage
{ config, lib, pkgs, ... }:
let
extlinux-conf-builder =
import ../../system/boot/loader/generic-extlinux-compatible/extlinux-conf-builder.nix {
inherit pkgs;
};
in
{
imports = [
../../profiles/minimal.nix
../../profiles/installation-device.nix
./sd-image.nix
];
assertions = lib.singleton {
assertion = pkgs.stdenv.system == "aarch64-linux";
message = "sd-image-aarch64.nix can be only built natively on Aarch64 / ARM64; " +
"it cannot be cross compiled";
};
# Needed by RPi firmware
nixpkgs.config.allowUnfree = true;
boot.loader.grub.enable = false;
boot.loader.generic-extlinux-compatible.enable = true;
boot.kernelPackages = pkgs.linuxPackages_latest;
boot.kernelParams = ["console=ttyS0,115200n8" "console=tty0"];
boot.consoleLogLevel = 7;
# FIXME: this probably should be in installation-device.nix
users.extraUsers.root.initialHashedPassword = "";
sdImage = {
populateBootCommands = let
# Contains a couple of fixes for booting a Linux kernel, will hopefully appear upstream soon.
patchedUboot = pkgs.ubootRaspberryPi3_64bit.overrideAttrs (oldAttrs: {
src = pkgs.fetchFromGitHub {
owner = "dezgeg";
repo = "u-boot";
rev = "baab53ec244fe44def01948a0f10e67342d401e6";
sha256 = "0r5j2pc42ws3w3im0a9c6bh01czz5kapqrqp0ik9ra823cw73lxr";
};
});
configTxt = pkgs.writeText "config.txt" ''
kernel=u-boot-rpi3.bin
arm_control=0x200
enable_uart=1
'';
in ''
for f in bootcode.bin fixup.dat start.elf; do
cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/$f boot/
done
cp ${patchedUboot}/u-boot.bin boot/u-boot-rpi3.bin
cp ${configTxt} boot/config.txt
${extlinux-conf-builder} -t 3 -c ${config.system.build.toplevel} -d ./boot
'';
};
}

@ -1,3 +1,5 @@
# To build, use:
# nix-build nixos -I nixos-config=nixos/modules/installer/cd-dvd/sd-image-armv7l-multiplatform.nix -A config.system.build.sdImage
{ config, lib, pkgs, ... }:
let
@ -46,7 +48,7 @@ in
cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/$f boot/
done
cp ${pkgs.ubootRaspberryPi2}/u-boot.bin boot/u-boot-rpi2.bin
cp ${pkgs.ubootRaspberryPi3}/u-boot.bin boot/u-boot-rpi3.bin
cp ${pkgs.ubootRaspberryPi3_32bit}/u-boot.bin boot/u-boot-rpi3.bin
cp ${configTxt} boot/config.txt
${extlinux-conf-builder} -t 3 -c ${config.system.build.toplevel} -d ./boot
'';

@ -1,3 +1,5 @@
# To build, use:
# nix-build nixos -I nixos-config=nixos/modules/installer/cd-dvd/sd-image-raspberrypi.nix -A config.system.build.sdImage
{ config, lib, pkgs, ... }:
let

@ -272,6 +272,7 @@ stdenv.mkDerivation {
if stdenv.system == "x86_64-linux" then "ld-linux-x86-64.so.2" else
# ARM with a wildcard, which can be "" or "-armhf".
if stdenv.isArm then "ld-linux*.so.3" else
if stdenv.system == "aarch64-linux" then "ld-linux-aarch64.so.1" else
if stdenv.system == "powerpc-linux" then "ld.so.1" else
if stdenv.system == "mips64el-linux" then "ld.so.1" else
if stdenv.system == "x86_64-darwin" then "/usr/lib/dyld" else

@ -0,0 +1,12 @@
preConfigurePhases+=" updateAutotoolsGnuConfigScriptsPhase"
updateAutotoolsGnuConfigScriptsPhase() {
if [ -n "$dontUpdateAutotoolsGnuConfigScripts" ]; then return; fi
for script in config.sub config.guess; do
for f in $(find . -name "$script"); do
echo "Updating Autotools / GNU config script to a newer upstream version: $f"
cp -f "@gnu_config@/$script" "$f"
done
done
}

@ -20,6 +20,8 @@ stdenv.mkDerivation rec {
postPatch = ''
# Fixes an issue with version detection under perl 5.22.x
sed -i 's/(defined\((@TEMPLATE_FILE)\))/\1/' config/milestone.pl
'' + stdenv.lib.optionalString stdenv.isAarch64 ''
patch -p1 -d ../.. < ${./aarch64-double-conversion.patch}
'';
preConfigure = ''

@ -0,0 +1,13 @@
diff -ru mozjs17.0.0-orig/mfbt/double-conversion/utils.h mozjs17.0.0/mfbt/double-conversion/utils.h
--- mozjs17.0.0-orig/mfbt/double-conversion/utils.h 2013-02-11 17:33:28.000000000 -0500
+++ mozjs17.0.0/mfbt/double-conversion/utils.h 2016-12-03 20:39:07.915042988 -0500
@@ -58,7 +58,8 @@
defined(__mips__) || defined(__powerpc__) || \
defined(__sparc__) || defined(__sparc) || defined(__s390__) || \
defined(__SH4__) || defined(__alpha__) || \
- defined(_MIPS_ARCH_MIPS32R2)
+ defined(_MIPS_ARCH_MIPS32R2) || \
+ defined(__AARCH64EL__)
#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
#elif defined(_M_IX86) || defined(__i386__) || defined(__i386)
#if defined(_WIN32)

@ -93,7 +93,7 @@ stdenv.mkDerivation ({
"--enable-kernel=2.6.32"
] ++ lib.optionals (cross != null) [
(if cross.withTLS then "--with-tls" else "--without-tls")
(if cross.float == "soft" then "--without-fp" else "--with-fp")
(if cross ? float && cross.float == "soft" then "--without-fp" else "--with-fp")
] ++ lib.optionals (cross != null
&& cross.platform ? kernelMajor
&& cross.platform.kernelMajor == "2.6") [

@ -0,0 +1,39 @@
{ stdenv, fetchurl }:
let
rev = "6a82322dd05cdc57b4cd9f7effdf1e2fd6f7482b";
# Don't use fetchgit as this is needed during Aarch64 bootstrapping
configGuess = fetchurl {
url = "http://git.savannah.gnu.org/cgit/config.git/plain/config.guess?id=${rev}";
sha256 = "1yj9yi94h7z4z6jzickddv64ksz1aq5kj0c7krgzjn8xf8p3avmh";
};
configSub = fetchurl {
url = "http://git.savannah.gnu.org/cgit/config.git/plain/config.sub?id=${rev}";
sha256 = "1qsqdpla6icbzskkk7v3zxrpzlpqlc94ny9hyy5wh5lm5rwwfvb7";
};
in
stdenv.mkDerivation rec {
name = "gnu-config-${version}";
version = "2016-12-31";
buildCommand = ''
mkdir -p $out
cp ${configGuess} $out/config.guess
cp ${configSub} $out/config.sub
'';
meta = with stdenv.lib; {
description = "Attempt to guess a canonical system name";
homepage = http://savannah.gnu.org/projects/config;
license = licenses.gpl3;
# In addition to GPLv3:
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that
# program.
maintainers = [ maintainers.dezgeg ];
platforms = platforms.all;
};
}

@ -0,0 +1,13 @@
diff -ru gnu-efi-3.0.4-orig/lib/aarch64/initplat.c gnu-efi-3.0.4/lib/aarch64/initplat.c
--- gnu-efi-3.0.4-orig/lib/aarch64/initplat.c 2016-03-17 09:53:14.000000000 -0400
+++ gnu-efi-3.0.4/lib/aarch64/initplat.c 2016-12-03 17:53:57.166575974 -0500
@@ -41,7 +41,8 @@
void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n)
{
- unsigned char *p = dest, *q = src;
+ unsigned char *p = dest;
+ const unsigned char *q = src;
while (n--)
*p++ = *q++;

@ -1,4 +1,4 @@
{ stdenv, fetchurl, pciutils }:
{ stdenv, fetchurl, pciutils }: with stdenv.lib;
stdenv.mkDerivation rec {
name = "gnu-efi-${version}";
@ -9,6 +9,8 @@ stdenv.mkDerivation rec {
sha256 = "1bzq5czw5dxlvpgs9ij2iz7q6krwhja87vc982r6vffcqcl0982i";
};
patches = optional stdenv.isAarch64 ./aarch64-fix-discarded-qualifier.patch;
buildInputs = [ pciutils ];
hardeningDisable = [ "stackprotector" ];

@ -0,0 +1,12 @@
diff --git a/configure b/configure
index 6c4e868..0298e19 100755
--- a/configure
+++ b/configure
@@ -14501,6 +14501,7 @@ else
case "$host_cpu" in
a29k | \
+ aarch64* | \
alpha* | \
arc | \
arm* | strongarm* | xscale* | \

@ -8,6 +8,12 @@ stdenv.mkDerivation rec {
sha256 = "16hrs8k3nmc7a8jam5j1fpspd6sdpkamskvsdpcw6m29vnis8q44";
};
# Based on https://github.com/davidgfnet/buildroot-Os/blob/69fe6065b9dd1cb4dcc0a4b554e42cc2e5bd0d60/package/libsigsegv/libsigsegv-0002-fix-aarch64-build.patch
# but applied directly to configure since we can't use autoreconf while bootstrapping.
patches = if stdenv.isAarch64 || stdenv.cross.arch or "" == "aarch64"
then [ ./aarch64.patch ]
else null; # TODO: change to lib.optional on next mass rebuild
# https://github.com/NixOS/nixpkgs/issues/6028
doCheck = false;

@ -1,4 +1,4 @@
{ stdenv, fetchurl, fetchpatch, xz }:
{ stdenv, fetchurl, fetchpatch, autoreconfHook, xz }:
stdenv.mkDerivation rec {
name = "libunwind-1.1";
@ -8,13 +8,18 @@ stdenv.mkDerivation rec {
sha256 = "16nhx2pahh9d62mvszc88q226q5lwjankij276fxwrm8wb50zzlx";
};
buildInputs = stdenv.lib.optional stdenv.isAarch64 autoreconfHook;
patches = [ ./libunwind-1.1-lzma.patch ./cve-2015-3239.patch
# https://lists.nongnu.org/archive/html/libunwind-devel/2014-04/msg00000.html
(fetchpatch {
url = "https://raw.githubusercontent.com/dropbox/pyston/1b2e676417b0f5f17526ece0ed840aa88c744145/libunwind_patches/0001-Change-the-RBP-validation-heuristic-to-allow-size-0-.patch";
sha256 = "1a0fsgfxmgd218nscswx7pgyb7rcn2gh6566252xhfvzhgn5i4ha";
})
];
] ++ stdenv.lib.optional stdenv.isAarch64 (fetchpatch {
url = "https://raw.githubusercontent.com/archlinuxarm/PKGBUILDs/77709d1c6d5c39e23c1535b1bd584be1455f2551/extra/libunwind/libunwind-aarch64.patch";
sha256 = "1mpjs8izq9wxiaf5rl4gzaxrkz0s51f9qz5qc5dj72pr84mw50w8";
});
postPatch = ''
sed -i -e '/LIBLZMA/s:-lzma:-llzma:' configure

@ -100,12 +100,18 @@ in rec {
filesToInstall = ["u-boot.bin"];
};
ubootRaspberryPi3 = buildUBoot rec {
ubootRaspberryPi3_32bit = buildUBoot rec {
defconfig = "rpi_3_32b_defconfig";
targetPlatforms = ["armv7l-linux"];
filesToInstall = ["u-boot.bin"];
};
ubootRaspberryPi3_64bit = buildUBoot rec {
defconfig = "rpi_3_defconfig";
targetPlatforms = ["aarch64-linux"];
filesToInstall = ["u-boot.bin"];
};
ubootWandboard = buildUBoot rec {
defconfig = "wandboard_defconfig";
targetPlatforms = ["armv7l-linux"];

@ -12,3 +12,12 @@ stdenv bootstrap.
exit(busybox_main(argv));
# endif
# if NUM_APPLETS > 0
@@ -981,7 +981,7 @@ int main(int argc UNUSED_PARAM, char **argv)
lbb_prepare("busybox" IF_FEATURE_INDIVIDUAL(, argv));
# if !ENABLE_BUSYBOX
- if (argv[1] && is_prefixed_with(bb_basename(argv[0]), "busybox"))
+ if (argv[1] && strstr(bb_basename(argv[0]), "busybox") != 0)
argv++;
# endif
applet_name = argv[0];

@ -31,7 +31,7 @@ stdenv.mkDerivation rec {
description = "Firmware for the Raspberry Pi board";
homepage = https://github.com/raspberrypi;
license = licenses.unfree;
platforms = [ "armv6l-linux" "armv7l-linux" ];
platforms = [ "armv6l-linux" "armv7l-linux" "aarch64-linux" ];
maintainers = with maintainers; [ viric tavyc ];
};
}

@ -1,4 +1,4 @@
{ stdenv, fetchFromGitHub, utillinux
{ stdenv, fetchFromGitHub, fetchpatch, utillinux
, autoconf, automake, libtool, gettext }:
stdenv.mkDerivation rec {
@ -14,6 +14,11 @@ stdenv.mkDerivation rec {
buildInputs = [ utillinux autoconf automake libtool gettext ];
patches = stdenv.lib.optional stdenv.isAarch64 (fetchpatch {
url = "https://github.com/libfuse/libfuse/commit/914871b20a901e3e1e981c92bc42b1c93b7ab81b.patch";
sha256 = "1w4j6f1awjrycycpvmlv0x5v9gprllh4dnbjxl4dyl2jgbkaw6pa";
});
preConfigure =
''
export MOUNT_FUSE_PATH=$out/sbin

@ -45,7 +45,7 @@ with stdenv.lib;
# Bump the maximum number of CPUs to support systems like EC2 x1.*
# instances and Xeon Phi.
${optionalString (stdenv.system == "x86_64-linux") ''
${optionalString (stdenv.system == "x86_64-linux" || stdenv.system == "aarch64-linux") ''
NR_CPUS 384
''}

@ -120,7 +120,7 @@ let
# Some image types need special install targets (e.g. uImage is installed with make uinstall)
installTargets = [ (if platform.kernelTarget == "uImage" then "uinstall" else
if platform.kernelTarget == "zImage" then "zinstall" else
if platform.kernelTarget == "zImage" || platform.kernelTarget == "Image.gz" then "zinstall" else
"install") ];
postInstall = ''

@ -92,6 +92,7 @@ rec {
# without proper `file` command, libtool sometimes fails
# to recognize 64-bit DLLs
++ stdenv.lib.optional (cross.config == "x86_64-w64-mingw32") pkgs.file
++ stdenv.lib.optional (cross.config == "aarch64-linux-gnu") pkgs.updateAutotoolsGnuConfigScriptsHook
;
# Cross-linking dynamic libraries, every buildInput should

@ -44,6 +44,7 @@ in
"armv5tel-linux" = stagesLinux;
"armv6l-linux" = stagesLinux;
"armv7l-linux" = stagesLinux;
"aarch64-linux" = stagesLinux;
"mips64el-linux" = stagesLinux;
"powerpc-linux" = /* stagesLinux */ stagesNative;
"x86_64-darwin" = stagesDarwin;

@ -311,6 +311,7 @@ let
|| system == "armv5tel-linux"
|| system == "armv6l-linux"
|| system == "armv7l-linux"
|| system == "aarch64-linux"
|| system == "mips64el-linux";
isGNU = system == "i686-gnu"; # GNU/Hurd
isGlibc = isGNU # useful for `stdenvNative'
@ -348,6 +349,7 @@ let
isArm = system == "armv5tel-linux"
|| system == "armv6l-linux"
|| system == "armv7l-linux";
isAarch64 = system == "aarch64-linux";
isBigEndian = system == "powerpc-linux";
# Whether we should run paxctl to pax-mark binaries.

@ -0,0 +1,11 @@
{
busybox = import <nix/fetchurl.nix> {
url = http://nixos-arm.dezgeg.me/bootstrap-aarch64-for-merge/busybox;
sha256 = "12qcml1l67skpjhfjwy7gr10nc86gqcwjmz9ggp7knss8gq8pv7f";
executable = true;
};
bootstrapTools = import <nix/fetchurl.nix> {
url = http://nixos-arm.dezgeg.me/bootstrap-aarch64-for-merge/bootstrap-tools.tar.xz;
sha256 = "10sqgh0dchp1906h06jznxh8gfflnzbpfy27hng2mmc1l0c7irjr";
};
}

@ -12,6 +12,7 @@
"armv5tel-linux" = import ./bootstrap-files/armv5tel.nix;
"armv6l-linux" = import ./bootstrap-files/armv6l.nix;
"armv7l-linux" = import ./bootstrap-files/armv7l.nix;
"aarch64-linux" = import ./bootstrap-files/aarch64.nix;
"mips64el-linux" = import ./bootstrap-files/loongson2f.nix;
}.${localSystem.system}
or (abort "unsupported platform for the pure Linux stdenv")
@ -213,7 +214,9 @@ in
isl = isl_0_14;
};
};
extraBuildInputs = [ prevStage.patchelf prevStage.paxctl ];
extraBuildInputs = [ prevStage.patchelf prevStage.paxctl ] ++
# Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64.
lib.optional (system == "aarch64-linux") prevStage.updateAutotoolsGnuConfigScriptsHook;
})
@ -240,7 +243,9 @@ in
shell = self.bash + "/bin/bash";
};
};
extraBuildInputs = [ prevStage.patchelf prevStage.xz ];
extraBuildInputs = [ prevStage.patchelf prevStage.xz ] ++
# Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64.
lib.optional (system == "aarch64-linux") prevStage.updateAutotoolsGnuConfigScriptsHook;
})
# Construct the final stdenv. It uses the Glibc and GCC, and adds
@ -268,7 +273,9 @@ in
initialPath =
((import ../common-path.nix) {pkgs = prevStage;});
extraBuildInputs = [ prevStage.patchelf prevStage.paxctl ];
extraBuildInputs = [ prevStage.patchelf prevStage.paxctl ] ++
# Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64.
lib.optional (system == "aarch64-linux") prevStage.updateAutotoolsGnuConfigScriptsHook;
cc = prevStage.gcc;
@ -287,7 +294,7 @@ in
[ gzip bzip2 xz bash binutils coreutils diffutils findutils gawk
glibc gnumake gnused gnutar gnugrep gnupatch patchelf attr acl
paxctl zlib pcre linuxHeaders ed gcc gcc.cc libsigsegv
];
] ++ lib.optional (system == "aarch64-linux") prevStage.updateAutotoolsGnuConfigScriptsHook;
*/
overrides = self: super: {

@ -50,10 +50,23 @@ let
};
};
aarch64-multiplatform-crossSystem = {
crossSystem = rec {
config = "aarch64-linux-gnu";
bigEndian = false;
arch = "aarch64";
withTLS = true;
libc = "glibc";
platform = pkgsNoParams.platforms.aarch64-multiplatform;
inherit (platform) gcc;
};
};
selectedCrossSystem =
if toolsArch == "armv5tel" then sheevaplugCrossSystem else
if toolsArch == "armv6l" then raspberrypiCrossSystem else
if toolsArch == "armv7l" then armv7l-hf-multiplatform-crossSystem else null;
if toolsArch == "armv7l" then armv7l-hf-multiplatform-crossSystem else
if toolsArch == "aarch64" then aarch64-multiplatform-crossSystem else null;
pkgs = pkgsFun ({inherit system;} // selectedCrossSystem);
@ -264,4 +277,5 @@ rec {
armv5tel = buildFor "armv5tel";
armv6l = buildFor "armv6l";
armv7l = buildFor "armv7l";
aarch64 = buildFor "aarch64";
}

@ -170,8 +170,9 @@ rec {
};
bootstrapFiles = {
busybox = "${build}/on-server/busybox";
bootstrapTools = "${build}/on-server/bootstrap-tools.tar.xz";
# Make them their own store paths to test that busybox still works when the binary is named /nix/store/HASH-busybox
busybox = runCommand "busybox" {} "cp ${build}/on-server/busybox $out";
bootstrapTools = runCommand "bootstrap-tools.tar.xz" {} "cp ${build}/on-server/bootstrap-tools.tar.xz $out";
};
bootstrapTools = import ./bootstrap-tools { inherit system bootstrapFiles; };

@ -79,6 +79,10 @@ with pkgs;
}
'');
updateAutotoolsGnuConfigScriptsHook = makeSetupHook
{ substitutions = { gnu_config = gnu-config;}; }
../build-support/setup-hooks/update-autotools-gnu-config-scripts.sh;
buildEnv = callPackage ../build-support/buildenv { }; # not actually a package
buildFHSUserEnv = callPackage ../build-support/build-fhs-userenv { };
@ -7459,6 +7463,8 @@ with pkgs;
gnet = callPackage ../development/libraries/gnet { };
gnu-config = callPackage ../development/libraries/gnu-config { };
gnu-efi = callPackage ../development/libraries/gnu-efi { };
gnutls = gnutls34;
@ -11799,7 +11805,8 @@ with pkgs;
ubootPcduino3Nano
ubootRaspberryPi
ubootRaspberryPi2
ubootRaspberryPi3
ubootRaspberryPi3_32bit
ubootRaspberryPi3_64bit
ubootWandboard
;

@ -443,12 +443,54 @@ rec {
};
};
selectPlatformBySystem = system:
if system == "armv6l-linux" then raspberrypi
else if system == "armv7l-linux" then armv7l-hf-multiplatform
else if system == "armv5tel-linux" then sheevaplug
else if system == "mips64el-linux" then fuloong2f_n32
else if system == "x86_64-linux" then pc64
else if system == "i686-linux" then pc32
else pcBase;
aarch64-multiplatform = {
name = "aarch64-multiplatform";
kernelMajor = "2.6"; # Using "2.6" enables 2.6 kernel syscalls in glibc.
kernelHeadersBaseConfig = "defconfig";
kernelBaseConfig = "defconfig";
kernelArch = "arm64";
kernelDTB = true;
kernelAutoModules = false;
kernelExtraConfig = ''
# Raspberry Pi 3 stuff. Not needed for kernels >= 4.10.
ARCH_BCM2835 y
BCM2835_MBOX y
BCM2835_WDT y
BRCMFMAC m
DMA_BCM2835 m
DRM_VC4 m
I2C_BCM2835 m
PWM_BCM2835 m
RASPBERRYPI_FIRMWARE y
RASPBERRYPI_POWER y
SERIAL_8250_BCM2835AUX y
SERIAL_8250_EXTENDED y
SERIAL_8250_SHARE_IRQ y
SND_BCM2835_SOC_I2S m
SPI_BCM2835AUX m
SPI_BCM2835 m
# Cavium ThunderX stuff.
PCI_HOST_THUNDER_ECAM y
THUNDER_NIC_RGX y
THUNDER_NIC_BGX y
THUNDER_NIC_PF y
THUNDER_NIC_VF y
'';
uboot = null;
kernelTarget = "Image";
gcc = {
arch = "armv8-a";
};
};
selectPlatformBySystem = system: {
"i686-linux" = pc32;
"x86_64-linux" = pc64;
"armv5tel-linux" = sheevaplug;
"armv6l-linux" = raspberrypi;
"armv7l-linux" = armv7l-hf-multiplatform;
"aarch64-linux" = aarch64-multiplatform;
"mips64el-linux" = fuloong2f_n32;
}.${system} or pcBase;
}