Skip to content

Commit

Permalink
[RFC] ppc64le enablement (#45340)
Browse files Browse the repository at this point in the history
* ppc64le enablement

* gcc, glibc: properly handle __float128

* lib/systems, stdenv: syntax cleanup

* gcc7: remove ugly hack

* gcc: add/update __float128 flags

* stdenv: add another pair of quotes for consistency

* gcc: move __float128 flag for ppc64le-glibc into common/platform-flags.nix
  • Loading branch information
CrystalGamma authored and John Ericson committed Aug 21, 2018
1 parent cb44c3f commit 72d161f
Show file tree
Hide file tree
Showing 16 changed files with 87 additions and 23 deletions.
2 changes: 1 addition & 1 deletion lib/systems/doubles.nix
Expand Up @@ -44,5 +44,5 @@ in rec {
openbsd = filterDoubles predicates.isOpenBSD;
unix = filterDoubles predicates.isUnix;

mesaPlatforms = ["i686-linux" "x86_64-linux" "x86_64-darwin" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "aarch64-linux"];
mesaPlatforms = ["i686-linux" "x86_64-linux" "x86_64-darwin" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "aarch64-linux" "powerpc64le-linux"];
}
8 changes: 8 additions & 0 deletions lib/systems/examples.nix
Expand Up @@ -8,6 +8,14 @@ rec {
#
# Linux
#
powernv = {
config = "powerpc64le-unknown-linux-gnu";
platform = platforms.powernv;
};
musl-power = {
config = "powerpc64le-unknown-linux-musl";
platform = platforms.powernv;
};

sheevaplug = rec {
config = "armv5tel-unknown-linux-gnueabi";
Expand Down
1 change: 1 addition & 0 deletions lib/systems/inspect.nix
Expand Up @@ -11,6 +11,7 @@ rec {
isi686 = { cpu = cpuTypes.i686; };
isx86_64 = { cpu = cpuTypes.x86_64; };
isPowerPC = { cpu = cpuTypes.powerpc; };
isPower = { cpu = { family = "power"; }; };
isx86 = { cpu = { family = "x86"; }; };
isAarch32 = { cpu = { family = "arm"; bits = 32; }; };
isAarch64 = { cpu = { family = "arm"; bits = 64; }; };
Expand Down
2 changes: 2 additions & 0 deletions lib/systems/parse.nix
Expand Up @@ -90,6 +90,8 @@ rec {
mips64el = { bits = 64; significantByte = littleEndian; family = "mips"; };

powerpc = { bits = 32; significantByte = bigEndian; family = "power"; };
powerpc64 = { bits = 64; significantByte = bigEndian; family = "power"; };
powerpc64le = { bits = 64; significantByte = littleEndian; family = "power"; };

riscv32 = { bits = 32; significantByte = littleEndian; family = "riscv"; };
riscv64 = { bits = 64; significantByte = littleEndian; family = "riscv"; };
Expand Down
17 changes: 17 additions & 0 deletions lib/systems/platforms.nix
Expand Up @@ -20,6 +20,22 @@ rec {
kernelAutoModules = false;
};

powernv = {
name = "PowerNV";
kernelArch = "powerpc";
kernelBaseConfig = "powernv_defconfig";
kernelTarget = "zImage";
kernelInstallTarget = "install";
kernelFile = "vmlinux";
kernelAutoModules = true;
# avoid driver/FS trouble arising from unusual page size
kernelExtraConfig = ''
PPC_64K_PAGES n
PPC_4K_PAGES y
IPV6 y
'';
};

##
## ARM
##
Expand Down Expand Up @@ -458,5 +474,6 @@ rec {
"armv7l-linux" = armv7l-hf-multiplatform;
"aarch64-linux" = aarch64-multiplatform;
"mipsel-linux" = fuloong2f_n32;
"powerpc64le-linux" = powernv;
}.${system} or pcBase;
}
4 changes: 2 additions & 2 deletions pkgs/build-support/bintools-wrapper/default.nix
Expand Up @@ -171,7 +171,7 @@ stdenv.mkDerivation {
else if targetPlatform.isWindows then "pe"
else "elf" + toString targetPlatform.parsed.cpu.bits;
endianPrefix = if targetPlatform.isBigEndian then "big" else "little";
sep = optionalString (!targetPlatform.isMips) "-";
sep = optionalString (!targetPlatform.isMips && !targetPlatform.isPower) "-";
arch =
/**/ if targetPlatform.isAarch64 then endianPrefix + "aarch64"
else if targetPlatform.isAarch32 then endianPrefix + "arm"
Expand All @@ -183,7 +183,7 @@ stdenv.mkDerivation {
"mips64" = "btsmip";
"mips64el" = "ltsmip";
}.${targetPlatform.parsed.cpu.name}
else if targetPlatform.isPowerPC then "powerpc"
else if targetPlatform.isPower then if targetPlatform.isBigEndian then "ppc" else "lppc"
else if targetPlatform.isSparc then "sparc"
else throw "unknown emulation for platform: " + targetPlatform.config;
in targetPlatform.platform.bfdEmulation or (fmt + sep + arch);
Expand Down
3 changes: 2 additions & 1 deletion pkgs/development/compilers/gcc/7/default.nix
Expand Up @@ -54,7 +54,8 @@ let version = "7.3.0";
url = "https://git.busybox.net/buildroot/plain/package/gcc/7.1.0/0900-remove-selftests.patch?id=11271540bfe6adafbc133caf6b5b902a816f5f02";
sha256 = "0mrvxsdwip2p3l17dscpc1x8vhdsciqw1z5q9i6p5g9yg1cqnmgs";
})
++ optional langFortran ../gfortran-driving.patch;
++ optional langFortran ../gfortran-driving.patch
++ optional (targetPlatform.libc == "musl" && targetPlatform.isPower) ../ppc-musl.patch;

/* Cross-gcc settings (build == host != target) */
crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt";
Expand Down
3 changes: 2 additions & 1 deletion pkgs/development/compilers/gcc/8/default.nix
Expand Up @@ -49,7 +49,8 @@ let version = "8.2.0";
url = "https://git.busybox.net/buildroot/plain/package/gcc/${version}/0900-remove-selftests.patch?id=11271540bfe6adafbc133caf6b5b902a816f5f02";
sha256 = ""; # TODO: uncomment and check hash when available.
}) */
++ optional langFortran ../gfortran-driving.patch;
++ optional langFortran ../gfortran-driving.patch
++ optional (targetPlatform.libc == "musl" && targetPlatform.isPower) ../ppc-musl.patch;

/* Cross-gcc settings (build == host != target) */
crossMingw = targetPlatform != hostPlatform && targetPlatform.libc == "msvcrt";
Expand Down
3 changes: 3 additions & 0 deletions pkgs/development/compilers/gcc/common/platform-flags.nix
Expand Up @@ -10,4 +10,7 @@ in lib.concatLists [
(lib.optional (p ? fpu) "--with-fpu=${p.fpu}")
(lib.optional (p ? float) "--with-float=${p.float}")
(lib.optional (p ? mode) "--with-mode=${p.mode}")
(lib.optional
(let tp = targetPlatform; in tp.isPower && tp.libc == "glibc" && tp.is64bit && tp.isLittleEndian)
"--with-long-double-128")
]
18 changes: 18 additions & 0 deletions pkgs/development/compilers/gcc/ppc-musl.patch
@@ -0,0 +1,18 @@
diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h
index cbee89140dd..e1f26b0a096 100644
--- a/gcc/config/rs6000/sysv4.h
+++ b/gcc/config/rs6000/sysv4.h
@@ -996,13 +996,7 @@ ncrtn.o%s"
{ GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1, \
GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },

-#ifdef LOCAL_INCLUDE_DIR
-#define INCLUDE_DEFAULTS_MUSL_LOCAL \
- { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 }, \
- { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 },
-#else
#define INCLUDE_DEFAULTS_MUSL_LOCAL
-#endif

#ifdef PREFIX_INCLUDE_DIR
#define INCLUDE_DEFAULTS_MUSL_PREFIX \
10 changes: 7 additions & 3 deletions pkgs/os-specific/linux/kernel/manual-config.nix
Expand Up @@ -98,6 +98,7 @@ let
sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g ; s|/sbin/||g'
done
sed -i Makefile -e 's|= depmod|= ${buildPackages.kmod}/bin/depmod|'
sed -i scripts/ld-version.sh -e "s|/usr/bin/awk|${buildPackages.gawk}/bin/awk|"
'';

configurePhase = ''
Expand Down Expand Up @@ -145,9 +146,12 @@ let
++ optional installsFirmware "INSTALL_FW_PATH=$(out)/lib/firmware";

# 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" || platform.kernelTarget == "Image.gz" then "zinstall" else
"install") ];
installTargets = [ (
if platform ? kernelInstallTarget then platform.kernelInstallTarget
else if platform.kernelTarget == "uImage" then "uinstall"
else if platform.kernelTarget == "zImage" || platform.kernelTarget == "Image.gz" then "zinstall"
else "install"
) ];

