commit - c40788ab652e5648301786507982a694873230ff
commit + 650c79ed1d1a5f16ff3ad46e4a32c1a75d608124
blob - 5f4ec049e82ced20821de85894efe224255e3790
blob + 1825aaae6f72bcd7762657fa9c98ad36c8adfb53
--- .cargo/config.toml
+++ .cargo/config.toml
[build]
target = ["x86_64-unknown-none"]
+
+[target.x86_64-unknown-none]
+rustflags = ["-C", "relocation-model=static"]
blob - ea8c4bf7f35f6f77f75d92ad8ce8349f6e81ddba
blob + f90dc2df8c995332109a36872b9e98cb433a197f
--- .gitignore
+++ .gitignore
/target
+/limine
+/iso_root
+*.iso
blob - 76ef8853b9a6018a258a4674fd89a4c487ce98e7
blob + 21ac2ff11eee9b58a875b5347ecf8dd1d0a14a22
--- Makefile
+++ Makefile
-.PHONY: all check build build-release test fmt clippy lint doc clean install run
+.PHONY: all build build-release run clean fmt clippy lint iso
+KERNEL := target/x86_64-unknown-none/debug/omk
+ISO := omk.iso
+ISO_DIR := iso_root
+
all: run
-check:
- cargo check
-
build:
cargo build
build-release:
- cargo build
+ cargo build --release
-test:
- cargo test
+limine:
+ git clone https://github.com/limine-bootloader/limine.git \
+ --branch=v8.x-binary --depth=1
+ $(MAKE) -C limine
+iso: build limine
+ rm -rf $(ISO_DIR)
+ mkdir -p $(ISO_DIR)/boot/limine $(ISO_DIR)/EFI/BOOT
+ cp $(KERNEL) $(ISO_DIR)/boot/kernel.elf
+ cp limine.conf $(ISO_DIR)/boot/limine/
+ cp limine/limine-bios.sys $(ISO_DIR)/boot/limine/
+ cp limine/limine-bios-cd.bin $(ISO_DIR)/boot/limine/
+ cp limine/limine-uefi-cd.bin $(ISO_DIR)/boot/limine/
+ cp limine/BOOTX64.EFI $(ISO_DIR)/EFI/BOOT/
+ cp limine/BOOTIA32.EFI $(ISO_DIR)/EFI/BOOT/
+ xorriso -as mkisofs -R \
+ -b boot/limine/limine-bios-cd.bin \
+ -no-emul-boot -boot-load-size 4 -boot-info-table \
+ --efi-boot boot/limine/limine-uefi-cd.bin \
+ -efi-boot-part --efi-boot-image --no-emul-boot \
+ --protective-msdos-label \
+ $(ISO_DIR) -o $(ISO)
+ ./limine/limine bios-install $(ISO)
+
+run: iso
+ qemu-system-x86_64 \
+ -cdrom $(ISO) \
+ -serial stdio \
+ -no-reboot \
+ -no-shutdown
+
fmt:
cargo fmt
cargo fmt --check
cargo clippy --all-features -- -D warnings
-doc:
- cargo doc
-
clean:
cargo clean
-
-install:
- cargo install --path .
-
-run:
- cargo run
+ rm -rf $(ISO_DIR) $(ISO)
blob - 1de38b2ec75bb3384096a12bc235782494d890f0
blob + 6399dd32f11fba63858dfb26ff9c73cbc3e9ae36
--- build.rs
+++ build.rs
fn main() {
let arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap();
+ println!("cargo:rustc-link-arg=--no-dynamic-linker");
+ println!("cargo:rustc-link-arg=-static");
println!("cargo:rustc-link-arg=-Tlinker-{arch}.ld");
println!("cargo:rerun-if-changed=linker-{arch}.ld");
}
blob - /dev/null
blob + 3d1b299785984668ffa781ce54b781c5411277e0 (mode 644)
--- /dev/null
+++ limine.conf
+timeout: 0
+serial: yes
+
+/Olivia MicroKernel (OMK)
+ protocol: limine
+ path: boot():/boot/kernel.elf
blob - 79fda87a4d008e173cc879d522d7a9ce45cda1a1
blob + fb74be1776407495f4175388b8c3302e8a839e4e
--- src/main.rs
+++ src/main.rs
#![no_std]
#![no_main]
+use core::arch::asm;
+
use limine::{BaseRevision, RequestsStartMarker, RequestsEndMarker};
#[used]
#[unsafe(no_mangle)]
pub unsafe extern "C" fn kmain() -> ! {
+ serial_init();
+ serial_print("OMK: Olivia MicroKernel\n");
+ serial_print("ALIVE\n");
+
+ vga_write("ALIVE", 0x0F);
+
loop {}
}
loop {}
}
+const COM1: u16 = 0x3F8;
+
+unsafe fn outb(port: u16, val: u8) {
+ unsafe {
+ asm!("out dx, al", in("dx") port, in("al") val);
+ }
+}
+
+unsafe fn inb(port: u16) -> u8 {
+ let val: u8;
+ unsafe {
+ asm!("in al, dx", out("al") val, in("dx") port);
+ }
+ val
+}
+
+fn serial_init() {
+ unsafe {
+ outb(COM1 + 1, 0x00);
+ outb(COM1 + 3, 0x80);
+ outb(COM1 + 0, 0x03);
+ outb(COM1 + 1, 0x00);
+ outb(COM1 + 3, 0x03);
+ outb(COM1 + 2, 0xC7);
+ outb(COM1 + 4, 0x0B);
+ }
+}
+
+fn serial_putc(c: u8) {
+ while unsafe { inb(COM1 + 5) } & 0x20 == 0 {}
+ unsafe {
+ outb(COM1, c);
+ }
+}
+
+fn serial_print(s: &str) {
+ for b in s.bytes() {
+ if b == b'\n' {
+ serial_putc(b'\r');
+ }
+ serial_putc(b);
+ }
+}
+
+fn vga_write(s: &str, color: u8) {
+ let vga = 0xb8000 as *mut u16;
+ for (i, b) in s.bytes().enumerate() {
+ unsafe {
+ vga.add(i).write_volatile(
+ (color as u16) << 8 | b as u16
+ );
+ }
+ }
+}
+
#[used]
#[unsafe(link_section = ".requests_end")]
pub static REQUEST_END: RequestsEndMarker = RequestsEndMarker::new();