rewrite phram boot to use correct sizes and offsets

This commit is contained in:
Daniel Barlow 2023-02-11 13:10:38 +00:00
parent 1a08aaad01
commit dd8c8edd9c
8 changed files with 64 additions and 30 deletions

View file

@ -1,7 +1,6 @@
{ {
device device
, liminix-config ? <liminix-config> , liminix-config ? <liminix-config>
, phram ? false
, nixpkgs ? <nixpkgs> , nixpkgs ? <nixpkgs>
}: }:
@ -18,7 +17,6 @@ let
liminix-config liminix-config
./modules/s6 ./modules/s6
./modules/users.nix ./modules/users.nix
(if phram then ./modules/phram.nix else (args: {}))
./modules/outputs.nix ./modules/outputs.nix
] pkgs; ] pkgs;

View file

@ -35,11 +35,15 @@
}; };
in { in {
device = { device = {
defaultOutput = "directory"; defaultOutput = "tftproot";
loadAddress = "0x80060000"; loadAddress = "0x80060000";
entryPoint = "0x80060000"; entryPoint = "0x80060000";
}; };
boot.tftp = {
loadAddress = "0x00A00000";
serverip = "192.168.8.148";
ipaddr = "192.168.8.251";
};
kernel = { kernel = {
src = pkgs.pkgsBuildBuild.fetchurl { src = pkgs.pkgsBuildBuild.fetchurl {
name = "linux.tar.gz"; name = "linux.tar.gz";

View file

@ -22,7 +22,7 @@
}; };
in { in {
device = { device = {
defaultOutput = "directory"; defaultOutput = "tftproot";
loadAddress = "0x80000000"; loadAddress = "0x80000000";
entryPoint = "0x80000000"; entryPoint = "0x80000000";
}; };

View file

@ -22,7 +22,7 @@
}; };
in { in {
device = { device = {
defaultOutput = "directory"; defaultOutput = "tftproot";
loadAddress = "0x80000000"; loadAddress = "0x80000000";
entryPoint = "0x80000000"; entryPoint = "0x80000000";
}; };

View file

@ -41,6 +41,6 @@
SERIAL_8250_CONSOLE= "y"; SERIAL_8250_CONSOLE= "y";
}; };
}; };
device.defaultOutput = "directory"; device.defaultOutput = "vmroot";
}; };
} }

View file

@ -41,35 +41,16 @@ in
dd if=${uimage} of=$out/firmware.bin bs=128k conv=sync dd if=${uimage} of=$out/firmware.bin bs=128k conv=sync
dd if=${squashfs} of=$out/firmware.bin bs=128k conv=sync,nocreat,notrunc oflag=append dd if=${squashfs} of=$out/firmware.bin bs=128k conv=sync,nocreat,notrunc oflag=append
''; '';
boot-scr =
let
inherit (pkgs.lib.trivial) toHexString;
uimageStart = 10485760; # 0xa00000
squashfsStart = uimageStart + 4 * 1024 * 1024;
squashfsSize = 8;
cmd = "mtdparts=phram0:${toString squashfsSize}M(nix) phram.phram=phram0,0x${toHexString squashfsStart},${toString squashfsSize}Mi memmap=${toString squashfsSize}M\$0x${toHexString squashfsStart} root=1f00";
in
pkgs.buildPackages.writeScript "firmware.bin" ''
setenv serverip 192.168.8.148
setenv ipaddr 192.168.8.251
setenv bootargs '${concatStringsSep " " config.boot.commandLine} ${cmd}'
tftp 0x8${toHexString uimageStart} result/uimage ; tftp 0x8${toHexString squashfsStart} result/squashfs
bootm 0x${toHexString uimageStart}
'';
directory = pkgs.runCommand "liminix" {} ('' vmroot = pkgs.runCommand "qemu" {} ''
mkdir $out mkdir $out
cd $out cd $out
ln -s ${squashfs} squashfs ln -s ${squashfs} squashfs
ln -s ${kernel} vmlinux ln -s ${kernel} vmlinux
ln -s ${manifest} manifest ln -s ${manifest} manifest
ln -s ${kernel.headers} build ln -s ${kernel.headers} build
'' + '';
(if config.device.loadAddress != null then
''
ln -s ${uimage} uimage
ln -s ${boot-scr} flash.scr
'' else ""));
# this exists so that you can run "nix-store -q --tree" on it and find # this exists so that you can run "nix-store -q --tree" on it and find
# out what's in the image, which is nice if it's unexpectedly huge # out what's in the image, which is nice if it's unexpectedly huge
manifest = writeText "manifest.json" (builtins.toJSON config.filesystem.contents); manifest = writeText "manifest.json" (builtins.toJSON config.filesystem.contents);

View file

@ -1,8 +1,24 @@
{ {
config config
, pkgs
, lib
, ... , ...
}: }:
{ let
inherit (lib) mkOption types concatStringsSep;
cfg = config.boot.tftp;
in {
options = {
boot = {
tftp = {
loadAddress = mkOption { type = types.str; };
# These names match the uboot environment variables. I reserve
# the right to change them if I think of better ones.
ipaddr = mkOption { type = types.str; };
serverip = mkOption { type = types.str; };
};
};
};
config = { config = {
kernel = { kernel = {
config = { config = {
@ -25,5 +41,37 @@
}; };
}; };
outputs.tftproot =
let o = config.outputs; in
pkgs.runCommand "tftproot" {} ''
mkdir $out
cd $out
ln -s ${o.squashfs} squashfs
ln -s ${o.kernel} vmlinux
ln -s ${o.manifest} manifest
ln -s ${o.kernel.headers} build
ln -s ${o.uimage} uimage
ln -s ${o.boot-scr} flash.scr
'';
outputs.boot-scr =
let
inherit (pkgs.lib.trivial) toHexString;
in
pkgs.buildPackages.runCommand "" {} ''
uimageSize=$(($(stat -L -c %s ${config.outputs.uimage}) + 0x1000 &(~0xfff)))
squashfsStart=0x$(printf %x $((${cfg.loadAddress} + $uimageSize)))
squashfsBytes=$(($(stat -L -c %s ${config.outputs.squashfs}) + 0x100000 &(~0xfffff)))
squashfsMb=$(($squashfsBytes >> 20))
cmd="mtdparts=phram0:''${squashfsMb}M(nix) phram.phram=phram0,''${squashfsStart},''${squashfsMb}Mi memmap=''${squashfsMb}M\$''${squashfsStart} root=1f00";
cat > $out << EOF
setenv serverip ${cfg.serverip}
setenv ipaddr ${cfg.ipaddr}
setenv bootargs '${concatStringsSep " " config.boot.commandLine} $cmd'
tftp 0x$(printf %x ${cfg.loadAddress}) result/uimage ; tftp 0x$(printf %x $squashfsStart) result/squashfs
bootm 0x$(printf %x ${cfg.loadAddress})
EOF
'';
}; };
} }

View file

@ -3,6 +3,9 @@ let
inherit (pkgs.liminix.networking) interface address udhcpc odhcpc route; inherit (pkgs.liminix.networking) interface address udhcpc odhcpc route;
inherit (pkgs.liminix.services) oneshot longrun bundle target; inherit (pkgs.liminix.services) oneshot longrun bundle target;
in rec { in rec {
imports = [
./modules/phram.nix
];
services.loopback = services.loopback =
let iface = interface { type = "loopback"; device = "lo";}; let iface = interface { type = "loopback"; device = "lo";};
in bundle { in bundle {