summaryrefslogtreecommitdiff
path: root/bootle
diff options
context:
space:
mode:
authorandromeda <andromeda@lenovo>2026-03-06 16:53:18 +0100
committerandromeda <andromeda@lenovo>2026-03-06 16:53:18 +0100
commitd35463e1959cb64828c3166527b06e4a79cbea5e (patch)
tree65017b84447f63eaaac8326c6d18f5c5e34e6bac /bootle
parentfdf5bb9daf8574b7f993e2e38e400c35aedc3b96 (diff)
reorganise
Diffstat (limited to 'bootle')
-rw-r--r--bootle/.cargo/config.toml5
-rw-r--r--bootle/CHANGELOG.md7
-rw-r--r--bootle/Cargo.lock359
-rw-r--r--bootle/Cargo.toml17
-rw-r--r--bootle/README.md28
-rw-r--r--bootle/package.nix68
-rw-r--r--bootle/rust-toolchain.toml5
-rw-r--r--bootle/src/lib.rs55
-rw-r--r--bootle/src/linker.ld8
9 files changed, 552 insertions, 0 deletions
diff --git a/bootle/.cargo/config.toml b/bootle/.cargo/config.toml
new file mode 100644
index 0000000..74cdc7b
--- /dev/null
+++ b/bootle/.cargo/config.toml
@@ -0,0 +1,5 @@
+[build]
+target = "x86_64-unknown-none"
+rustflags = [
+ "-Crelocation-model=static"
+]
diff --git a/bootle/CHANGELOG.md b/bootle/CHANGELOG.md
new file mode 100644
index 0000000..53c30a7
--- /dev/null
+++ b/bootle/CHANGELOG.md
@@ -0,0 +1,7 @@
+# Changelog
+
+## [0.1.0] - 2026-03-05
+
+### Added
+
+- CHANGELOG.md
diff --git a/bootle/Cargo.lock b/bootle/Cargo.lock
new file mode 100644
index 0000000..f69efc7
--- /dev/null
+++ b/bootle/Cargo.lock
@@ -0,0 +1,359 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "addr2line"
+version = "0.25.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9acbfca36652500c911ddb767ed433e3ed99b032b5d935be73c6923662db1d43"
+dependencies = [
+ "cpp_demangle",
+ "fallible-iterator",
+ "gimli",
+ "memmap2",
+ "object",
+ "rustc-demangle",
+ "smallvec",
+ "typed-arena",
+]
+
+[[package]]
+name = "adler2"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
+
+[[package]]
+name = "allocator-api2"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+
+[[package]]
+name = "bootle"
+version = "0.1.0"
+dependencies = [
+ "addr2line",
+ "cfg-if",
+ "dlmalloc",
+ "fortanix-sgx-abi",
+ "getopts",
+ "hashbrown",
+ "hermit-abi",
+ "object",
+ "r-efi",
+ "r-efi-alloc",
+ "rustc-demangle",
+ "rustc-literal-escaper",
+ "unwinding",
+ "wasi",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
+
+[[package]]
+name = "cpp_demangle"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "dlmalloc"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa3a2dbee57b69fbb5dbe852fa9c0925697fb0c7fbcb1593e90e5ffaedf13d51"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "windows-sys",
+]
+
+[[package]]
+name = "equivalent"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+
+[[package]]
+name = "fallible-iterator"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
+
+[[package]]
+name = "flate2"
+version = "1.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "foldhash"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+
+[[package]]
+name = "fortanix-sgx-abi"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5efc85edd5b83e8394f4371dd0da6859dff63dd387dab8568fece6af4cde6f84"
+
+[[package]]
+name = "getopts"
+version = "0.2.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "gimli"
+version = "0.32.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7"
+dependencies = [
+ "fallible-iterator",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.15.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
+dependencies = [
+ "allocator-api2",
+ "equivalent",
+ "foldhash",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
+
+[[package]]
+name = "libc"
+version = "0.2.182"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112"
+
+[[package]]
+name = "memchr"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
+
+[[package]]
+name = "memmap2"
+version = "0.9.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
+dependencies = [
+ "adler2",
+ "simd-adler32",
+]
+
+[[package]]
+name = "object"
+version = "0.37.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03fd943161069e1768b4b3d050890ba48730e590f57e56d4aa04e7e090e61b4a"
+dependencies = [
+ "flate2",
+ "memchr",
+ "ruzstd",
+]
+
+[[package]]
+name = "r-efi"
+version = "5.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+
+[[package]]
+name = "r-efi-alloc"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc2f58ef3ca9bb0f9c44d9aa8537601bcd3df94cc9314a40178cadf7d4466354"
+dependencies = [
+ "r-efi",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f"
+
+[[package]]
+name = "rustc-literal-escaper"
+version = "0.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4ee29da77c5a54f42697493cd4c9b9f31b74df666a6c04dfc4fde77abe0438b"
+
+[[package]]
+name = "ruzstd"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01"
+dependencies = [
+ "twox-hash",
+]
+
+[[package]]
+name = "simd-adler32"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2"
+
+[[package]]
+name = "smallvec"
+version = "1.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+
+[[package]]
+name = "twox-hash"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c"
+
+[[package]]
+name = "typed-arena"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
+
+[[package]]
+name = "unicode-width"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
+
+[[package]]
+name = "unwinding"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d80f6c2bfede213d9a90b4a14f3eb99b84e33c52df6c1a15de0a100f5a88751"
+dependencies = [
+ "gimli",
+ "libc",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.1+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
diff --git a/bootle/Cargo.toml b/bootle/Cargo.toml
new file mode 100644
index 0000000..c4d5b40
--- /dev/null
+++ b/bootle/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+name = "bootle"
+version = "0.1.0"
+edition = "2024"
+
+[lib]
+crate-type = ["staticlib"]
+
+[dependencies]
+
+[profile.release]
+panic = "abort"
+opt-level = 'z'
+debug = false
+
+[profile.dev]
+panic = "abort"
diff --git a/bootle/README.md b/bootle/README.md
new file mode 100644
index 0000000..da47027
--- /dev/null
+++ b/bootle/README.md
@@ -0,0 +1,28 @@
+# bootle
+
+hobby kernel written in rust. It's just for playing around... for now :p
+
+run with `nix run git+https://git.mtgmonkey.net/andromeda/bootler#bootle`
+
+### memory map
+
+```
++------ 0x00100000 ------+
+| hardware, bios stuff |
++------ 0x00080000 ------+
+| |
+| |
++------ 0x00010200 ------+
+| kernel |
++------ 0x00010000 ------+
+| bootloader stuff |
+| includes stack, gdt, |
+| idt for the time being |
++------ 0x00000500 ------+
+| bios stuff |
++------ 0x00000000 ------+
+```
+
+---
+
+this project follows [Common Changelog](https://common-changelog.org) guidelines
diff --git a/bootle/package.nix b/bootle/package.nix
new file mode 100644
index 0000000..a5de5eb
--- /dev/null
+++ b/bootle/package.nix
@@ -0,0 +1,68 @@
+{
+ callPackage,
+ rust-bin,
+ naersk,
+ bootler,
+ qemu,
+ ...
+}: let
+ rust-toolchain = rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
+ naersk' = callPackage naersk {
+ cargo = rust-toolchain;
+ rustc = rust-toolchain;
+ clippy = rust-toolchain;
+ };
+in (naersk'.buildPackage {
+ src = ./.;
+
+ # deps for rust-src
+ additionalCargoLock = "${rust-toolchain.availableComponents.rust-src}/lib/rustlib/src/rust/library/Cargo.lock";
+
+ # just library build
+ copyBins = false;
+ copyLibs = true;
+ release = true;
+
+ # build std
+ cargoBuildOptions = x:
+ x
+ ++ [
+ "-Zbuild-std"
+ ];
+
+ postInstall = ''
+ ld --oformat binary \
+ -o kernel.bin \
+ -T src/linker.ld \
+ -e _start \
+ target/x86_64-unknown-none/release/libbootle.a
+
+ dd if=/dev/zero of=disk bs=512 count=2
+ dd if=${bootler}/bin/boot.bin of=disk conv=notrunc
+ dd if=kernel.bin of=disk bs=512 seek=1 conv=notrunc
+
+ mkdir -p $out/lib
+ mkdir -p $out/bin
+
+ cat<<EOF>$out/bin/bootle
+ #!/usr/bin/env bash
+
+ mkdir -p ./.bootle
+ cp $(echo $out)/bin/disk ./.bootle/disk
+ chmod a+w ./.bootle/disk
+
+ ${qemu}/bin/qemu-system-x86_64 \
+ -nographic \
+ -drive file=./.bootle/disk,format=raw,index=0,media=disk
+
+ rm ./.bootle -r
+
+ EOF
+
+ chmod +x $out/bin/bootle
+
+ cp target/x86_64-unknown-none/release/libbootle.a $out/lib
+ cp kernel.bin $out/bin
+ cp disk $out/bin
+ '';
+})
diff --git a/bootle/rust-toolchain.toml b/bootle/rust-toolchain.toml
new file mode 100644
index 0000000..22068c5
--- /dev/null
+++ b/bootle/rust-toolchain.toml
@@ -0,0 +1,5 @@
+[toolchain]
+channel = "nightly"
+components = ["rust-src"]
+targets = ["x86_64-unknown-none"]
+profile = "default"
diff --git a/bootle/src/lib.rs b/bootle/src/lib.rs
new file mode 100644
index 0000000..adc1aab
--- /dev/null
+++ b/bootle/src/lib.rs
@@ -0,0 +1,55 @@
+#![no_std]
+#![no_main]
+
+use core::panic::PanicInfo;
+
+#[unsafe(no_mangle)]
+pub extern "C" fn _start() -> ! {
+ welcome_serial();
+ halt()
+}
+
+fn print_serial(s: &str) {
+ let mut bytes = s.bytes();
+ while let Some(b) = bytes.next() {
+ unsafe {
+ core::arch::asm!(
+ "out dx, al"
+ , in("al") b
+ )
+ };
+ }
+}
+
+fn println_serial(s: &str) {
+ print_serial(s);
+ print_serial("\n");
+}
+
+fn welcome_serial() {
+ print_serial(ANSI_PINK);
+ println_serial("\nWelcome to Bootle OS");
+ println_serial("All code GPL licensed and freely available on git.mtgmonkey.net");
+ print_serial("Enjoy your time! Press ");
+ print_serial(ANSI_RED);
+ print_serial("ctrl+a x");
+ print_serial(ANSI_PINK);
+ println_serial(" to escape Qemu");
+ print_serial(ANSI_CLEAR);
+}
+
+#[panic_handler]
+fn panic(_: &PanicInfo) -> ! {
+ print_serial("panicked");
+ halt()
+}
+
+fn halt() -> ! {
+ unsafe { core::arch::asm!("hlt") };
+ halt()
+}
+
+const ANSI_CLEAR: &str = "\x1b[0m";
+const ANSI_RED: &str = "\x1b[31m";
+const ANSI_PINK: &str = "\x1b[35m";
+const ANSI_GREEN: &str = "\x1b[32m";
diff --git a/bootle/src/linker.ld b/bootle/src/linker.ld
new file mode 100644
index 0000000..b523bc5
--- /dev/null
+++ b/bootle/src/linker.ld
@@ -0,0 +1,8 @@
+SECTIONS
+{
+ . = 0x00010000;
+ .text : {
+ *(.text._start)
+ *(.text*)
+ }
+}