postInstall = (optionalString installsFirmware ''
mkdir -p $out/lib/firmware
Expand Down
5 changes: 3 additions & 2 deletions pkgs/os-specific/linux/musl/default.nix
@@ -1,4 +1,4 @@
{ stdenv, lib, fetchurl
{ stdenv, lib, fetchurl, hostPlatform
, linuxHeaders ? null
, useBSDCompatHeaders ? true
}:
Expand Down Expand Up @@ -61,11 +61,12 @@ stdenv.mkDerivation rec {
configureFlagsArray+=("--syslibdir=$out/lib")
'';

CFLAGS="-fstack-protector-strong" + lib.optionalString hostPlatform.isPower " -mlong-double-64";

configureFlags = [
"--enable-shared"
"--enable-static"
"--enable-debug"
"CFLAGS=-fstack-protector-strong"
"--enable-wrapper=all"
];

Expand Down
1 change: 1 addition & 0 deletions pkgs/stdenv/default.nix
Expand Up @@ -47,6 +47,7 @@ in
"aarch64-linux" = stagesLinux;
"mipsel-linux" = stagesLinux;
"powerpc-linux" = /* stagesLinux */ stagesNative;
"powerpc64le-linux" = stagesLinux;
"x86_64-darwin" = stagesDarwin;
"x86_64-solaris" = stagesNix;
"i686-cygwin" = stagesNative;
Expand Down
Expand Up @@ -9,6 +9,9 @@ echo Patching the bootstrap tools...
if test -f $out/lib/ld.so.?; then
# MIPS case
LD_BINARY=$out/lib/ld.so.?
elif test -f $out/lib/ld64.so.?; then
# ppc64(le)
LD_BINARY=$out/lib/ld64.so.?
else
# i686, x86_64 and armv5tel
LD_BINARY=$out/lib/ld-*so.?
Expand Down
2 changes: 2 additions & 0 deletions pkgs/stdenv/linux/default.nix
Expand Up @@ -16,11 +16,13 @@
"armv7l-linux" = import ./bootstrap-files/armv7l.nix;
"aarch64-linux" = import ./bootstrap-files/aarch64.nix;
"mipsel-linux" = import ./bootstrap-files/loongson2f.nix;
"powerpc64le-linux" = import ./bootstrap-files/ppc64le.nix;

This comment has been minimized.

Copy link
@matthewbauer

matthewbauer Dec 6, 2018

Member

We're missing these files!

This comment has been minimized.

Copy link
@CrystalGamma

CrystalGamma Dec 6, 2018

Author Contributor

I'm not a trusted maintainer, so my binaries are out of the question. However, they can be cross-built from x86 using pkgs/stdenv/linux/make-bootstrap-tools-cross.nix (or copied together from a ppc64le distro, as I originally did … it was not worth the trouble…). In fact, trying it out again, it turns out the (import pkgs/stdenv/linux/make-bootstrap-tools-cross.nix {}).powerpc64le.bootstrapFiles derivations are already being built by Hydra. So the files would only need to be hosted somewhere.

This comment has been minimized.

Copy link
@matthewbauer

matthewbauer Dec 6, 2018

Member

Ok thanks! I think we will remove this part - but still support cross powerpc.

This comment has been minimized.

Copy link
@CrystalGamma

CrystalGamma Dec 6, 2018

Author Contributor

That's fine too, I guess. My intention in putting this in in the first place was to have a "insert your files here" marker for anyone trying to build on the arch, but anyone who knows what to do with that will be able to find this place to insert the files anyway …

This comment has been minimized.

Copy link
@vcunat

vcunat Mar 24, 2020

Member

As reported on IRC today, we're still stuck in this in-between state where we reference non-existing *.nix file.

Uploading Hydra's cross-built files into tarballs.nixos.org sounds OK to me (and we do that for other platforms), though it might not be much help if ppc64 platforms remains in this severely under-tested state.

};
"musl" = {
"aarch64-linux" = import ./bootstrap-files/aarch64-musl.nix;
"armv6l-linux" = import ./bootstrap-files/armv6l-musl.nix;
"x86_64-linux" = import ./bootstrap-files/x86_64-musl.nix;
"powerpc64le-linux" = import ./bootstrap-files/ppc64le-musl.nix;
};
};
archLookupTable = table.${localSystem.libc}
Expand Down
28 changes: 15 additions & 13 deletions pkgs/stdenv/linux/make-bootstrap-tools-cross.nix
Expand Up @@ -5,16 +5,18 @@ let
localSystem = { inherit system; };
inherit crossSystem;
};

in with (import ../../../lib).systems.examples; {
armv5tel = make sheevaplug;
scaleway = make scaleway-c1;
pogoplug4 = make pogoplug4;
armv6l = make raspberryPi;
armv7l = make armv7l-hf-multiplatform;
aarch64 = make aarch64-multiplatform;
x86_64-musl = make musl64;
armv6l-musl = make muslpi;
aarch64-musl = make aarch64-multiplatform-musl;
riscv64 = make riscv64;
}
lib = import ../../../lib;
in lib.mapAttrs (n: make) (with lib.systems.examples; {
armv5tel = sheevaplug;
scaleway = scaleway-c1;
pogoplug4 = pogoplug4;
armv6l = raspberryPi;
armv7l = armv7l-hf-multiplatform;
aarch64 = aarch64-multiplatform;
x86_64-musl = musl64;
armv6l-musl = muslpi;
aarch64-musl = aarch64-multiplatform-musl;
riscv64 = riscv64;
powerpc64le = powernv;
powerpc64le-musl = musl-power;
})

0 comments on commit 72d161f

Please sign in to comment.