diff --git a/boot1/asm/prelude.s b/boot1/asm/prelude.s index b167a28..928da43 100644 --- a/boot1/asm/prelude.s +++ b/boot1/asm/prelude.s @@ -1,7 +1,12 @@ %include "defines.s" -[org BOOT1_LOADPOINT] [bits 16] +section .prelude + +extern boot1_bin_len + +global prelude prelude: hlt + dd boot1_bin_len diff --git a/boot1/build.rs b/boot1/build.rs index f226a46..9d8ead6 100644 --- a/boot1/build.rs +++ b/boot1/build.rs @@ -20,24 +20,31 @@ fn main() { } fn emit_link_args() { - println!("cargo::rustc-link-arg=-Tlink.ld"); + let linker_script_path = "link.ld"; + println!("cargo::rustc-link-arg=-T{}", linker_script_path); + rerun_if_changed(linker_script_path.as_ref()); } fn rerun_if_changed(path: &Path) { - if let Some(path_str) = path.to_str() { - println!("cargo::rerun-if-changed={}", path_str); - } - else { - eprintln!("invalid unicode file path"); - } + let path_str = path.to_str() + .expect("expected path to be valid utf8"); + println!("cargo::rerun-if-changed={}", path_str); +} + +fn link_obj(path: &Path) { + let path_str = path.to_str() + .expect("expected path to be valid utf8"); + println!("cargo::rustc-link-arg={}", path_str); } fn build_asm(nasm: &Nasm, out_dir: &Path) { + let prelude_obj_path = out_dir.join("prelude.o"); nasm.assemble( - &out_dir.join("prelude.bin"), + &prelude_obj_path, &["asm/prelude.s".as_ref()], &["../include".as_ref()], ).unwrap(); + link_obj(&prelude_obj_path); } struct Nasm { @@ -57,9 +64,9 @@ impl Nasm { let mut cmd = Command::new(&self.bin_path); cmd + .arg("-Werror") .arg("-f") - .arg("bin") - .arg("-Werror"); + .arg("elf"); for include in includes { let mut buf = OsString::new(); diff --git a/boot1/link.ld b/boot1/link.ld index c77e0b0..52c00d2 100644 --- a/boot1/link.ld +++ b/boot1/link.ld @@ -1,10 +1,34 @@ OUTPUT_FORMAT("binary") -. = 0x9000; -SECTIONS { - .text : { *(.text); *(.text.*) } - .data : { *(.data); *(.data.*) } - .bss : { *(.bss); *(.bss.*) } - .rodata : { *(.rodata); *(.rodata.*) } -} +. = 0x8200; +SECTIONS { + .prelude : { + *(.prelude) + } + + .text : { + *(.text) + *(.text.*) + } + + .data : { + *(.data) + *(.data.*) + } + + .bss : { + *(.bss) + *(.bss.*) + } + + .rodata : { + *(.rodata) + *(.rodata.*) + } + + /* Define a symbol for the total length of the binary, so the prelude knows how many blocks to + * load from disk. + */ + boot1_bin_len = . - 0x8200; +} diff --git a/boot1/src/main.rs b/boot1/src/main.rs index b8e0adc..f74d198 100644 --- a/boot1/src/main.rs +++ b/boot1/src/main.rs @@ -10,6 +10,10 @@ const VGA_ADDR: usize = 0xb8000; const STR: &[u8] = b"the quick brown fox jumps over the lazy dog"; +extern "C" { + fn prelude() -> !; +} + #[panic_handler] fn panic(_info: &PanicInfo) -> ! { hlt() @@ -43,7 +47,8 @@ pub extern "C" fn _start() -> ! { vga_buf[0] = 0x1f02; //smiley - hlt() + // hlt() + unsafe { prelude() }; } #[inline]