summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--boot.asm7
-rw-r--r--flake.nix9
-rw-r--r--package.nix45
4 files changed, 61 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..fcfc4a1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+result*
diff --git a/boot.asm b/boot.asm
new file mode 100644
index 0000000..ddef7eb
--- /dev/null
+++ b/boot.asm
@@ -0,0 +1,7 @@
+; yoinked from osdev.org
+hang:
+ jmp hang
+
+times 510-($-$$) db 0 ; 2 bytes less now
+db 0x55
+db 0xAA
diff --git a/flake.nix b/flake.nix
index 49d4e35..6f3484c 100644
--- a/flake.nix
+++ b/flake.nix
@@ -6,6 +6,13 @@
nixpkgs,
self,
...
- }: {
+ }: let
+ system = "x86_64-linux";
+ pkgs = nixpkgs.legacyPackages.${system};
+ in {
+ packages.${system}.default = pkgs.callPackage ./package.nix {};
+ devShells.${system}.default = pkgs.mkShell {
+ inputsFrom = [self.packages.${system}.default];
+ };
};
}
diff --git a/package.nix b/package.nix
new file mode 100644
index 0000000..150b46b
--- /dev/null
+++ b/package.nix
@@ -0,0 +1,45 @@
+{
+ stdenv,
+ nasm,
+ qemu,
+ ...
+}: let
+ bootImg = "boot";
+in
+ stdenv.mkDerivation {
+ pname = "bootler";
+ version = "0.1.0";
+ src = ./.;
+ buildPhase = ''
+ ${nasm}/bin/nasm boot.asm -o ${bootImg}
+ '';
+ installPhase = ''
+ mkdir -p $out/bin
+ cp ${bootImg} $out/bin
+
+ # create emulation binary
+ cat<<EOF>$out/bin/bootler
+ #!/usr/bin/env bash
+
+ # create temp dir
+ mkdir -p ./.bootler
+ cp $(echo $out)/bin/${bootImg} ./.bootler/${bootImg}
+ chmod a+w ./.bootler/${bootImg}
+
+ echo "press any key to continue. Qemu will clear the screen..."
+ read -s -n 1
+
+ # run image
+ ${qemu}/bin/qemu-system-x86_64 \
+ -nographic \
+ -hda ./.bootler/${bootImg}
+
+ # clean up
+ rm ./.bootler -r
+
+ EOF
+
+ chmod +x $out/bin/${bootImg}
+ chmod +x $out/bin/bootler
+ '';
+ }