summary refs log tree commit diff
diff options
context:
space:
mode:
authorEmily Trau <emily@downunderctf.com>2023-05-17 12:12:58 +1000
committerEmily Trau <emily@downunderctf.com>2023-09-11 22:08:54 -0700
commita056c7dd070e8a0fa7b90bfcb42b6806fa8af38a (patch)
treecced5a09b04f66acd45dc887c1d1e763ac386039
parent597ed0c552bb13bd6cc53bf2e8917e180eae3879 (diff)
downloadnixpkgs-a056c7dd070e8a0fa7b90bfcb42b6806fa8af38a.tar
nixpkgs-a056c7dd070e8a0fa7b90bfcb42b6806fa8af38a.tar.gz
nixpkgs-a056c7dd070e8a0fa7b90bfcb42b6806fa8af38a.tar.bz2
nixpkgs-a056c7dd070e8a0fa7b90bfcb42b6806fa8af38a.tar.lz
nixpkgs-a056c7dd070e8a0fa7b90bfcb42b6806fa8af38a.tar.xz
nixpkgs-a056c7dd070e8a0fa7b90bfcb42b6806fa8af38a.tar.zst
nixpkgs-a056c7dd070e8a0fa7b90bfcb42b6806fa8af38a.zip
minimal-bootstrap.stage0-posix: support x86_64-linux
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/bootstrap-sources.nix8
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/default.nix10
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/hex0.nix28
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/kaem/default.nix3
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/kaem/minimal.nix6
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-boot.nix (renamed from pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/stage0-posix-x86.nix)167
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-extra/build.kaem2
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-extra/default.nix10
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools/build.kaem100
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools/default.nix42
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/platforms.nix29
11 files changed, 231 insertions, 174 deletions
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/bootstrap-sources.nix b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/bootstrap-sources.nix
index 82ee4d12386..203b480326e 100644
--- a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/bootstrap-sources.nix
+++ b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/bootstrap-sources.nix
@@ -9,14 +9,6 @@ rec {
   outputHashAlgo = "sha256";
   outputHash = "sha256-FpMp7z+B3cR3LkQ+PooH/b1/NlxH8NHVJNWifaPWt4U=";
 
-  # This 256 byte seed is the only pre-compiled binary in the bootstrap chain.
-  hex0-seed = import <nix/fetchurl.nix> {
-    name = "hex0-seed-${version}";
-    url = "https://github.com/oriansj/bootstrap-seeds/raw/b1263ff14a17835f4d12539226208c426ced4fba/POSIX/x86/hex0-seed";
-    hash = "sha256-QU3RPGy51W7M2xnfFY1IqruKzusrSLU+L190ztN6JW8=";
-    executable = true;
-  };
-
   /*
   Since `make-minimal-bootstrap-sources` requires nixpkgs and nix it
   will create a circular dependency if it is used in place of the
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/default.nix b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/default.nix
index c15223a43d4..9f3d61b92bc 100644
--- a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/default.nix
+++ b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/default.nix
@@ -3,21 +3,23 @@
 }:
 
 lib.makeScope newScope (self: with self; {
-  inherit (self.callPackage ./bootstrap-sources.nix {})
-    version hex0-seed minimal-bootstrap-sources;
+  inherit (callPackage ./platforms.nix { }) platforms stage0Arch m2libcArch m2libcOS baseAddress;
+
+  inherit (self.callPackage ./bootstrap-sources.nix {}) version minimal-bootstrap-sources;
 
   src = minimal-bootstrap-sources;
 
   m2libc = src + "/M2libc";
 
   hex0 = callPackage ./hex0.nix { };
+  inherit (self.hex0) hex0-seed;
 
   kaem = callPackage ./kaem { };
   kaem-minimal = callPackage ./kaem/minimal.nix { };
 
-  stage0-posix-x86 = callPackage ./stage0-posix-x86.nix { };
+  mescc-tools-boot = callPackage ./mescc-tools-boot.nix { };
 
-  inherit (self.stage0-posix-x86) blood-elf-0 hex2 kaem-unwrapped M1 M2;
+  inherit (self.mescc-tools-boot) blood-elf-0 hex2 kaem-unwrapped M1 M2;
 
   mescc-tools = callPackage ./mescc-tools { };
 
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/hex0.nix b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/hex0.nix
index b85b2f2cac1..996f2f33ea3 100644
--- a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/hex0.nix
+++ b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/hex0.nix
@@ -1,15 +1,33 @@
 { lib
 , derivationWithMeta
-, hex0-seed
+, hostPlatform
 , src
 , version
+, platforms
+, stage0Arch
 }:
+
+let
+  hash = {
+    "x86"   = "sha256-QU3RPGy51W7M2xnfFY1IqruKzusrSLU+L190ztN6JW8=";
+    "AMD64" = "sha256-RCgK9oZRDQUiWLVkcIBSR2HeoB+Bh0czthrpjFEkCaY=";
+  }.${stage0Arch} or (throw "Unsupported system: ${hostPlatform.system}");
+
+  # Pinned from https://github.com/oriansj/stage0-posix/commit/3189b5f325b7ef8b88e3edec7c1cde4fce73c76c
+  # This 256 byte seed is the only pre-compiled binary in the bootstrap chain.
+  hex0-seed = import <nix/fetchurl.nix> {
+    name = "hex0-seed";
+    url = "https://github.com/oriansj/bootstrap-seeds/raw/b1263ff14a17835f4d12539226208c426ced4fba/POSIX/${stage0Arch}/hex0-seed";
+    executable = true;
+    inherit hash;
+  };
+in
 derivationWithMeta {
   inherit version;
   pname = "hex0";
   builder = hex0-seed;
   args = [
-    "${src}/x86/hex0_x86.hex0"
+    "${src}/${stage0Arch}/hex0_${stage0Arch}.hex0"
     (placeholder "out")
   ];
 
@@ -18,11 +36,13 @@ derivationWithMeta {
     homepage = "https://github.com/oriansj/stage0-posix";
     license = licenses.gpl3Plus;
     maintainers = teams.minimal-bootstrap.members;
-    platforms = [ "i686-linux" ];
+    inherit platforms;
   };
 
+  passthru = { inherit hex0-seed; };
+
   # Ensure the untrusted hex0-seed binary produces a known-good hex0
   outputHashMode = "recursive";
   outputHashAlgo = "sha256";
-  outputHash = "sha256-QU3RPGy51W7M2xnfFY1IqruKzusrSLU+L190ztN6JW8=";
+  outputHash = hash;
 }
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/kaem/default.nix b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/kaem/default.nix
index 77e9a8e8d63..547790835c5 100644
--- a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/kaem/default.nix
+++ b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/kaem/default.nix
@@ -6,6 +6,7 @@
 , mescc-tools
 , mescc-tools-extra
 , version
+, platforms
 }:
 
 # Once mescc-tools-extra is available we can install kaem at /bin/kaem
@@ -46,6 +47,6 @@ derivationWithMeta {
     homepage = "https://github.com/oriansj/mescc-tools";
     license = licenses.gpl3Plus;
     maintainers = teams.minimal-bootstrap.members;
-    platforms = [ "i686-linux" ];
+    inherit platforms;
   };
 }
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/kaem/minimal.nix b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/kaem/minimal.nix
index 24fc77f8d34..ae31302894a 100644
--- a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/kaem/minimal.nix
+++ b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/kaem/minimal.nix
@@ -3,13 +3,15 @@
 , src
 , hex0
 , version
+, platforms
+, stage0Arch
 }:
 derivationWithMeta {
   inherit version;
   pname = "kaem-minimal";
   builder = hex0;
   args = [
-    "${src}/x86/kaem-minimal.hex0"
+    "${src}/${stage0Arch}/kaem-minimal.hex0"
     (placeholder "out")
   ];
 
@@ -18,7 +20,7 @@ derivationWithMeta {
     homepage = "https://github.com/oriansj/stage0-posix";
     license = licenses.gpl3Plus;
     maintainers = teams.minimal-bootstrap.members;
-    platforms = [ "i686-linux" ];
+    inherit platforms;
   };
 }
 
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/stage0-posix-x86.nix b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-boot.nix
index bcb02537b91..65f0fb4c2ff 100644
--- a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/stage0-posix-x86.nix
+++ b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-boot.nix
@@ -1,10 +1,3 @@
-# This is a translation of stage0-posix/stage0-posix/x86/mescc-tools-mini-kaem.kaem to nix
-# https://github.com/oriansj/stage0-posix-x86/blob/56e6b8df3e95f4bc04f8b420a4cd8c82c70b9efa/mescc-tools-mini-kaem.kaem
-#
-# We have access to mini-kaem at this point but it doesn't support substituting
-# environment variables. Without variables there's no way of passing in store inputs,
-# or the $out path, other than as command line arguments directly
-
 # Mes --- Maxwell Equations of Software
 # Copyright © 2017,2019 Jan Nieuwenhuizen <janneke@gnu.org>
 # Copyright © 2017,2019 Jeremiah Orians
@@ -24,19 +17,35 @@
 # You should have received a copy of the GNU General Public License
 # along with Mes.  If not, see <http://www.gnu.org/licenses/>.
 
+# This is a translation of stage0-posix/stage0-posix/x86/mescc-tools-mini-kaem.kaem to nix
+# https://github.com/oriansj/stage0-posix-x86/blob/56e6b8df3e95f4bc04f8b420a4cd8c82c70b9efa/mescc-tools-mini-kaem.kaem
+#
+# We have access to mini-kaem at this point but it doesn't support substituting
+# environment variables. Without variables there's no way of passing in store inputs,
+# or the $out path, other than as command line arguments directly
+
 # Warning all binaries prior to the use of blood-elf will not be readable by
 # Objdump, you may need to use ndism or gdb to view the assembly in the binary.
 
 { lib
 , derivationWithMeta
+, hostPlatform
 , hex0
 , m2libc
 , src
 , version
+, platforms
+, stage0Arch
+, m2libcArch
+, baseAddress
 }:
 rec {
   out = placeholder "out";
 
+  endianFlag = if hostPlatform.isLittleEndian then "--little-endian" else "--big-endian";
+
+  bloodFlags = lib.optional hostPlatform.is64bit "--64";
+
   run = pname: builder: args:
     derivationWithMeta {
       inherit pname version builder args;
@@ -46,7 +55,7 @@ rec {
         homepage = "https://github.com/oriansj/stage0-posix";
         license = licenses.gpl3Plus;
         maintainers = teams.minimal-bootstrap.members;
-        platforms = [ "i686-linux" ];
+        inherit platforms;
       };
     };
 
@@ -54,7 +63,7 @@ rec {
   # Phase-1 Build hex1 from hex0 #
   ################################
 
-  hex1 = run "hex1" hex0 ["${src}/x86/hex1_x86.hex0" out];
+  hex1 = run "hex1" hex0 ["${src}/${stage0Arch}/hex1_${stage0Arch}.hex0" out];
 
   # hex1 adds support for single character labels and is available in various forms
   # in mescc-tools/x86_bootstrap to allow you various ways to verify correctness
@@ -63,7 +72,7 @@ rec {
   # Phase-2 Build hex2 from hex1 #
   ################################
 
-  hex2-0 = run "hex2" hex1 ["${src}/x86/hex2_x86.hex1" out];
+  hex2-0 = run "hex2" hex1 ["${src}/${stage0Arch}/hex2_${stage0Arch}.hex1" out];
 
   # hex2 adds support for long labels and absolute addresses thus allowing it
   # to function as an effective linker for later stages of the bootstrap
@@ -74,7 +83,7 @@ rec {
   # Phase-2b Build catm from hex2 #
   #################################
 
-  catm = run "catm" hex2-0 ["${src}/x86/catm_x86.hex2" out];
+  catm = run "catm" hex2-0 ["${src}/${stage0Arch}/catm_${stage0Arch}.hex2" out];
 
   # catm removes the need for cat or shell support for redirection by providing
   # equivalent functionality via catm output_file input1 input2 ... inputN
@@ -83,27 +92,27 @@ rec {
   # Phase-3 Build M0 from hex2 #
   ##############################
 
-  M0_hex2 = run "M0.hex2" catm [out "${src}/x86/ELF-i386.hex2" "${src}/x86/M0_x86.hex2"];
+  M0_hex2 = run "M0.hex2" catm [out "${m2libc}/${m2libcArch}/ELF-${m2libcArch}.hex2" "${src}/${stage0Arch}/M0_${stage0Arch}.hex2"];
   M0 = run "M0" hex2-0 [M0_hex2 out];
 
   # M0 is the architecture specific version of M1 and is by design single
   # architecture only and will be replaced by the C code version of M1
 
   ################################
-  # Phase-4 Build cc_x86 from M0 #
+  # Phase-4 Build cc_arch from M0 #
   ################################
 
-  cc_x86-0_hex2 = run "cc_x86-0.hex2" M0 ["${src}/x86/cc_x86.M1" out];
-  cc_x86-1_hex2 = run "cc_x86-1.hex2" catm [out "${src}/x86/ELF-i386.hex2" cc_x86-0_hex2];
-  cc_x86 = run "cc_x86" hex2-0 [cc_x86-1_hex2 out];
+  cc_arch-0_hex2 = run "cc_arch-0.hex2" M0 ["${src}/${stage0Arch}/cc_${m2libcArch}.M1" out];
+  cc_arch-1_hex2 = run "cc_arch-1.hex2" catm [out "${m2libc}/${m2libcArch}/ELF-${m2libcArch}.hex2" cc_arch-0_hex2];
+  cc_arch = run "cc_arch" hex2-0 [cc_arch-1_hex2 out];
 
-  #######################################
-  # Phase-5 Build M2-Planet from cc_x86 #
-  #######################################
+  ########################################
+  # Phase-5 Build M2-Planet from cc_arch #
+  ########################################
 
   M2-0_c = run "M2-0.c" catm [
     out
-    "${m2libc}/x86/linux/bootstrap.c"
+    "${m2libc}/${m2libcArch}/linux/bootstrap.c"
     "${src}/M2-Planet/cc.h"
     "${m2libc}/bootstrappable.c"
     "${src}/M2-Planet/cc_globals.c"
@@ -114,10 +123,10 @@ rec {
     "${src}/M2-Planet/cc_macro.c"
     "${src}/M2-Planet/cc.c"
   ];
-  M2-0_M1 = run "M2-0.M1" cc_x86 [M2-0_c out];
-  M2-0-0_M1 = run "M2-0-0.M1" catm [out "${src}/x86/x86_defs.M1" "${src}/x86/libc-core.M1" M2-0_M1];
+  M2-0_M1 = run "M2-0.M1" cc_arch [M2-0_c out];
+  M2-0-0_M1 = run "M2-0-0.M1" catm [out "${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1" "${m2libc}/${m2libcArch}/libc-core.M1" M2-0_M1];
   M2-0_hex2 = run "M2-0.hex2" M0 [M2-0-0_M1 out];
-  M2-0-0_hex2 = run "M2-0-0.hex2" catm [out "${src}/x86/ELF-i386.hex2" M2-0_hex2];
+  M2-0-0_hex2 = run "M2-0-0.hex2" catm [out "${m2libc}/${m2libcArch}/ELF-${m2libcArch}.hex2" M2-0_hex2];
   M2 = run "M2" hex2-0 [M2-0-0_hex2 out];
 
   ############################################
@@ -125,8 +134,8 @@ rec {
   ############################################
 
   blood-elf-0_M1 = run "blood-elf-0.M1" M2 [
-    "--architecture" "x86"
-    "-f" "${m2libc}/x86/linux/bootstrap.c"
+    "--architecture" m2libcArch
+    "-f" "${m2libc}/${m2libcArch}/linux/bootstrap.c"
     "-f" "${m2libc}/bootstrappable.c"
     "-f" "${src}/mescc-tools/stringify.c"
     "-f" "${src}/mescc-tools/blood-elf.c"
@@ -134,9 +143,9 @@ rec {
     "-o" out
   ];
 
-  blood-elf-0-0_M1 = run "blood-elf-0-0.M1" catm [out "${m2libc}/x86/x86_defs.M1" "${m2libc}/x86/libc-core.M1" blood-elf-0_M1];
+  blood-elf-0-0_M1 = run "blood-elf-0-0.M1" catm [out "${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1" "${m2libc}/${m2libcArch}/libc-core.M1" blood-elf-0_M1];
   blood-elf-0_hex2 = run "blood-elf-0.hex2" M0 [blood-elf-0-0_M1 out];
-  blood-elf-0-0_hex2 = run "blood-elf-0-0.hex2" catm [out "${m2libc}/x86/ELF-x86.hex2" blood-elf-0_hex2];
+  blood-elf-0-0_hex2 = run "blood-elf-0-0.hex2" catm [out "${m2libc}/${m2libcArch}/ELF-${m2libcArch}.hex2" blood-elf-0_hex2];
   blood-elf-0 = run "blood-elf-0" hex2-0 [blood-elf-0-0_hex2 out];
 
   # This is the last stage where the binaries will not have debug info
@@ -147,8 +156,8 @@ rec {
   #####################################
 
   M1-macro-0_M1 = run "M1-macro-0.M1" M2 [
-    "--architecture" "x86"
-    "-f" "${m2libc}/x86/linux/bootstrap.c"
+    "--architecture" m2libcArch
+    "-f" "${m2libc}/${m2libcArch}/linux/bootstrap.c"
     "-f" "${m2libc}/bootstrappable.c"
     "-f" "${src}/mescc-tools/stringify.c"
     "-f" "${src}/mescc-tools/M1-macro.c"
@@ -157,10 +166,10 @@ rec {
     "-o" out
   ];
 
-  M1-macro-0-footer_M1 = run "M1-macro-0-footer.M1" blood-elf-0 ["-f" M1-macro-0_M1 "--little-endian" "-o" out];
-  M1-macro-0-0_M1 = run "M1-macro-0-0.M1" catm [out "${m2libc}/x86/x86_defs.M1" "${m2libc}/x86/libc-core.M1" M1-macro-0_M1 M1-macro-0-footer_M1];
+  M1-macro-0-footer_M1 = run "M1-macro-0-footer.M1" blood-elf-0 (bloodFlags ++ ["-f" M1-macro-0_M1 endianFlag "-o" out]);
+  M1-macro-0-0_M1 = run "M1-macro-0-0.M1" catm [out "${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1" "${m2libc}/${m2libcArch}/libc-core.M1" M1-macro-0_M1 M1-macro-0-footer_M1];
   M1-macro-0_hex2 = run "M1-macro-0.hex2" M0 [M1-macro-0-0_M1 out];
-  M1-macro-0-0_hex2 = run "M1-macro-0-0.hex2" catm [out "${m2libc}/x86/ELF-x86-debug.hex2" M1-macro-0_hex2];
+  M1-macro-0-0_hex2 = run "M1-macro-0-0.hex2" catm [out "${m2libc}/${m2libcArch}/ELF-${m2libcArch}-debug.hex2" M1-macro-0_hex2];
   M1-0 = run "M1-0" hex2-0 [M1-macro-0-0_hex2 out];
 
   # This is the last stage where catm will need to be used and the last stage where
@@ -172,13 +181,13 @@ rec {
   #######################################
 
   hex2_linker-0_M1 = run "hex2_linker-0.M1" M2 [
-    "--architecture" "x86"
+    "--architecture" m2libcArch
     "-f" "${m2libc}/sys/types.h"
     "-f" "${m2libc}/stddef.h"
-    "-f" "${m2libc}/x86/linux/unistd.c"
-    "-f" "${m2libc}/x86/linux/fcntl.c"
+    "-f" "${m2libc}/${m2libcArch}/linux/unistd.c"
+    "-f" "${m2libc}/${m2libcArch}/linux/fcntl.c"
     "-f" "${m2libc}/fcntl.c"
-    "-f" "${m2libc}/x86/linux/sys/stat.c"
+    "-f" "${m2libc}/${m2libcArch}/linux/sys/stat.c"
     "-f" "${m2libc}/stdlib.c"
     "-f" "${m2libc}/stdio.h"
     "-f" "${m2libc}/stdio.c"
@@ -191,19 +200,19 @@ rec {
     "-o" out
   ];
 
-  hex2_linker-0-footer_M1 = run "hex2_linker-0-footer.M1" blood-elf-0 ["-f" hex2_linker-0_M1 "--little-endian" "-o" out];
+  hex2_linker-0-footer_M1 = run "hex2_linker-0-footer.M1" blood-elf-0 (bloodFlags ++ ["-f" hex2_linker-0_M1 endianFlag "-o" out]);
 
   hex2_linker-0_hex2 = run "hex2_linker-0.hex2" M1-0 [
-    "--architecture" "x86"
-    "--little-endian"
-    "-f" "${m2libc}/x86/x86_defs.M1"
-    "-f" "${m2libc}/x86/libc-full.M1"
+    "--architecture" m2libcArch
+    endianFlag
+    "-f" "${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1"
+    "-f" "${m2libc}/${m2libcArch}/libc-full.M1"
     "-f" hex2_linker-0_M1
     "-f" hex2_linker-0-footer_M1
     "-o" out
   ];
 
-  hex2_linker-0-0_hex2 = run "hex2_linker-0-0.hex2" catm [out "${m2libc}/x86/ELF-x86-debug.hex2" hex2_linker-0_hex2];
+  hex2_linker-0-0_hex2 = run "hex2_linker-0-0.hex2" catm [out "${m2libc}/${m2libcArch}/ELF-${m2libcArch}-debug.hex2" hex2_linker-0_hex2];
 
   hex2-1 = run "hex2-1" hex2-0 [hex2_linker-0-0_hex2 out];
 
@@ -215,12 +224,12 @@ rec {
   ###################################
 
   M1-macro-1_M1 = run "M1-macro-1.M1" M2 [
-    "--architecture" "x86"
+    "--architecture" m2libcArch
     "-f" "${m2libc}/sys/types.h"
     "-f" "${m2libc}/stddef.h"
-    "-f" "${m2libc}/x86/linux/fcntl.c"
+    "-f" "${m2libc}/${m2libcArch}/linux/fcntl.c"
     "-f" "${m2libc}/fcntl.c"
-    "-f" "${m2libc}/x86/linux/unistd.c"
+    "-f" "${m2libc}/${m2libcArch}/linux/unistd.c"
     "-f" "${m2libc}/string.c"
     "-f" "${m2libc}/stdlib.c"
     "-f" "${m2libc}/stdio.h"
@@ -232,23 +241,23 @@ rec {
     "-o" out
   ];
 
-  M1-macro-1-footer_M1 = run "M1-macro-1-footer.M1" blood-elf-0 ["-f" M1-macro-1_M1 "--little-endian" "-o" out];
+  M1-macro-1-footer_M1 = run "M1-macro-1-footer.M1" blood-elf-0 (bloodFlags ++ ["-f" M1-macro-1_M1 endianFlag "-o" out]);
 
   M1-macro-1_hex2 = run "M1-macro-1.hex2" M1-0 [
-    "--architecture" "x86"
-    "--little-endian"
-    "-f" "${m2libc}/x86/x86_defs.M1"
-    "-f" "${m2libc}/x86/libc-full.M1"
+    "--architecture" m2libcArch
+    endianFlag
+    "-f" "${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1"
+    "-f" "${m2libc}/${m2libcArch}/libc-full.M1"
     "-f" M1-macro-1_M1
     "-f" M1-macro-1-footer_M1
     "-o" out
   ];
 
   M1 = run "M1" hex2-1 [
-    "--architecture" "x86"
-    "--little-endian"
-    "--base-address" "0x8048000"
-    "-f" "${m2libc}/x86/ELF-x86-debug.hex2"
+    "--architecture" m2libcArch
+    endianFlag
+    "--base-address" baseAddress
+    "-f" "${m2libc}/${m2libcArch}/ELF-${m2libcArch}-debug.hex2"
     "-f" M1-macro-1_hex2
     "-o" out
   ];
@@ -258,13 +267,13 @@ rec {
   ######################################
 
   hex2_linker-2_M1 = run "hex2_linker-2.M1" M2 [
-    "--architecture" "x86"
+    "--architecture" m2libcArch
     "-f" "${m2libc}/sys/types.h"
     "-f" "${m2libc}/stddef.h"
-    "-f" "${m2libc}/x86/linux/unistd.c"
-    "-f" "${m2libc}/x86/linux/fcntl.c"
+    "-f" "${m2libc}/${m2libcArch}/linux/unistd.c"
+    "-f" "${m2libc}/${m2libcArch}/linux/fcntl.c"
     "-f" "${m2libc}/fcntl.c"
-    "-f" "${m2libc}/x86/linux/sys/stat.c"
+    "-f" "${m2libc}/${m2libcArch}/linux/sys/stat.c"
     "-f" "${m2libc}/stdlib.c"
     "-f" "${m2libc}/stdio.h"
     "-f" "${m2libc}/stdio.c"
@@ -277,23 +286,23 @@ rec {
     "-o" out
   ];
 
-  hex2_linker-2-footer_M1 = run "hex2_linker-2-footer.M1" blood-elf-0 ["-f" hex2_linker-2_M1 "--little-endian" "-o" out];
+  hex2_linker-2-footer_M1 = run "hex2_linker-2-footer.M1" blood-elf-0 (bloodFlags ++ ["-f" hex2_linker-2_M1 endianFlag "-o" out]);
 
   hex2_linker-2_hex2 = run "hex2_linker-2.hex2" M1 [
-    "--architecture" "x86"
-    "--little-endian"
-    "-f" "${m2libc}/x86/x86_defs.M1"
-    "-f" "${m2libc}/x86/libc-full.M1"
+    "--architecture" m2libcArch
+    endianFlag
+    "-f" "${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1"
+    "-f" "${m2libc}/${m2libcArch}/libc-full.M1"
     "-f" hex2_linker-2_M1
     "-f" hex2_linker-2-footer_M1
     "-o" out
   ];
 
   hex2 = run "hex2" hex2-1 [
-    "--architecture" "x86"
-    "--little-endian"
-    "--base-address" "0x8048000"
-    "-f" "${m2libc}/x86/ELF-x86-debug.hex2"
+    "--architecture" m2libcArch
+    endianFlag
+    "--base-address" baseAddress
+    "-f" "${m2libc}/${m2libcArch}/ELF-${m2libcArch}-debug.hex2"
     "-f" hex2_linker-2_hex2
     "-o" out
   ];
@@ -303,12 +312,12 @@ rec {
   ######################################
 
   kaem_M1 = run "kaem.M1" M2 [
-    "--architecture" "x86"
+    "--architecture" m2libcArch
     "-f" "${m2libc}/sys/types.h"
     "-f" "${m2libc}/stddef.h"
     "-f" "${m2libc}/string.c"
-    "-f" "${m2libc}/x86/linux/unistd.c"
-    "-f" "${m2libc}/x86/linux/fcntl.c"
+    "-f" "${m2libc}/${m2libcArch}/linux/unistd.c"
+    "-f" "${m2libc}/${m2libcArch}/linux/fcntl.c"
     "-f" "${m2libc}/fcntl.c"
     "-f" "${m2libc}/stdlib.c"
     "-f" "${m2libc}/stdio.h"
@@ -322,24 +331,24 @@ rec {
     "-o" out
   ];
 
-  kaem-footer_M1 = run "kaem-footer.M1" blood-elf-0 ["-f" kaem_M1 "--little-endian" "-o" out];
+  kaem-footer_M1 = run "kaem-footer.M1" blood-elf-0 (bloodFlags ++ ["-f" kaem_M1 endianFlag "-o" out]);
 
   kaem_hex2 = run "kaem.hex2" M1 [
-    "--architecture" "x86"
-    "--little-endian"
-    "-f" "${m2libc}/x86/x86_defs.M1"
-    "-f" "${m2libc}/x86/libc-full.M1"
+    "--architecture" m2libcArch
+    endianFlag
+    "-f" "${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1"
+    "-f" "${m2libc}/${m2libcArch}/libc-full.M1"
     "-f" kaem_M1
     "-f" kaem-footer_M1
     "-o" out
   ];
 
   kaem-unwrapped = run "kaem-unwrapped" hex2 [
-    "--architecture" "x86"
-    "--little-endian"
-    "-f" "${m2libc}/x86/ELF-x86-debug.hex2"
+    "--architecture" m2libcArch
+    endianFlag
+    "-f" "${m2libc}/${m2libcArch}/ELF-${m2libcArch}-debug.hex2"
     "-f" kaem_hex2
-    "--base-address" "0x8048000"
+    "--base-address" baseAddress
     "-o" out
   ];
 }
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-extra/build.kaem b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-extra/build.kaem
index e50fc1c6847..fb27eccab83 100644
--- a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-extra/build.kaem
+++ b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-extra/build.kaem
@@ -19,7 +19,7 @@
 ## You should have received a copy of the GNU General Public License
 ## along with mescc-tools.  If not, see <http://www.gnu.org/licenses/>.
 
-alias CC="${mescc-tools}/bin/M2-Mesoplanet --operating-system ${OPERATING_SYSTEM} --architecture ${ARCH} -f"
+alias CC="${mescc-tools}/bin/M2-Mesoplanet --operating-system ${m2libcOS} --architecture ${m2libcArch} -f"
 cd ${src}/mescc-tools-extra
 
 # Create output folder
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-extra/default.nix b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-extra/default.nix
index 425a10cfb35..eee00491c44 100644
--- a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-extra/default.nix
+++ b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools-extra/default.nix
@@ -4,9 +4,12 @@
 , mescc-tools
 , src
 , version
+, platforms
+, m2libcArch
+, m2libcOS
 }:
 derivationWithMeta {
-  inherit version src mescc-tools;
+  inherit version src mescc-tools m2libcArch m2libcOS;
   pname = "mescc-tools-extra";
   builder = kaem-unwrapped;
   args = [
@@ -16,14 +19,11 @@ derivationWithMeta {
     ./build.kaem
   ];
 
-  ARCH = "x86";
-  OPERATING_SYSTEM = "linux";
-
   meta = with lib; {
     description = "Collection of tools written for use in bootstrapping";
     homepage = "https://github.com/oriansj/mescc-tools-extra";
     license = licenses.gpl3Plus;
     maintainers = teams.minimal-bootstrap.members;
-    platforms = [ "i686-linux" ];
+    inherit platforms;
   };
 }
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools/build.kaem b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools/build.kaem
index 3a7ae25fbd8..128ff360fd2 100644
--- a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools/build.kaem
+++ b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools/build.kaem
@@ -46,13 +46,13 @@ ${replace} \
 # Phase-12 Build M2-Mesoplanet from M2-Planet #
 ###############################################
 
-${M2} --architecture ${ARCH} \
+${M2} --architecture ${m2libcArch} \
   -f ${m2libc}/sys/types.h \
   -f ${m2libc}/stddef.h \
-  -f ${m2libc}/${ARCH}/linux/fcntl.c \
+  -f ${m2libc}/${m2libcArch}/linux/fcntl.c \
   -f ${m2libc}/fcntl.c \
-  -f ${m2libc}/${ARCH}/linux/unistd.c \
-  -f ${m2libc}/${ARCH}/linux/sys/stat.c \
+  -f ${m2libc}/${m2libcArch}/linux/unistd.c \
+  -f ${m2libc}/${m2libcArch}/linux/sys/stat.c \
   -f ${m2libc}/stdlib.c \
   -f ${m2libc}/stdio.h \
   -f ${m2libc}/stdio.c \
@@ -69,20 +69,20 @@ ${M2} --architecture ${ARCH} \
   --debug \
   -o ./M2-Mesoplanet-1.M1
 
-${blood-elf-0} ${ENDIAN_FLAG} ${BLOOD_FLAG} -f ./M2-Mesoplanet-1.M1 -o ./M2-Mesoplanet-1-footer.M1
+${blood-elf-0} ${endianFlag} ${bloodFlag} -f ./M2-Mesoplanet-1.M1 -o ./M2-Mesoplanet-1-footer.M1
 
-${M1} --architecture ${ARCH} \
-  ${ENDIAN_FLAG} \
-  -f ${m2libc}/${ARCH}/${ARCH}_defs.M1 \
-  -f ${m2libc}/${ARCH}/libc-full.M1 \
+${M1} --architecture ${m2libcArch} \
+  ${endianFlag} \
+  -f ${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1 \
+  -f ${m2libc}/${m2libcArch}/libc-full.M1 \
   -f ./M2-Mesoplanet-1.M1 \
   -f ./M2-Mesoplanet-1-footer.M1 \
   -o ./M2-Mesoplanet-1.hex2
 
-${hex2} --architecture ${ARCH} \
-  ${ENDIAN_FLAG} \
-  --base-address ${BASE_ADDRESS} \
-  -f ${m2libc}/${ARCH}/ELF-${ARCH}-debug.hex2 \
+${hex2} --architecture ${m2libcArch} \
+  ${endianFlag} \
+  --base-address ${baseAddress} \
+  -f ${m2libc}/${m2libcArch}/ELF-${m2libcArch}-debug.hex2 \
   -f ./M2-Mesoplanet-1.hex2 \
   -o ${out}/bin/M2-Mesoplanet
 
@@ -90,12 +90,12 @@ ${hex2} --architecture ${ARCH} \
 # Phase-13 Build final blood-elf from C sources #
 #################################################
 
-${M2} --architecture ${ARCH} \
+${M2} --architecture ${m2libcArch} \
 	-f ${m2libc}/sys/types.h \
 	-f ${m2libc}/stddef.h \
-	-f ${m2libc}/${ARCH}/linux/fcntl.c \
+	-f ${m2libc}/${m2libcArch}/linux/fcntl.c \
 	-f ${m2libc}/fcntl.c \
-	-f ${m2libc}/${ARCH}/linux/unistd.c \
+	-f ${m2libc}/${m2libcArch}/linux/unistd.c \
 	-f ${m2libc}/stdlib.c \
 	-f ${m2libc}/stdio.h \
 	-f ${m2libc}/stdio.c \
@@ -105,19 +105,20 @@ ${M2} --architecture ${ARCH} \
 	--debug \
 	-o ./blood-elf-1.M1
 
-${blood-elf-0} ${BLOOD_FLAG} ${ENDIAN_FLAG} -f ./blood-elf-1.M1 -o ./blood-elf-1-footer.M1
-${M1} --architecture ${ARCH} \
-	${ENDIAN_FLAG} \
-	-f ${m2libc}/${ARCH}/${ARCH}_defs.M1 \
-	-f ${m2libc}/${ARCH}/libc-full.M1 \
+${blood-elf-0} ${endianFlag} ${bloodFlag} -f ./blood-elf-1.M1 -o ./blood-elf-1-footer.M1
+
+${M1} --architecture ${m2libcArch} \
+	${endianFlag} \
+	-f ${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1 \
+	-f ${m2libc}/${m2libcArch}/libc-full.M1 \
 	-f ./blood-elf-1.M1 \
 	-f ./blood-elf-1-footer.M1 \
 	-o ./blood-elf-1.hex2
 
-${hex2} --architecture ${ARCH} \
-	${ENDIAN_FLAG} \
-	--base-address ${BASE_ADDRESS} \
-	-f ${m2libc}/${ARCH}/ELF-${ARCH}-debug.hex2 \
+${hex2} --architecture ${m2libcArch} \
+	${endianFlag} \
+	--base-address ${baseAddress} \
+	-f ${m2libc}/${m2libcArch}/ELF-${m2libcArch}-debug.hex2 \
 	-f ./blood-elf-1.hex2 \
 	-o ${out}/bin/blood-elf
 
@@ -129,11 +130,11 @@ ${hex2} --architecture ${ARCH} \
 # Phase-14 Build get_machine from C sources #
 #############################################
 
-${M2} --architecture ${ARCH} \
+${M2} --architecture ${m2libcArch} \
 	-f ${m2libc}/sys/types.h \
 	-f ${m2libc}/stddef.h \
-	-f ${m2libc}/${ARCH}/linux/unistd.c \
-	-f ${m2libc}/${ARCH}/linux/fcntl.c \
+	-f ${m2libc}/${m2libcArch}/linux/unistd.c \
+	-f ${m2libc}/${m2libcArch}/linux/fcntl.c \
 	-f ${m2libc}/fcntl.c \
 	-f ${m2libc}/stdlib.c \
 	-f ${m2libc}/stdio.h \
@@ -143,20 +144,20 @@ ${M2} --architecture ${ARCH} \
 	--debug \
 	-o get_machine.M1
 
-${out}/bin/blood-elf ${BLOOD_FLAG} ${ENDIAN_FLAG} -f ./get_machine.M1 -o ./get_machine-footer.M1
+${out}/bin/blood-elf ${endianFlag} ${bloodFlag} -f ./get_machine.M1 -o ./get_machine-footer.M1
 
-${M1} --architecture ${ARCH} \
-	${ENDIAN_FLAG} \
-	-f ${m2libc}/${ARCH}/${ARCH}_defs.M1 \
-	-f ${m2libc}/${ARCH}/libc-full.M1 \
+${M1} --architecture ${m2libcArch} \
+	${endianFlag} \
+	-f ${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1 \
+	-f ${m2libc}/${m2libcArch}/libc-full.M1 \
 	-f ./get_machine.M1 \
 	-f ./get_machine-footer.M1 \
 	-o ./get_machine.hex2
 
-${hex2} --architecture ${ARCH} \
-	${ENDIAN_FLAG} \
-	--base-address ${BASE_ADDRESS} \
-	-f ${m2libc}/${ARCH}/ELF-${ARCH}-debug.hex2 \
+${hex2} --architecture ${m2libcArch} \
+	${endianFlag} \
+	--base-address ${baseAddress} \
+	-f ${m2libc}/${m2libcArch}/ELF-${m2libcArch}-debug.hex2 \
 	-f ./get_machine.hex2 \
 	-o ${out}/bin/get_machine
 
@@ -164,11 +165,11 @@ ${hex2} --architecture ${ARCH} \
 # Phase-15 Build M2-Planet from M2-Planet  #
 ############################################
 
-${M2} --architecture ${ARCH} \
+${M2} --architecture ${m2libcArch} \
 	-f ${m2libc}/sys/types.h \
 	-f ${m2libc}/stddef.h \
-	-f ${m2libc}/${ARCH}/linux/unistd.c \
-	-f ${m2libc}/${ARCH}/linux/fcntl.c \
+	-f ${m2libc}/${m2libcArch}/linux/unistd.c \
+	-f ${m2libc}/${m2libcArch}/linux/fcntl.c \
 	-f ${m2libc}/fcntl.c \
 	-f ${m2libc}/stdlib.c \
 	-f ${m2libc}/stdio.h \
@@ -185,20 +186,19 @@ ${M2} --architecture ${ARCH} \
 	--debug \
 	-o ./M2-1.M1
 
-${out}/bin/blood-elf ${ENDIAN_FLAG} ${BLOOD_FLAG} -f ./M2-1.M1 -o ./M2-1-footer.M1
+${out}/bin/blood-elf ${endianFlag} ${bloodFlag} -f ./M2-1.M1 -o ./M2-1-footer.M1
 
-${M1} --architecture ${ARCH} \
-	${ENDIAN_FLAG} \
-	-f ${m2libc}/${ARCH}/${ARCH}_defs.M1 \
-	-f ${m2libc}/${ARCH}/libc-full.M1 \
+${M1} --architecture ${m2libcArch} \
+	${endianFlag} \
+	-f ${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1 \
+	-f ${m2libc}/${m2libcArch}/libc-full.M1 \
 	-f ./M2-1.M1 \
 	-f ./M2-1-footer.M1 \
 	-o ./M2-1.hex2
 
-${hex2} --architecture ${ARCH} \
-	${ENDIAN_FLAG} \
-	--base-address ${BASE_ADDRESS} \
-	-f ${m2libc}/${ARCH}/ELF-${ARCH}-debug.hex2 \
+${hex2} --architecture ${m2libcArch} \
+	${endianFlag} \
+	--base-address ${baseAddress} \
+	-f ${m2libc}/${m2libcArch}/ELF-${m2libcArch}-debug.hex2 \
 	-f ./M2-1.hex2 \
 	-o ${out}/bin/M2-Planet
-
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools/default.nix b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools/default.nix
index c4aca823203..4a9c734981e 100644
--- a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools/default.nix
+++ b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/mescc-tools/default.nix
@@ -1,5 +1,6 @@
 { lib
 , derivationWithMeta
+, hostPlatform
 , kaem-unwrapped
 , M1
 , M2
@@ -8,13 +9,14 @@
 , m2libc
 , src
 , version
+, platforms
+, m2libcArch
+, baseAddress
 }:
 
 let
-  ARCH = "x86";
-  BLOOD_FLAG = " ";
-  BASE_ADDRESS = "0x8048000";
-  ENDIAN_FLAG = "--little-endian";
+  endianFlag = if hostPlatform.isLittleEndian then "--little-endian" else "--big-endian";
+  bloodFlag = if hostPlatform.is64bit then "--64" else " ";
 
   # We need a few tools from mescc-tools-extra to assemble the output folder
   buildMesccToolsExtraUtil = name:
@@ -26,13 +28,13 @@ let
         "--strict"
         "--file"
         (builtins.toFile "build-${name}.kaem" ''
-          ''${M2} --architecture ''${ARCH} \
+          ''${M2} --architecture ${m2libcArch} \
             -f ''${m2libc}/sys/types.h \
             -f ''${m2libc}/stddef.h \
-            -f ''${m2libc}/''${ARCH}/linux/fcntl.c \
+            -f ''${m2libc}/${m2libcArch}/linux/fcntl.c \
             -f ''${m2libc}/fcntl.c \
-            -f ''${m2libc}/''${ARCH}/linux/unistd.c \
-            -f ''${m2libc}/''${ARCH}/linux/sys/stat.c \
+            -f ''${m2libc}/${m2libcArch}/linux/unistd.c \
+            -f ''${m2libc}/${m2libcArch}/linux/sys/stat.c \
             -f ''${m2libc}/stdlib.c \
             -f ''${m2libc}/stdio.h \
             -f ''${m2libc}/stdio.c \
@@ -42,25 +44,25 @@ let
             --debug \
             -o ${name}.M1
 
-          ''${blood-elf-0} ''${ENDIAN_FLAG} -f ${name}.M1 -o ${name}-footer.M1
+          ''${blood-elf-0} ${endianFlag} ${bloodFlag} -f ${name}.M1 -o ${name}-footer.M1
 
-          ''${M1} --architecture ''${ARCH} \
-            ''${ENDIAN_FLAG} \
-            -f ''${m2libc}/''${ARCH}/''${ARCH}_defs.M1 \
-            -f ''${m2libc}/''${ARCH}/libc-full.M1 \
+          ''${M1} --architecture ${m2libcArch} \
+            ${endianFlag} \
+            -f ''${m2libc}/${m2libcArch}/${m2libcArch}_defs.M1 \
+            -f ''${m2libc}/${m2libcArch}/libc-full.M1 \
             -f ${name}.M1 \
             -f ${name}-footer.M1 \
             -o ${name}.hex2
 
-          ''${hex2} --architecture ''${ARCH} \
-            ''${ENDIAN_FLAG} \
-            -f ''${m2libc}/''${ARCH}/ELF-''${ARCH}-debug.hex2 \
+          ''${hex2} --architecture ${m2libcArch} \
+            ${endianFlag} \
+            -f ''${m2libc}/${m2libcArch}/ELF-${m2libcArch}-debug.hex2 \
             -f ${name}.hex2 \
-            --base-address ''${BASE_ADDRESS} \
+            --base-address ${baseAddress} \
             -o ''${out}
         '')
       ];
-      inherit version M1 M2 blood-elf-0 hex2 m2libc src ARCH BLOOD_FLAG BASE_ADDRESS ENDIAN_FLAG;
+      inherit version M1 M2 blood-elf-0 hex2 m2libc src;
     };
   mkdir = buildMesccToolsExtraUtil "mkdir";
   cp = buildMesccToolsExtraUtil "cp";
@@ -76,13 +78,13 @@ derivationWithMeta {
     "--file"
     ./build.kaem
   ];
-  inherit version M1 M2 blood-elf-0 hex2 mkdir cp chmod replace m2libc src ARCH BLOOD_FLAG BASE_ADDRESS ENDIAN_FLAG;
+  inherit version M1 M2 blood-elf-0 hex2 mkdir cp chmod replace m2libc src m2libcArch baseAddress bloodFlag endianFlag;
 
   meta = with lib; {
     description = "Collection of tools written for use in bootstrapping";
     homepage = "https://github.com/oriansj/mescc-tools";
     license = licenses.gpl3Plus;
     maintainers = teams.minimal-bootstrap.members;
-    platforms = [ "i686-linux" ];
+    inherit platforms;
   };
 }
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/platforms.nix b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/platforms.nix
new file mode 100644
index 00000000000..c68f7630f3d
--- /dev/null
+++ b/pkgs/os-specific/linux/minimal-bootstrap/stage0-posix/platforms.nix
@@ -0,0 +1,29 @@
+# Platform specific constants
+{ lib
+, hostPlatform
+}:
+
+rec {
+  # meta.platforms
+  platforms = [
+    "i686-linux"
+    "x86_64-linux"
+  ];
+
+  # system arch as used within the stage0 project
+  stage0Arch = {
+    "i686-linux"   = "x86";
+    "x86_64-linux" = "AMD64";
+  }.${hostPlatform.system} or (throw "Unsupported system: ${hostPlatform.system}");
+
+  # lower-case form is widely used by m2libc
+  m2libcArch = lib.toLower stage0Arch;
+
+  # Passed to M2-Mesoplanet as --operating-system
+  m2libcOS = if hostPlatform.isLinux then "linux" else throw "Unsupported system: ${hostPlatform.system}";
+
+  baseAddress = {
+    "i686-linux"   = "0x08048000";
+    "x86_64-linux" = "0x00600000";
+  }.${hostPlatform.system} or (throw "Unsupported system: ${hostPlatform.system}");
+}