diff options
Diffstat (limited to 'mirai.old/common')
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; |
