aboutsummaryrefslogtreecommitdiff
path: root/mirai.old/common
diff options
context:
space:
mode:
Diffstat (limited to 'mirai.old/common')
-rw-r--r--mirai.old/common/constants/ahci.zig46
-rw-r--r--mirai.old/common/constants/akiba.zig9
-rw-r--r--mirai.old/common/constants/ascii.zig10
-rw-r--r--mirai.old/common/constants/ata.zig33
-rw-r--r--mirai.old/common/constants/attachment.zig8
-rw-r--r--mirai.old/common/constants/colors.zig14
-rw-r--r--mirai.old/common/constants/elf.zig18
-rw-r--r--mirai.old/common/constants/fs.zig46
-rw-r--r--mirai.old/common/constants/gdt.zig7
-rw-r--r--mirai.old/common/constants/heap.zig6
-rw-r--r--mirai.old/common/constants/idt.zig10
-rw-r--r--mirai.old/common/constants/interrupts.zig39
-rw-r--r--mirai.old/common/constants/invocations.zig25
-rw-r--r--mirai.old/common/constants/kata.zig27
-rw-r--r--mirai.old/common/constants/keyboard.zig11
-rw-r--r--mirai.old/common/constants/memory.zig90
-rw-r--r--mirai.old/common/constants/msr.zig20
-rw-r--r--mirai.old/common/constants/paging.zig11
-rw-r--r--mirai.old/common/constants/pci.zig42
-rw-r--r--mirai.old/common/constants/pic.zig20
-rw-r--r--mirai.old/common/constants/pit.zig20
-rw-r--r--mirai.old/common/constants/pmm.zig14
-rw-r--r--mirai.old/common/constants/ports.zig32
-rw-r--r--mirai.old/common/constants/psf.zig7
-rw-r--r--mirai.old/common/constants/serial.zig3
-rw-r--r--mirai.old/common/constants/time.zig9
-rw-r--r--mirai.old/common/constants/vga.zig3
-rw-r--r--mirai.old/common/constants/video.zig6
-rw-r--r--mirai.old/common/errors/fs.zig15
-rw-r--r--mirai.old/common/errors/io.zig15
-rw-r--r--mirai.old/common/errors/kata.zig9
-rw-r--r--mirai.old/common/errors/memory.zig10
-rw-r--r--mirai.old/common/limits/ahci.zig8
-rw-r--r--mirai.old/common/limits/ata.zig4
-rw-r--r--mirai.old/common/limits/attachment.zig3
-rw-r--r--mirai.old/common/limits/boot.zig7
-rw-r--r--mirai.old/common/limits/crimson.zig6
-rw-r--r--mirai.old/common/limits/fs.zig6
-rw-r--r--mirai.old/common/limits/io.zig6
-rw-r--r--mirai.old/common/limits/kata.zig8
-rw-r--r--mirai.old/common/limits/keyboard.zig3
-rw-r--r--mirai.old/common/limits/memory.zig27
-rw-r--r--mirai.old/common/limits/pci.zig6
-rw-r--r--mirai.old/common/limits/terminal.zig6
-rw-r--r--mirai.old/common/limits/vga.zig4
45 files changed, 729 insertions, 0 deletions
diff --git a/mirai.old/common/constants/ahci.zig b/mirai.old/common/constants/ahci.zig
new file mode 100644
index 0000000..c37c668
--- /dev/null
+++ b/mirai.old/common/constants/ahci.zig
@@ -0,0 +1,46 @@
+//! AHCI constants
+
+// HBA port command bits
+pub const PORT_CMD_ST: u32 = 0x0001;
+pub const PORT_CMD_FRE: u32 = 0x0010;
+pub const PORT_CMD_FR: u32 = 0x4000;
+pub const PORT_CMD_CR: u32 = 0x8000;
+
+// Global HBA control
+pub const GHC_AE: u32 = 1 << 31;
+
+// Port interrupt status
+pub const PxIS_TFES: u32 = 1 << 30;
+
+// FIS types
+pub const FIS_TYPE_REG_H2D: u8 = 0x27;
+pub const FIS_TYPE_REG_D2H: u8 = 0x34;
+pub const FIS_TYPE_DMA_ACT: u8 = 0x39;
+pub const FIS_TYPE_DMA_SETUP: u8 = 0x41;
+pub const FIS_TYPE_DATA: u8 = 0x46;
+pub const FIS_TYPE_BIST: u8 = 0x58;
+pub const FIS_TYPE_PIO_SETUP: u8 = 0x5F;
+pub const FIS_TYPE_DEV_BITS: u8 = 0xA1;
+
+// SSTS detection
+pub const SSTS_DET_PRESENT: u8 = 3;
+pub const SSTS_IPM_ACTIVE: u8 = 1;
+
+// Port types
+pub const PORT_TYPE_NONE: u32 = 0;
+pub const PORT_TYPE_SATA: u32 = 1;
+pub const PORT_TYPE_ATAPI: u32 = 2;
+pub const PORT_TYPE_SEMB: u32 = 3;
+pub const PORT_TYPE_PM: u32 = 4;
+
+// Port offsets
+pub const PORT_OFFSET_BASE: usize = 0x100;
+
+// BAR mask
+pub const BAR_MASK: u32 = 0xFFFFFFF0;
+
+// PRDT interrupt bit
+pub const PRDT_INTERRUPT: u32 = 1 << 31;
+
+// PIC end of interrupt
+pub const PIC_EOI: u8 = 0x20;
diff --git a/mirai.old/common/constants/akiba.zig b/mirai.old/common/constants/akiba.zig
new file mode 100644
index 0000000..b1ac359
--- /dev/null
+++ b/mirai.old/common/constants/akiba.zig
@@ -0,0 +1,9 @@
+//! Akiba executable format constants
+
+pub const MAGIC = [8]u8{ 'A', 'K', 'I', 'B', 'A', 'E', 'L', 'F' };
+pub const VERSION: u32 = 1;
+
+pub const TYPE_CLI: u32 = 0;
+pub const TYPE_GUI: u32 = 1;
+pub const TYPE_SERVICE: u32 = 2;
+pub const TYPE_LIBRARY: u32 = 3;
diff --git a/mirai.old/common/constants/ascii.zig b/mirai.old/common/constants/ascii.zig
new file mode 100644
index 0000000..73ece6b
--- /dev/null
+++ b/mirai.old/common/constants/ascii.zig
@@ -0,0 +1,10 @@
+//! ASCII character constants
+
+pub const NEWLINE: u8 = '\n';
+pub const BACKSPACE: u8 = 0x08;
+pub const TAB: u8 = '\t';
+pub const SPACE: u8 = ' ';
+pub const CARRIAGE_RETURN: u8 = '\r';
+
+pub const PRINTABLE_START: u8 = 0x20;
+pub const PRINTABLE_END: u8 = 0x7E;
diff --git a/mirai.old/common/constants/ata.zig b/mirai.old/common/constants/ata.zig
new file mode 100644
index 0000000..2b948ff
--- /dev/null
+++ b/mirai.old/common/constants/ata.zig
@@ -0,0 +1,33 @@
+//! ATA constants
+
+// Commands
+pub const CMD_READ_SECTORS: u8 = 0x20;
+pub const CMD_WRITE_SECTORS: u8 = 0x30;
+pub const CMD_READ_DMA_EX: u8 = 0x25;
+pub const CMD_WRITE_DMA_EX: u8 = 0x35;
+pub const CMD_IDENTIFY: u8 = 0xEC;
+
+// Status register bits
+pub const STATUS_ERR: u8 = 0x01;
+pub const STATUS_DRQ: u8 = 0x08;
+pub const STATUS_SRV: u8 = 0x10;
+pub const STATUS_DF: u8 = 0x20;
+pub const STATUS_RDY: u8 = 0x40;
+pub const STATUS_BSY: u8 = 0x80;
+
+// Device signatures
+pub const SIG_ATA: u32 = 0x00000101;
+pub const SIG_ATAPI: u32 = 0xEB140101;
+pub const SIG_SEMB: u32 = 0xC33C0101;
+pub const SIG_PM: u32 = 0x96690101;
+
+// Port registers (primary)
+pub const PRIMARY_DATA: u16 = 0x1F0;
+pub const PRIMARY_ERROR: u16 = 0x1F1;
+pub const PRIMARY_SECTOR_COUNT: u16 = 0x1F2;
+pub const PRIMARY_LBA_LOW: u16 = 0x1F3;
+pub const PRIMARY_LBA_MID: u16 = 0x1F4;
+pub const PRIMARY_LBA_HIGH: u16 = 0x1F5;
+pub const PRIMARY_DRIVE_SELECT: u16 = 0x1F6;
+pub const PRIMARY_STATUS: u16 = 0x1F7;
+pub const PRIMARY_COMMAND: u16 = 0x1F7;
diff --git a/mirai.old/common/constants/attachment.zig b/mirai.old/common/constants/attachment.zig
new file mode 100644
index 0000000..c3f4377
--- /dev/null
+++ b/mirai.old/common/constants/attachment.zig
@@ -0,0 +1,8 @@
+//! Attachment flags
+
+pub const VIEW_ONLY: u32 = 0x01;
+pub const MARK_ONLY: u32 = 0x02;
+pub const BOTH: u32 = 0x03;
+pub const CREATE: u32 = 0x0100;
+pub const CLEAR: u32 = 0x0200;
+pub const EXTEND: u32 = 0x0400;
diff --git a/mirai.old/common/constants/colors.zig b/mirai.old/common/constants/colors.zig
new file mode 100644
index 0000000..a959663
--- /dev/null
+++ b/mirai.old/common/constants/colors.zig
@@ -0,0 +1,14 @@
+//! Display colors
+
+pub const AKIBA_PINK: u32 = 0x00FF6B9D;
+
+pub const WHITE: u32 = 0x00FFFFFF;
+pub const BLACK: u32 = 0x00000000;
+pub const RED: u32 = 0x00FF0000;
+pub const GREEN: u32 = 0x0000FF00;
+pub const BLUE: u32 = 0x000000FF;
+pub const YELLOW: u32 = 0x00FFFF00;
+pub const CYAN: u32 = 0x0000FFFF;
+pub const MAGENTA: u32 = 0x00FF00FF;
+pub const GRAY: u32 = 0x00808080;
+pub const CRIMSON: u32 = 0x00DC143C;
diff --git a/mirai.old/common/constants/elf.zig b/mirai.old/common/constants/elf.zig
new file mode 100644
index 0000000..877d896
--- /dev/null
+++ b/mirai.old/common/constants/elf.zig
@@ -0,0 +1,18 @@
+//! ELF format constants
+
+pub const MAGIC = [4]u8{ 0x7F, 'E', 'L', 'F' };
+
+pub const CLASS_64: u8 = 2;
+pub const DATA_LSB: u8 = 1;
+
+pub const TYPE_EXEC: u16 = 2;
+pub const TYPE_DYN: u16 = 3;
+
+pub const PT_NULL: u32 = 0;
+pub const PT_LOAD: u32 = 1;
+pub const PT_DYNAMIC: u32 = 2;
+pub const PT_INTERP: u32 = 3;
+
+pub const PF_X: u32 = 1;
+pub const PF_W: u32 = 2;
+pub const PF_R: u32 = 4;
diff --git a/mirai.old/common/constants/fs.zig b/mirai.old/common/constants/fs.zig
new file mode 100644
index 0000000..7c68e45
--- /dev/null
+++ b/mirai.old/common/constants/fs.zig
@@ -0,0 +1,46 @@
+//! Filesystem constants
+
+// Sector and cluster
+pub const SECTOR_SIZE: usize = 512;
+pub const SECTOR_ALIGN: u8 = 16;
+
+// AFS signatures
+pub const AFS_SIGNATURE = "AKIBAFS!";
+pub const AFS_BOOT_SIG: u16 = 0xAA55;
+
+// AFS entry types
+pub const ENTRY_TYPE_END: u8 = 0x00;
+pub const ENTRY_TYPE_UNIT: u8 = 0x01;
+pub const ENTRY_TYPE_STACK: u8 = 0x02;
+
+// AFS permissions
+pub const PERM_OWNER: u8 = 1;
+pub const PERM_WORLD: u8 = 2;
+pub const PERM_READ_ONLY: u8 = 3;
+
+// AFS cluster markers
+pub const CLUSTER_FREE: u32 = 0x00000000;
+pub const CLUSTER_END: u32 = 0xFFFFFFFF;
+pub const CLUSTER_MIN: u32 = 2;
+
+// AFS limits
+pub const MAX_IDENTITY_LEN: usize = 255;
+pub const MAX_OWNER_NAME_LEN: usize = 64;
+pub const MAX_LOCATION_LENGTH: usize = 256;
+pub const PARENT_CACHE_SIZE: usize = 256;
+
+// GPT
+pub const GPT_SIGNATURE = "EFI PART";
+pub const GPT_HEADER_SECTOR: u64 = 1;
+pub const GPT_PARTITION_ENTRIES_MAX: usize = 4;
+pub const GPT_ENTRY_SIZE: usize = 128;
+pub const GPT_HEADER_PARTITION_LBA_OFFSET: usize = 72;
+pub const GPT_ENTRY_TYPE_GUID_SIZE: usize = 16;
+pub const GPT_ENTRY_START_LBA_OFFSET: usize = 32;
+pub const GPT_ENTRY_END_LBA_OFFSET: usize = 40;
+
+// AFS partition GUID
+pub const AFS_PARTITION_GUID = [_]u8{
+ 0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6, 0x07, 0x18,
+ 0x29, 0x3A, 0x4B, 0x5C, 0x6D, 0x7E, 0x8F, 0x90,
+};
diff --git a/mirai.old/common/constants/gdt.zig b/mirai.old/common/constants/gdt.zig
new file mode 100644
index 0000000..ca852c8
--- /dev/null
+++ b/mirai.old/common/constants/gdt.zig
@@ -0,0 +1,7 @@
+//! GDT segment selectors
+
+pub const KERNEL_CODE: u16 = 0x08;
+pub const KERNEL_DATA: u16 = 0x10;
+pub const USER_DATA: u16 = 0x18;
+pub const USER_CODE: u16 = 0x20;
+pub const TSS_SEGMENT: u16 = 0x28;
diff --git a/mirai.old/common/constants/heap.zig b/mirai.old/common/constants/heap.zig
new file mode 100644
index 0000000..8bd3f26
--- /dev/null
+++ b/mirai.old/common/constants/heap.zig
@@ -0,0 +1,6 @@
+//! Heap allocator constants
+
+pub const SIZE_CLASSES = [_]usize{ 16, 32, 64, 128, 256, 512, 1024, 2048 };
+pub const NUM_CACHES: usize = SIZE_CLASSES.len;
+pub const LARGE_ALLOC_THRESHOLD: usize = 2048;
+pub const MAX_LARGE_PAGES: usize = 64;
diff --git a/mirai.old/common/constants/idt.zig b/mirai.old/common/constants/idt.zig
new file mode 100644
index 0000000..d7c7bac
--- /dev/null
+++ b/mirai.old/common/constants/idt.zig
@@ -0,0 +1,10 @@
+//! IDT constants
+
+pub const NUM_ENTRIES: usize = 256;
+pub const NUM_EXCEPTIONS: u8 = 32;
+
+pub const GATE_INTERRUPT: u8 = 0x8E;
+pub const GATE_TRAP: u8 = 0x8F;
+
+pub const VECTOR_TIMER: u8 = 32;
+pub const VECTOR_KEYBOARD: u8 = 33;
diff --git a/mirai.old/common/constants/interrupts.zig b/mirai.old/common/constants/interrupts.zig
new file mode 100644
index 0000000..6628cee
--- /dev/null
+++ b/mirai.old/common/constants/interrupts.zig
@@ -0,0 +1,39 @@
+//! Interrupt vectors
+
+pub const EXCEPTION_DIVIDE_ERROR: u8 = 0;
+pub const EXCEPTION_DEBUG: u8 = 1;
+pub const EXCEPTION_NMI: u8 = 2;
+pub const EXCEPTION_BREAKPOINT: u8 = 3;
+pub const EXCEPTION_OVERFLOW: u8 = 4;
+pub const EXCEPTION_BOUND_RANGE: u8 = 5;
+pub const EXCEPTION_INVALID_OPCODE: u8 = 6;
+pub const EXCEPTION_DEVICE_NOT_AVAILABLE: u8 = 7;
+pub const EXCEPTION_DOUBLE_FAULT: u8 = 8;
+pub const EXCEPTION_INVALID_TSS: u8 = 10;
+pub const EXCEPTION_SEGMENT_NOT_PRESENT: u8 = 11;
+pub const EXCEPTION_STACK_FAULT: u8 = 12;
+pub const EXCEPTION_GENERAL_PROTECTION: u8 = 13;
+pub const EXCEPTION_PAGE_FAULT: u8 = 14;
+pub const EXCEPTION_FPU_ERROR: u8 = 16;
+pub const EXCEPTION_ALIGNMENT_CHECK: u8 = 17;
+pub const EXCEPTION_MACHINE_CHECK: u8 = 18;
+pub const EXCEPTION_SIMD_EXCEPTION: u8 = 19;
+
+pub const IRQ_TIMER: u8 = 32;
+pub const IRQ_KEYBOARD: u8 = 33;
+pub const IRQ_CASCADE: u8 = 34;
+pub const IRQ_COM2: u8 = 35;
+pub const IRQ_COM1: u8 = 36;
+pub const IRQ_LPT2: u8 = 37;
+pub const IRQ_FLOPPY: u8 = 38;
+pub const IRQ_LPT1: u8 = 39;
+pub const IRQ_RTC: u8 = 40;
+pub const IRQ_ACPI: u8 = 41;
+pub const IRQ_AVAILABLE_10: u8 = 42;
+pub const IRQ_AVAILABLE_11: u8 = 43;
+pub const IRQ_MOUSE: u8 = 44;
+pub const IRQ_FPU: u8 = 45;
+pub const IRQ_PRIMARY_ATA: u8 = 46;
+pub const IRQ_SECONDARY_ATA: u8 = 47;
+
+pub const INTERRUPT_INVOCATION: u8 = 0x80;
diff --git a/mirai.old/common/constants/invocations.zig b/mirai.old/common/constants/invocations.zig
new file mode 100644
index 0000000..afeb9d4
--- /dev/null
+++ b/mirai.old/common/constants/invocations.zig
@@ -0,0 +1,25 @@
+//! Invocation numbers
+
+pub const EXIT: u64 = 0x01;
+pub const ATTACH: u64 = 0x02;
+pub const SEAL: u64 = 0x03;
+pub const VIEW: u64 = 0x04;
+pub const MARK: u64 = 0x05;
+pub const SPAWN: u64 = 0x06;
+pub const WAIT: u64 = 0x07;
+pub const YIELD: u64 = 0x08;
+pub const GETKEYCHAR: u64 = 0x09;
+pub const VIEWSTACK: u64 = 0x0A;
+pub const GETLOCATION: u64 = 0x0B;
+pub const SETLOCATION: u64 = 0x0C;
+pub const POSTMAN: u64 = 0x0D;
+pub const WIPE: u64 = 0x0E;
+pub const CPUINFO: u64 = 0x0F;
+pub const MEMINFO: u64 = 0x10;
+pub const UPTIME: u64 = 0x11;
+pub const GETTIME: u64 = 0x12;
+pub const DISKINFO: u64 = 0x13;
+pub const REAP: u64 = 0x14;
+
+pub const ERROR: u64 = @as(u64, @bitCast(@as(i64, -1)));
+pub const NO_DATA: u64 = @as(u64, @bitCast(@as(i64, -2)));
diff --git a/mirai.old/common/constants/kata.zig b/mirai.old/common/constants/kata.zig
new file mode 100644
index 0000000..c790a6b
--- /dev/null
+++ b/mirai.old/common/constants/kata.zig
@@ -0,0 +1,27 @@
+//! Kata constants
+
+const memory = @import("memory.zig");
+
+pub const KATA_STACK_TOP: u64 = 0x00007FFFFFF00000;
+pub const KATA_STACK_PAGES: u64 = 64;
+pub const KATA_STACK_SIZE: u64 = KATA_STACK_PAGES * memory.PAGE_SIZE;
+pub const MIRAI_STACK_SIZE: u64 = memory.PAGE_SIZE;
+
+pub const TIMER_TICK_NS: u64 = 1_000_000;
+pub const SENSEI_TIME_SLICE: u64 = 10;
+
+pub const STATE_READY: u8 = 0;
+pub const STATE_RUNNING: u8 = 1;
+pub const STATE_BLOCKED: u8 = 2;
+pub const STATE_WAITING: u8 = 3;
+pub const STATE_DISSOLVED: u8 = 4;
+
+pub const LETTER_NONE: u8 = 0;
+pub const LETTER_NAVIGATE: u8 = 1;
+
+pub const POSTMAN_SEND: u64 = 0;
+pub const POSTMAN_READ: u64 = 1;
+
+pub const DEFAULT_WEIGHT: u32 = 1024;
+pub const KERNEL_RFLAGS: u64 = 0x202;
+pub const USER_RFLAGS: u64 = 0x3202;
diff --git a/mirai.old/common/constants/keyboard.zig b/mirai.old/common/constants/keyboard.zig
new file mode 100644
index 0000000..2c60e2d
--- /dev/null
+++ b/mirai.old/common/constants/keyboard.zig
@@ -0,0 +1,11 @@
+//! Keyboard constants
+
+pub const SCANCODE_RELEASED: u8 = 0x80;
+
+pub const SCANCODE_LSHIFT: u8 = 0x2A;
+pub const SCANCODE_RSHIFT: u8 = 0x36;
+pub const SCANCODE_LCTRL: u8 = 0x1D;
+pub const SCANCODE_LALT: u8 = 0x38;
+pub const SCANCODE_CAPS: u8 = 0x3A;
+
+pub const LOWERCASE_TO_UPPERCASE: u8 = 32;
diff --git a/mirai.old/common/constants/memory.zig b/mirai.old/common/constants/memory.zig
new file mode 100644
index 0000000..08b7409
--- /dev/null
+++ b/mirai.old/common/constants/memory.zig
@@ -0,0 +1,90 @@
+//! Memory constants
+
+pub const PAGE_SIZE: u64 = 4096;
+pub const PAGE_OFFSET_MASK: u64 = 0xFFF;
+pub const PAGE_FRAME_MASK: u64 = ~PAGE_OFFSET_MASK;
+
+pub const HIGHER_HALF_START: u64 = 0xFFFF800000000000;
+pub const MIRAI_PHYSICAL_START: u64 = 0x100000;
+pub const MIRAI_PHYSICAL_END: u64 = 0x500000;
+pub const MIRAI_VIRTUAL_START: u64 = HIGHER_HALF_START + MIRAI_PHYSICAL_START;
+
+extern const _kernel_end: u8;
+
+pub fn MIRAI_END() u64 {
+ const link_addr = @intFromPtr(&_kernel_end);
+ if (link_addr >= HIGHER_HALF_START) {
+ return link_addr - HIGHER_HALF_START;
+ } else {
+ return link_addr;
+ }
+}
+
+pub const KATA_SPACE_START: u64 = 0x1000;
+pub const KATA_SPACE_END: u64 = 0x0000800000000000;
+
+// Stack configuration
+pub const USER_STACK_TOP: u64 = 0x00007FFFFFF00000;
+pub const USER_STACK_MAX_PAGES: u64 = 512; // 2MB max
+pub const USER_STACK_INITIAL_PAGES: u64 = 16; // 64KB initial, grows on demand
+pub const USER_STACK_SIZE: u64 = USER_STACK_MAX_PAGES * PAGE_SIZE;
+pub const KERNEL_STACK_PAGES: u64 = 4; // 16KB
+pub const KERNEL_STACK_SIZE: u64 = KERNEL_STACK_PAGES * PAGE_SIZE;
+
+pub const PTE_PRESENT: u64 = 1 << 0;
+pub const PTE_WRITABLE: u64 = 1 << 1;
+pub const PTE_USER: u64 = 1 << 2;
+pub const PTE_WRITE_THROUGH: u64 = 1 << 3;
+pub const PTE_CACHE_DISABLE: u64 = 1 << 4;
+pub const PTE_ACCESSED: u64 = 1 << 5;
+pub const PTE_DIRTY: u64 = 1 << 6;
+pub const PTE_HUGE_PAGE: u64 = 1 << 7;
+pub const PTE_GLOBAL: u64 = 1 << 8;
+pub const PTE_NO_EXECUTE: u64 = 1 << 63;
+
+pub const PAGE_TABLE_ENTRIES: usize = 512;
+pub const PML4_SHIFT: u6 = 39;
+pub const PDPT_SHIFT: u6 = 30;
+pub const PD_SHIFT: u6 = 21;
+pub const PT_SHIFT: u6 = 12;
+pub const TABLE_INDEX_MASK: u64 = 0x1FF;
+
+pub inline fn align_down(addr: u64) u64 {
+ return addr & PAGE_FRAME_MASK;
+}
+
+pub inline fn align_up(addr: u64) u64 {
+ return (addr + PAGE_SIZE - 1) & PAGE_FRAME_MASK;
+}
+
+pub inline fn pages_for_size(size: u64) u64 {
+ return (size + PAGE_SIZE - 1) / PAGE_SIZE;
+}
+
+pub inline fn is_page_aligned(addr: u64) bool {
+ return (addr & PAGE_OFFSET_MASK) == 0;
+}
+
+pub inline fn pml4_index(vaddr: u64) u64 {
+ return (vaddr >> PML4_SHIFT) & TABLE_INDEX_MASK;
+}
+
+pub inline fn pdpt_index(vaddr: u64) u64 {
+ return (vaddr >> PDPT_SHIFT) & TABLE_INDEX_MASK;
+}
+
+pub inline fn pd_index(vaddr: u64) u64 {
+ return (vaddr >> PD_SHIFT) & TABLE_INDEX_MASK;
+}
+
+pub inline fn pt_index(vaddr: u64) u64 {
+ return (vaddr >> PT_SHIFT) & TABLE_INDEX_MASK;
+}
+
+pub inline fn virt_to_phys(vaddr: u64) u64 {
+ return vaddr - HIGHER_HALF_START;
+}
+
+pub inline fn phys_to_virt(paddr: u64) u64 {
+ return paddr + HIGHER_HALF_START;
+}
diff --git a/mirai.old/common/constants/msr.zig b/mirai.old/common/constants/msr.zig
new file mode 100644
index 0000000..89a8367
--- /dev/null
+++ b/mirai.old/common/constants/msr.zig
@@ -0,0 +1,20 @@
+//! Model Specific Register addresses and values
+
+pub const IA32_EFER: u32 = 0xC0000080;
+pub const IA32_STAR: u32 = 0xC0000081;
+pub const IA32_LSTAR: u32 = 0xC0000082;
+pub const IA32_CSTAR: u32 = 0xC0000083;
+pub const IA32_FMASK: u32 = 0xC0000084;
+pub const IA32_FS_BASE: u32 = 0xC0000100;
+pub const IA32_GS_BASE: u32 = 0xC0000101;
+pub const IA32_KERNEL_GS_BASE: u32 = 0xC0000102;
+
+pub const EFER_SCE: u64 = 1 << 0;
+pub const EFER_LME: u64 = 1 << 8;
+pub const EFER_LMA: u64 = 1 << 10;
+pub const EFER_NXE: u64 = 1 << 11;
+
+pub const STAR_KERNEL_CS_SHIFT: u6 = 32;
+pub const STAR_USER_BASE_SHIFT: u6 = 48;
+
+pub const FMASK_IF: u64 = 0x200;
diff --git a/mirai.old/common/constants/paging.zig b/mirai.old/common/constants/paging.zig
new file mode 100644
index 0000000..0a9e9bb
--- /dev/null
+++ b/mirai.old/common/constants/paging.zig
@@ -0,0 +1,11 @@
+//! Paging constants
+
+pub const PTE_PRESENT: u64 = 1 << 0;
+pub const PTE_WRITABLE: u64 = 1 << 1;
+pub const PTE_USER: u64 = 1 << 2;
+
+pub const PTE_MASK: u64 = 0x000FFFFFFFFFF000;
+pub const OFFSET_MASK: u64 = 0xFFF;
+
+pub const PML4_ENTRIES: usize = 512;
+pub const KERNEL_PML4_START: usize = 256;
diff --git a/mirai.old/common/constants/pci.zig b/mirai.old/common/constants/pci.zig
new file mode 100644
index 0000000..2da8287
--- /dev/null
+++ b/mirai.old/common/constants/pci.zig
@@ -0,0 +1,42 @@
+//! PCI configuration constants
+
+// Config register offsets
+pub const REG_VENDOR_ID: u8 = 0x00;
+pub const REG_DEVICE_ID: u8 = 0x02;
+pub const REG_COMMAND: u8 = 0x04;
+pub const REG_STATUS: u8 = 0x06;
+pub const REG_REVISION: u8 = 0x08;
+pub const REG_PROG_IF: u8 = 0x09;
+pub const REG_SUBCLASS: u8 = 0x0A;
+pub const REG_CLASS_CODE: u8 = 0x0B;
+pub const REG_HEADER_TYPE: u8 = 0x0E;
+pub const REG_BAR0: u8 = 0x10;
+pub const REG_BAR1: u8 = 0x14;
+pub const REG_BAR2: u8 = 0x18;
+pub const REG_BAR3: u8 = 0x1C;
+pub const REG_BAR4: u8 = 0x20;
+pub const REG_BAR5: u8 = 0x24;
+pub const REG_INTERRUPT_LINE: u8 = 0x3C;
+pub const REG_INTERRUPT_PIN: u8 = 0x3D;
+
+// Command register bits
+pub const CMD_IO_SPACE: u16 = 0x01;
+pub const CMD_MEMORY_SPACE: u16 = 0x02;
+pub const CMD_BUS_MASTER: u16 = 0x04;
+
+// Class codes
+pub const CLASS_MASS_STORAGE: u8 = 0x01;
+pub const SUBCLASS_SATA: u8 = 0x06;
+
+// Header type bits
+pub const HEADER_MULTIFUNCTION: u8 = 0x80;
+
+// Invalid vendor
+pub const VENDOR_INVALID: u16 = 0xFFFF;
+
+// Config address bits
+pub const CONFIG_ENABLE: u32 = 1 << 31;
+pub const CONFIG_BUS_SHIFT: u5 = 16;
+pub const CONFIG_DEVICE_SHIFT: u5 = 11;
+pub const CONFIG_FUNCTION_SHIFT: u5 = 8;
+pub const CONFIG_OFFSET_MASK: u8 = 0xFC;
diff --git a/mirai.old/common/constants/pic.zig b/mirai.old/common/constants/pic.zig
new file mode 100644
index 0000000..656e9a1
--- /dev/null
+++ b/mirai.old/common/constants/pic.zig
@@ -0,0 +1,20 @@
+//! PIC constants
+
+pub const MASTER_CMD: u16 = 0x20;
+pub const MASTER_DATA: u16 = 0x21;
+pub const SLAVE_CMD: u16 = 0xA0;
+pub const SLAVE_DATA: u16 = 0xA1;
+
+pub const ICW1_INIT: u8 = 0x11;
+pub const ICW4_8086: u8 = 0x01;
+
+pub const MASTER_OFFSET: u8 = 0x20;
+pub const SLAVE_OFFSET: u8 = 0x28;
+
+pub const MASTER_CASCADE: u8 = 0x04;
+pub const SLAVE_CASCADE: u8 = 0x02;
+
+pub const MASK_TIMER_KEYBOARD: u8 = 0xFC;
+pub const MASK_ALL: u8 = 0xFF;
+
+pub const EOI: u8 = 0x20;
diff --git a/mirai.old/common/constants/pit.zig b/mirai.old/common/constants/pit.zig
new file mode 100644
index 0000000..423e3f3
--- /dev/null
+++ b/mirai.old/common/constants/pit.zig
@@ -0,0 +1,20 @@
+//! PIT (Programmable Interval Timer) constants
+
+pub const CHANNEL_0: u16 = 0x40;
+pub const CHANNEL_1: u16 = 0x41;
+pub const CHANNEL_2: u16 = 0x42;
+pub const COMMAND: u16 = 0x43;
+
+pub const BASE_FREQUENCY: u32 = 1193182;
+
+// Command byte bits
+pub const SELECT_CHANNEL_0: u8 = 0x00;
+pub const ACCESS_LOHI: u8 = 0x30; // Low byte then high byte
+pub const MODE_RATE_GENERATOR: u8 = 0x04; // Mode 2: rate generator
+pub const MODE_SQUARE_WAVE: u8 = 0x06; // Mode 3: square wave
+
+// For 1000 Hz (1ms ticks): divisor = 1193182 / 1000 = 1193
+pub const DIVISOR_1000HZ: u16 = 1193;
+
+// For 100 Hz (10ms ticks): divisor = 1193182 / 100 = 11932
+pub const DIVISOR_100HZ: u16 = 11932;
diff --git a/mirai.old/common/constants/pmm.zig b/mirai.old/common/constants/pmm.zig
new file mode 100644
index 0000000..75cd032
--- /dev/null
+++ b/mirai.old/common/constants/pmm.zig
@@ -0,0 +1,14 @@
+//! Physical memory manager constants
+
+pub const MEMORY_AVAILABLE: u32 = 1;
+
+pub const FIRST_MB: u64 = 0x100000;
+pub const KERNEL_BASE: u64 = 0x100000;
+pub const KERNEL_MAP_END: u64 = 0x10000000; // 256MB
+
+pub const MMIO_FRAMEBUFFER_BASE: u64 = 0x80000000;
+pub const MMIO_FRAMEBUFFER_SIZE: u64 = 0x10000000;
+pub const MMIO_PCI_BASE: u64 = 0xE0000000;
+pub const MMIO_PCI_SIZE: u64 = 0x10000000;
+
+pub const BITMAP_MARK_USED: u8 = 0xFF;
diff --git a/mirai.old/common/constants/ports.zig b/mirai.old/common/constants/ports.zig
new file mode 100644
index 0000000..57ede2f
--- /dev/null
+++ b/mirai.old/common/constants/ports.zig
@@ -0,0 +1,32 @@
+//! I/O port addresses
+
+// Serial (COM1)
+pub const COM1: u16 = 0x3F8;
+pub const COM1_DATA: u16 = COM1;
+pub const COM1_INT_ENABLE: u16 = COM1 + 1;
+pub const COM1_FIFO_CTRL: u16 = COM1 + 2;
+pub const COM1_LINE_CTRL: u16 = COM1 + 3;
+pub const COM1_MODEM_CTRL: u16 = COM1 + 4;
+pub const COM1_LINE_STATUS: u16 = COM1 + 5;
+
+// PS/2 Keyboard
+pub const KEYBOARD_DATA: u16 = 0x60;
+pub const KEYBOARD_STATUS: u16 = 0x64;
+
+// PIC
+pub const PIC1_CMD: u16 = 0x20;
+pub const PIC1_DATA: u16 = 0x21;
+pub const PIC2_CMD: u16 = 0xA0;
+pub const PIC2_DATA: u16 = 0xA1;
+pub const PIC_EOI: u8 = 0x20;
+
+// PCI
+pub const PCI_CONFIG_ADDRESS: u16 = 0xCF8;
+pub const PCI_CONFIG_DATA: u16 = 0xCFC;
+
+// VGA
+pub const VGA_BUFFER_ADDR: usize = 0xB8000;
+
+// CMOS/RTC
+pub const CMOS_ADDRESS: u16 = 0x70;
+pub const CMOS_DATA: u16 = 0x71;
diff --git a/mirai.old/common/constants/psf.zig b/mirai.old/common/constants/psf.zig
new file mode 100644
index 0000000..445a831
--- /dev/null
+++ b/mirai.old/common/constants/psf.zig
@@ -0,0 +1,7 @@
+//! PSF font constants
+
+pub const PSF1_MAGIC: u16 = 0x0436;
+pub const PSF2_MAGIC: u32 = 0x864ab572;
+pub const PSF1_MODE_512: u8 = 0x01;
+pub const PSF1_GLYPHS_256: u32 = 256;
+pub const PSF1_GLYPHS_512: u32 = 512;
diff --git a/mirai.old/common/constants/serial.zig b/mirai.old/common/constants/serial.zig
new file mode 100644
index 0000000..92f6e34
--- /dev/null
+++ b/mirai.old/common/constants/serial.zig
@@ -0,0 +1,3 @@
+//! Serial port constants
+
+pub const LINE_STATUS_TX_EMPTY: u8 = 0x20;
diff --git a/mirai.old/common/constants/time.zig b/mirai.old/common/constants/time.zig
new file mode 100644
index 0000000..ce50e2a
--- /dev/null
+++ b/mirai.old/common/constants/time.zig
@@ -0,0 +1,9 @@
+//! Time constants
+
+pub const TICKS_PER_SECOND: u64 = 100;
+
+pub const SECONDS_PER_MINUTE: u64 = 60;
+pub const SECONDS_PER_HOUR: u64 = 3600;
+pub const SECONDS_PER_DAY: u64 = 86400;
+
+pub const EPOCH_YEAR: u64 = 1970;
diff --git a/mirai.old/common/constants/vga.zig b/mirai.old/common/constants/vga.zig
new file mode 100644
index 0000000..4cc2f33
--- /dev/null
+++ b/mirai.old/common/constants/vga.zig
@@ -0,0 +1,3 @@
+//! VGA constants
+
+pub const DEFAULT_ATTR: u16 = 0x0F00;
diff --git a/mirai.old/common/constants/video.zig b/mirai.old/common/constants/video.zig
new file mode 100644
index 0000000..adf13f2
--- /dev/null
+++ b/mirai.old/common/constants/video.zig
@@ -0,0 +1,6 @@
+//! Video/framebuffer constants
+
+pub const BPP_24: u32 = 24;
+pub const BPP_32: u32 = 32;
+pub const BYTES_PER_PIXEL_24: u32 = 3;
+pub const BYTES_PER_PIXEL_32: u32 = 4;
diff --git a/mirai.old/common/errors/fs.zig b/mirai.old/common/errors/fs.zig
new file mode 100644
index 0000000..efa9b58
--- /dev/null
+++ b/mirai.old/common/errors/fs.zig
@@ -0,0 +1,15 @@
+//! Filesystem errors
+
+pub const FsError = error{
+ NotFound,
+ InvalidLocation,
+ NotAStack,
+ NotAUnit,
+ StackNotEmpty,
+ AlreadyExists,
+ NoSpace,
+ ReadOnly,
+ DiskError,
+ Corrupted,
+ CannotCreate,
+};
diff --git a/mirai.old/common/errors/io.zig b/mirai.old/common/errors/io.zig
new file mode 100644
index 0000000..c7afdaf
--- /dev/null
+++ b/mirai.old/common/errors/io.zig
@@ -0,0 +1,15 @@
+//! I/O errors
+
+pub const IoError = error{
+ InvalidAttachment,
+ TooManyAttachments,
+ ViewFailed,
+ MarkFailed,
+ InvalidDevice,
+ CannotView,
+ CannotMark,
+ BadPointer,
+ BufferTooSmall,
+ UnknownDevice,
+ SendFailed,
+};
diff --git a/mirai.old/common/errors/kata.zig b/mirai.old/common/errors/kata.zig
new file mode 100644
index 0000000..e997d43
--- /dev/null
+++ b/mirai.old/common/errors/kata.zig
@@ -0,0 +1,9 @@
+//! Kata errors
+
+pub const KataError = error{
+ TooManyKatas,
+ KataNotFound,
+ InvalidState,
+ NotChild,
+ WaitingSelf,
+};
diff --git a/mirai.old/common/errors/memory.zig b/mirai.old/common/errors/memory.zig
new file mode 100644
index 0000000..58d77b8
--- /dev/null
+++ b/mirai.old/common/errors/memory.zig
@@ -0,0 +1,10 @@
+//! Memory errors
+
+pub const MemoryError = error{
+ OutOfMemory,
+ InvalidAddress,
+ PageNotPresent,
+ AllocationFailed,
+ NotAligned,
+ PermissionDenied,
+};
diff --git a/mirai.old/common/limits/ahci.zig b/mirai.old/common/limits/ahci.zig
new file mode 100644
index 0000000..027a992
--- /dev/null
+++ b/mirai.old/common/limits/ahci.zig
@@ -0,0 +1,8 @@
+//! AHCI limits
+
+pub const MAX_PORTS: u8 = 32;
+pub const MAX_CMD_SLOTS: u8 = 32;
+pub const TIMEOUT_SPIN: u32 = 500000;
+pub const TIMEOUT_CMD: u32 = 1000000;
+pub const TIMEOUT_WAIT: u32 = 10000000;
+pub const CMD_TABLE_CLEAR_SIZE: usize = 256;
diff --git a/mirai.old/common/limits/ata.zig b/mirai.old/common/limits/ata.zig
new file mode 100644
index 0000000..917916c
--- /dev/null
+++ b/mirai.old/common/limits/ata.zig
@@ -0,0 +1,4 @@
+//! ATA limits
+
+pub const SECTOR_SIZE: usize = 512;
+pub const TIMEOUT_DATA_READY: u32 = 10000;
diff --git a/mirai.old/common/limits/attachment.zig b/mirai.old/common/limits/attachment.zig
new file mode 100644
index 0000000..511ba9d
--- /dev/null
+++ b/mirai.old/common/limits/attachment.zig
@@ -0,0 +1,3 @@
+//! Attachment limits
+
+pub const MAX_LOCATION_LENGTH: usize = 256;
diff --git a/mirai.old/common/limits/boot.zig b/mirai.old/common/limits/boot.zig
new file mode 100644
index 0000000..76b4a0d
--- /dev/null
+++ b/mirai.old/common/limits/boot.zig
@@ -0,0 +1,7 @@
+//! Boot limits
+
+pub const MAX_MEMORY_ENTRIES: usize = 32;
+pub const MAX_BOOT_MESSAGES: usize = 100;
+pub const MAX_MESSAGE_LENGTH: usize = 256;
+pub const KERNEL_STACK_SIZE: usize = 16384;
+pub const FONT_BUFFER_SIZE: usize = 8192;
diff --git a/mirai.old/common/limits/crimson.zig b/mirai.old/common/limits/crimson.zig
new file mode 100644
index 0000000..9f80985
--- /dev/null
+++ b/mirai.old/common/limits/crimson.zig
@@ -0,0 +1,6 @@
+//! Crimson limits
+
+pub const MAX_STACK_FRAMES: usize = 16;
+pub const REGISTER_BUFFER_SIZE: usize = 100;
+pub const STACK_FRAME_BUFFER_SIZE: usize = 50;
+pub const ASSERT_BUFFER_SIZE: usize = 256;
diff --git a/mirai.old/common/limits/fs.zig b/mirai.old/common/limits/fs.zig
new file mode 100644
index 0000000..ca7103d
--- /dev/null
+++ b/mirai.old/common/limits/fs.zig
@@ -0,0 +1,6 @@
+//! Filesystem limits
+
+pub const MAX_LOCATION_LENGTH: usize = 4096;
+pub const MAX_IDENTITY_LENGTH: usize = 255;
+pub const MAX_UNIT_SIZE: u64 = 64 * 1024 * 1024; // 64MB
+pub const MAX_STACK_ITEMS: usize = 4096;
diff --git a/mirai.old/common/limits/io.zig b/mirai.old/common/limits/io.zig
new file mode 100644
index 0000000..2dc80c4
--- /dev/null
+++ b/mirai.old/common/limits/io.zig
@@ -0,0 +1,6 @@
+//! I/O limits
+
+pub const MAX_MARK_SIZE: u64 = 4 * 1024 * 1024; // 4MB
+pub const MAX_VIEW_SIZE: u64 = 4 * 1024 * 1024; // 4MB
+pub const MIRAI_COPY_BUFFER_SIZE: usize = 4096; // 4KB
+pub const MAX_STRING_LENGTH: usize = 4096;
diff --git a/mirai.old/common/limits/kata.zig b/mirai.old/common/limits/kata.zig
new file mode 100644
index 0000000..6f827f3
--- /dev/null
+++ b/mirai.old/common/limits/kata.zig
@@ -0,0 +1,8 @@
+//! Kata Limits
+
+pub const MAX_KATAS: usize = 64;
+pub const MAX_ATTACHMENTS: usize = 16;
+pub const MAX_PARAMETERS: usize = 64;
+pub const MAX_ENV_VARS: usize = 64;
+pub const MAX_LOCATION_LENGTH: usize = 256;
+pub const MAX_LETTER_LENGTH: usize = 256;
diff --git a/mirai.old/common/limits/keyboard.zig b/mirai.old/common/limits/keyboard.zig
new file mode 100644
index 0000000..b4d5818
--- /dev/null
+++ b/mirai.old/common/limits/keyboard.zig
@@ -0,0 +1,3 @@
+//! Keyboard limits
+
+pub const BUFFER_SIZE: usize = 256;
diff --git a/mirai.old/common/limits/memory.zig b/mirai.old/common/limits/memory.zig
new file mode 100644
index 0000000..dba20e6
--- /dev/null
+++ b/mirai.old/common/limits/memory.zig
@@ -0,0 +1,27 @@
+//! Memory limits
+
+const memory_const = @import("../constants/memory.zig");
+
+pub const KATA_SPACE_MAX: u64 = memory_const.KATA_SPACE_END;
+pub const KATA_SPACE_MIN: u64 = memory_const.KATA_SPACE_START;
+pub const MIRAI_SPACE_START: u64 = memory_const.HIGHER_HALF_START;
+
+pub inline fn is_valid_kata_pointer(ptr: u64) bool {
+ return ptr >= KATA_SPACE_MIN and ptr < KATA_SPACE_MAX;
+}
+
+pub inline fn is_kata_address(addr: u64) bool {
+ return addr < KATA_SPACE_MAX;
+}
+
+pub inline fn is_mirai_address(addr: u64) bool {
+ return addr >= MIRAI_SPACE_START;
+}
+
+pub inline fn is_kata_range(start: u64, size: u64) bool {
+ if (start >= KATA_SPACE_MAX) return false;
+ if (size == 0) return true;
+ const end = start +% size;
+ if (end < start) return false;
+ return end <= KATA_SPACE_MAX;
+}
diff --git a/mirai.old/common/limits/pci.zig b/mirai.old/common/limits/pci.zig
new file mode 100644
index 0000000..b9b069c
--- /dev/null
+++ b/mirai.old/common/limits/pci.zig
@@ -0,0 +1,6 @@
+//! PCI limits
+
+pub const MAX_BUS: u16 = 256;
+pub const MAX_DEVICE: u8 = 32;
+pub const MAX_FUNCTION: u8 = 8;
+pub const MAX_DEVICES: usize = 64;
diff --git a/mirai.old/common/limits/terminal.zig b/mirai.old/common/limits/terminal.zig
new file mode 100644
index 0000000..410631d
--- /dev/null
+++ b/mirai.old/common/limits/terminal.zig
@@ -0,0 +1,6 @@
+//! Terminal limits
+
+pub const MAX_LINES: usize = 256;
+pub const TAB_WIDTH: u32 = 4;
+pub const DEFAULT_CHAR_WIDTH: u32 = 8;
+pub const DEFAULT_CHAR_HEIGHT: u32 = 16;
diff --git a/mirai.old/common/limits/vga.zig b/mirai.old/common/limits/vga.zig
new file mode 100644
index 0000000..556a3cb
--- /dev/null
+++ b/mirai.old/common/limits/vga.zig
@@ -0,0 +1,4 @@
+//! VGA limits
+
+pub const WIDTH: usize = 80;
+pub const HEIGHT: usize = 25;