54 lines
2 KiB
Nix
54 lines
2 KiB
Nix
|
# Based up original work by cleverca22
|
||
|
# https://github.com/cleverca22/nixos-configs/blob/master/qemu.nix
|
||
|
|
||
|
|
||
|
{ config, pkgs, lib, ... }:
|
||
|
|
||
|
with lib;
|
||
|
let
|
||
|
cfg = config.qemu-user;
|
||
|
arm = {
|
||
|
interpreter = "${pkgs.qemu-user-arm}/bin/qemu-arm";
|
||
|
magicOrExtension = ''\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00'';
|
||
|
mask = ''\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\x00\xff\xfe\xff\xff\xff'';
|
||
|
};
|
||
|
aarch64 = {
|
||
|
interpreter = "${pkgs.qemu-user-arm64}/bin/qemu-aarch64";
|
||
|
magicOrExtension = ''\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00'';
|
||
|
mask = ''\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\x00\xff\xfe\xff\xff\xff'';
|
||
|
};
|
||
|
riscv64 = {
|
||
|
interpreter = "${pkgs.qemu-riscv64}/bin/qemu-riscv64";
|
||
|
magicOrExtension = ''\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00'';
|
||
|
mask = ''\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\x00\xff\xfe\xff\xff\xff'';
|
||
|
};
|
||
|
in {
|
||
|
options = {
|
||
|
qemu-user = {
|
||
|
arm = mkEnableOption "enable 32bit arm emulation";
|
||
|
aarch64 = mkEnableOption "enable 64bit arm emulation";
|
||
|
riscv64 = mkEnableOption "enable 64bit riscv emulation";
|
||
|
};
|
||
|
nix.supportedPlatforms = mkOption {
|
||
|
type = types.listOf types.str;
|
||
|
description = "extra platforms that nix will run binaries for";
|
||
|
default = [];
|
||
|
};
|
||
|
};
|
||
|
config = mkIf (cfg.arm || cfg.aarch64) {
|
||
|
nixpkgs = {
|
||
|
overlays = [ (import ../overlays/qemu) ];
|
||
|
};
|
||
|
boot.binfmt.registrations =
|
||
|
optionalAttrs cfg.arm { inherit arm; } //
|
||
|
optionalAttrs cfg.aarch64 { inherit aarch64; } //
|
||
|
optionalAttrs cfg.riscv64 { inherit riscv64; };
|
||
|
nix.supportedPlatforms = (optionals cfg.arm [ "armv6l-linux" "armv7l-linux" ])
|
||
|
++ (optional cfg.aarch64 "aarch64-linux");
|
||
|
nix.extraOptions = ''
|
||
|
extra-platforms = ${toString config.nix.supportedPlatforms} i686-linux
|
||
|
'';
|
||
|
nix.sandboxPaths = [ "/run/binfmt" ] ++ (optional cfg.arm "${pkgs.qemu-user-arm}") ++ (optional cfg.aarch64 "${pkgs.qemu-user-arm64}");
|
||
|
};
|
||
|
}
|