uimage: make fit optional

This commit is contained in:
Daniel Barlow 2023-10-08 22:35:30 +01:00
parent f62ad0e1d7
commit bd20f3e419
4 changed files with 49 additions and 32 deletions

View file

@ -131,9 +131,11 @@
SERIAL_OF_PLATFORM="y"; SERIAL_OF_PLATFORM="y";
}; };
}; };
boot.commandLine = [ boot = {
"console=ttyS0,115200" commandLine = [ "console=ttyS0,115200" ];
]; tftp.loadAddress = "0x4007ff28";
imageFormat = "fit";
};
filesystem = filesystem =
let inherit (pkgs.pseudofile) dir symlink; let inherit (pkgs.pseudofile) dir symlink;
in in

View file

@ -47,6 +47,10 @@ in {
default = []; default = [];
description = "Kernel command line"; description = "Kernel command line";
}; };
imageFormat = mkOption {
type = types.enum ["fit" "uimage"];
default = "uimage";
};
tftp = { tftp = {
loadAddress = mkOption { loadAddress = mkOption {
type = types.str; type = types.str;

View file

@ -78,6 +78,7 @@ in
uimage = liminix.builders.uimage { uimage = liminix.builders.uimage {
commandLine = concatStringsSep " " config.boot.commandLine; commandLine = concatStringsSep " " config.boot.commandLine;
inherit (config.hardware) loadAddress entryPoint; inherit (config.hardware) loadAddress entryPoint;
inherit (config.boot) imageFormat;
inherit kernel; inherit kernel;
inherit dtb; inherit dtb;
}; };

View file

@ -7,21 +7,27 @@
} : } :
let let
objcopy = "${stdenv.cc.bintools.targetPrefix}objcopy"; objcopy = "${stdenv.cc.bintools.targetPrefix}objcopy";
arch = stdenv.hostPlatform.linuxArch;
stripAndZip = ''
${objcopy} -O binary -R .reginfo -R .notes -R .note -R .comment -R .mdebug -R .note.gnu.build-id -S vmlinux.elf vmlinux.bin
rm -f vmlinux.bin.lzma ; lzma -k -z vmlinux.bin
'';
in { in {
kernel kernel
, commandLine , commandLine
, entryPoint , entryPoint
, extraName ? "" # e.g. socFamily , extraName ? "" # e.g. socFamily
, loadAddress , loadAddress
, imageFormat
, dtb ? null , dtb ? null
} : } : stdenv.mkDerivation {
stdenv.mkDerivation {
name = "kernel.image"; name = "kernel.image";
phases = [ phases = [
"preparePhase" "preparePhase"
(if dtb != null then "dtbPhase" else ":") (if commandLine != null then assert dtb != null; "mungeDtbPhase" else ":")
"buildPhase" (if imageFormat == "fit" then "buildPhaseFIT" else "buildPhaseUImage")
"installPhase" ]; "installPhase"
];
nativeBuildInputs = [ nativeBuildInputs = [
lzma lzma
dtc dtc
@ -31,35 +37,39 @@ stdenv.mkDerivation {
preparePhase = '' preparePhase = ''
cp ${kernel} vmlinux.elf; chmod +w vmlinux.elf cp ${kernel} vmlinux.elf; chmod +w vmlinux.elf
''; '';
dtbPhase = '' mungeDtbPhase = ''
dtc -I dtb -O dts -o tmp.dts ${dtb} dtc -I dtb -O dts -o tmp.dts ${dtb}
echo '/{ chosen { bootargs = ${builtins.toJSON commandLine}; }; };' >> tmp.dts echo '/{ chosen { bootargs = ${builtins.toJSON commandLine}; }; };' >> tmp.dts
dtc -I dts -O dtb -o tmp.dtb tmp.dts dtc -I dts -O dtb -o tmp.dtb tmp.dts
''; '';
buildPhase = buildPhaseUImage = ''
let arch = test -f tmp.dtb && ${objcopy} --update-section .appended_dtb=tmp.dtb vmlinux.elf || ${objcopy} --add-section .appended_dtb=tmp.dtb vmlinux.elf
# per output of "mkimage -A list". I *think* these ${stripAndZip}
# are the same as the kernel arch convention, but mkimage -A ${arch} -O linux -T kernel -C lzma -a ${loadAddress} -e ${entryPoint} -n '${lib.toUpper arch} Liminix Linux ${extraName}' -d vmlinux.bin.lzma kernel.uimage
# maybe that's coincidence
if stdenv.isMips
then "mips"
else if stdenv.isAarch64
then "arm64"
else throw "unknown arch";
in ''
${objcopy} -O binary -R .reginfo -R .notes -R .note -R .comment -R .mdebug -R .note.gnu.build-id -S vmlinux.elf vmlinux.bin
rm -f vmlinux.bin.lzma ; lzma -k -z vmlinux.bin
cat ${./kernel_fdt.its} > mkimage.its
echo '/ { images { kernel { data = /incbin/("./vmlinux.bin.lzma"); }; }; };' >> mkimage.its
echo '/ { images { kernel { load = <${loadAddress}>; }; }; };' >> mkimage.its
echo '/ { images { kernel { entry = <${entryPoint}>; }; }; };' >> mkimage.its
echo '/ { images { kernel { compression = "lzma"; }; }; };' >> mkimage.its
echo '/ { images { fdt-1 { data = /incbin/("./tmp.dtb"); }; }; }; ' >> mkimage.its
mkimage -f mkimage.its mkimage.itb
mkimage -l mkimage.itb
''; '';
buildPhaseFIT = ''
${stripAndZip}
cat ${./kernel_fdt.its} > mkimage.its
cat << _VARS >> mkimage.its
/ {
images {
kernel {
data = /incbin/("./vmlinux.bin.lzma");
load = <${loadAddress}>;
entry = <${entryPoint}>;
compression = "lzma";
};
fdt-1 { data = /incbin/("./tmp.dtb"); };
};
};
_VARS
mkimage -f mkimage.its kernel.uimage
mkimage -l kernel.uimage
'';
installPhase = '' installPhase = ''
cp mkimage.itb $out cp kernel.uimage $out
''; '';
} }