Commit Diff


commit - 90b4b8d036e3b3717609c3b4654d56c475d05bda
commit + c40788ab652e5648301786507982a694873230ff
blob - 856b9c1018b991003a26beb8e1ea058bfd8c2288
blob + 4824e4083af8142b290a4dead4a079c0d60d0198
--- Cargo.lock
+++ Cargo.lock
@@ -3,5 +3,14 @@
 version = 4
 
 [[package]]
+name = "limine"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90b240f611eba0b43bf3e97478d87f12322c6c0f540bdad885c3e8c4a0d57333"
+
+[[package]]
 name = "omk"
 version = "0.1.0"
+dependencies = [
+ "limine",
+]
blob - 6d66e15b41380d748984bd1dbf817ec21392faa7
blob + 5de04df54721bbc7878b3c4d6a2aef9c405e99eb
--- Cargo.toml
+++ Cargo.toml
@@ -4,4 +4,9 @@ version = "0.1.0"
 edition = "2024"
 authors = ["Murilo Ijanc' <murilo@ijanc.org>"]
 
+[profile.dev]
+panic = "abort"
+lto = false
+
 [dependencies]
+limine = "0.6.3"
blob - /dev/null
blob + 1de38b2ec75bb3384096a12bc235782494d890f0 (mode 644)
--- /dev/null
+++ build.rs
@@ -0,0 +1,22 @@
+// vim: set tw=79 cc=80 ts=4 sw=4 sts=4 et :
+//
+// Copyright (c) 2025-2026 Murilo Ijanc' <murilo@ijanc.org>
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+//
+
+fn main() {
+    let arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap();
+    println!("cargo:rustc-link-arg=-Tlinker-{arch}.ld");
+    println!("cargo:rerun-if-changed=linker-{arch}.ld");
+}
blob - f1fac6b26e69c562490f924ae921d90a60b15d8c
blob + 79fda87a4d008e173cc879d522d7a9ce45cda1a1
--- src/main.rs
+++ src/main.rs
@@ -18,7 +18,26 @@
 #![no_std]
 #![no_main]
 
+use limine::{BaseRevision, RequestsStartMarker, RequestsEndMarker};
+
+#[used]
+#[unsafe(link_section = ".requests_start")]
+pub static REQUEST_START: RequestsStartMarker = RequestsStartMarker::new();
+
+#[used]
+#[unsafe(link_section = ".requests")]
+pub static BASE_REVISION: BaseRevision = BaseRevision::new();
+
+#[unsafe(no_mangle)]
+pub unsafe extern "C" fn kmain() -> ! {
+    loop {}
+}
+
 #[panic_handler]
 fn panic(_info: &core::panic::PanicInfo) -> ! {
     loop {}
 }
+
+#[used]
+#[unsafe(link_section = ".requests_end")]
+pub static REQUEST_END: RequestsEndMarker = RequestsEndMarker::new();
blob - /dev/null
blob + d972c8dbab331b3269e487da85e1236584c1ceae (mode 644)
--- /dev/null
+++ linker-x86_64.ld
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2025-2026 Murilo Ijanc' <murilo@ijanc.org>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+OUTPUT_FORMAT(elf64-x86-64)
+
+ENTRY(kmain)
+
+PHDRS
+{
+    text    PT_LOAD;
+    rodata  PT_LOAD;
+    data    PT_LOAD;
+}
+
+SECTIONS
+{
+    . = 0xFFFFFFFF80000000;      /* Limine topmost 2GB of address space */
+
+    .text : {
+        *(.text .text.*)
+    } :text
+
+    . = ALIGN(CONSTANT(MAXPAGESIZE));
+
+    .rodata : {
+        *(.rodata .rodata.*)
+    } :rodata
+
+    . = ALIGN(CONSTANT(MAXPAGESIZE));
+
+    .data : {
+        *(.data .data.*)
+
+        KEEP(*(.requests_start))
+        KEEP(*(.requests))
+        KEEP(*(.requests_end))
+    } :data
+
+    .bss : {
+        *(.bss .bss.*)
+        *(COMMON)
+    } :data
+
+    /DISCARD/ : {
+        *(.eh_frame*)
+        *(.note .note.*)
+    }
+}