diff --git a/build.zig b/build.zig index 4fb3409..3f574f1 100644 --- a/build.zig +++ b/build.zig @@ -4,7 +4,7 @@ const builtin = @import("builtin"); pub fn build(b: *Builder) void { const kernel = b.addExecutable("kernel", "src/arch/x86/main.zig"); kernel.addPackagePath("kernel", "src/index.zig"); - // kernel.addPackagePath("arch", "src/arch/x86/lib/index.zig"); + kernel.addPackagePath("x86", "src/arch/x86/index.zig"); kernel.setOutputDir("build"); // kernel.addAssemblyFile("src/arch/x86/_start.s"); diff --git a/src/arch/x86/gdt.zig b/src/arch/x86/gdt.zig index 77e3c9d..8195a16 100644 --- a/src/arch/x86/gdt.zig +++ b/src/arch/x86/gdt.zig @@ -1,5 +1,5 @@ // const tty = @import("tty.zig"); -const x86 = @import("lib/index.zig"); +const x86 = @import("x86"); // GDT segment selectors. pub const KERNEL_CODE = 0x08; diff --git a/src/arch/x86/idt.zig b/src/arch/x86/idt.zig index aa471d4..443c383 100644 --- a/src/arch/x86/idt.zig +++ b/src/arch/x86/idt.zig @@ -1,8 +1,6 @@ // https://wiki.osdev.org/IDT -usingnamespace @import("../../vga.zig"); -const x86 = @import("lib/index.zig"); -const interrupt = @import("interrupt.zig"); -const gdt = @import("gdt.zig"); +usingnamespace @import("kernel"); +usingnamespace @import("x86"); // Types of gates. pub const INTERRUPT_GATE = 0x8E; @@ -55,5 +53,5 @@ pub fn initialize() void { interrupt.initialize(); // load IDT - x86.lidt(@ptrToInt(&idtr)); + lidt(@ptrToInt(&idtr)); } diff --git a/src/arch/x86/index.zig b/src/arch/x86/index.zig new file mode 100644 index 0000000..8d3daa7 --- /dev/null +++ b/src/arch/x86/index.zig @@ -0,0 +1,8 @@ +usingnamespace @import("lib/io.zig"); +usingnamespace @import("lib/instructions.zig"); + +const memory = @import("memory.zig"); +const paging = @import("paging.zig"); +const idt = @import("idt.zig"); +const gdt = @import("gdt.zig"); +const interrupt = @import("interrupt.zig"); diff --git a/src/arch/x86/interrupt.zig b/src/arch/x86/interrupt.zig index 67b1257..a4da053 100644 --- a/src/arch/x86/interrupt.zig +++ b/src/arch/x86/interrupt.zig @@ -1,6 +1,6 @@ -const x86 = @import("lib/index.zig"); +usingnamespace @import("kernel"); +const x86 = @import("x86"); const isr = @import("isr.zig"); -const println = @import("../../vga.zig").println; // PIC ports. const PIC1_CMD = 0x20; diff --git a/src/arch/x86/isr.zig b/src/arch/x86/isr.zig index 6714f0e..47cf0a9 100644 --- a/src/arch/x86/isr.zig +++ b/src/arch/x86/isr.zig @@ -1,4 +1,4 @@ -const idt = @import("idt.zig"); +usingnamespace @import("x86"); // Interrupt Service Routines defined externally in assembly. extern fn isr0() void; diff --git a/src/arch/x86/lib/index.zig b/src/arch/x86/lib/index.zig deleted file mode 100644 index 14b9bcb..0000000 --- a/src/arch/x86/lib/index.zig +++ /dev/null @@ -1,2 +0,0 @@ -usingnamespace @import("io.zig"); -usingnamespace @import("instructions.zig"); diff --git a/src/arch/x86/main.zig b/src/arch/x86/main.zig index 6f02fd3..5a3ce99 100644 --- a/src/arch/x86/main.zig +++ b/src/arch/x86/main.zig @@ -1,13 +1,5 @@ -usingnamespace @import("kernel").main; -usingnamespace @import("kernel").multiboot; -const console = @import("../console.zig"); -const println = @import("../../vga.zig").println; - -const idt = @import("idt.zig"); -const memory = @import("memory.zig"); -const paging = @import("paging.zig"); -const gdt = @import("gdt.zig"); -const x86 = @import("lib/index.zig"); +usingnamespace @import("kernel"); +usingnamespace @import("x86"); /// x86 specific intialization pub fn x86_main(info: *const MultibootInfo) void { diff --git a/src/arch/x86/memory.zig b/src/arch/x86/memory.zig index 34f3662..bfe48cf 100644 --- a/src/arch/x86/memory.zig +++ b/src/arch/x86/memory.zig @@ -1,6 +1,4 @@ -usingnamespace @import("kernel").multiboot; -usingnamespace @import("kernel").vga; -const assert = @import("std").debug.assert; +usingnamespace @import("kernel"); var stack: [*]usize = undefined; // Stack of free physical page. var stack_index: usize = 0; // Index into the stack. diff --git a/src/arch/x86/paging.zig b/src/arch/x86/paging.zig index 0c6219a..cd93b3c 100644 --- a/src/arch/x86/paging.zig +++ b/src/arch/x86/paging.zig @@ -1,8 +1,5 @@ -const x86 = @import("lib/index.zig"); -const memory = @import("memory.zig"); -const interrupt = @import("interrupt.zig"); -const assert = @import("std").debug.assert; -const println = @import("../../vga.zig").println; +usingnamespace @import("kernel"); +usingnamespace @import("x86"); extern fn setupPaging(phys_pd: usize) void; diff --git a/src/console.zig b/src/console.zig index e166398..3c1d1b0 100644 --- a/src/console.zig +++ b/src/console.zig @@ -1,16 +1,11 @@ -const interrupt = @import("arch/x86/interrupt.zig"); -const paging = @import("arch/x86/paging.zig"); -const ps2 = @import("ps2.zig"); -const pci = @import("pci.zig"); -const mem = @import("std").mem; -usingnamespace @import("vga.zig"); +usingnamespace @import("kernel"); var command: [10]u8 = undefined; var command_len: usize = 0; fn execute(com: []u8) void { - if (mem.eql(u8, com, "lspci")) pci.lspci(); - if (mem.eql(u8, com, "paging")) paging.addrspace(); + if (@import("std").mem.eql(u8, com, "lspci")) pci.lspci(); + if (@import("std").mem.eql(u8, com, "paging")) x86.paging.addrspace(); } pub fn keypress(char: u8) void { @@ -35,6 +30,6 @@ pub fn keypress(char: u8) void { } pub fn initialize() void { - interrupt.registerIRQ(1, ps2.keyboard_handler); + @import("x86").interrupt.registerIRQ(1, ps2.keyboard_handler); print("> "); } diff --git a/src/index.zig b/src/index.zig index 90dc75f..7d340ec 100644 --- a/src/index.zig +++ b/src/index.zig @@ -1,3 +1,8 @@ -pub const vga = @import("vga.zig"); -pub const main = @import("main.zig"); -pub const multiboot = @import("multiboot.zig"); +usingnamespace @import("vga.zig"); +const main = @import("main.zig"); +const multiboot = @import("multiboot.zig"); +const console = @import("console.zig"); +const pci = @import("pci.zig"); +const ps2 = @import("ps2.zig"); + +const assert = @import("std").debug.assert; diff --git a/src/main.zig b/src/main.zig index b8c4bb6..0a75f22 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,10 +1,5 @@ -usingnamespace @import("multiboot.zig"); -usingnamespace @import("vga.zig"); -const pci = @import("pci.zig"); -const arch = @import("arch/x86/lib/index.zig"); -const console = @import("console.zig"); -const x86 = @import("arch/x86/main.zig"); -const assert = @import("std").debug.assert; +usingnamespace @import("kernel"); +const x86 = @import("x86"); // arch independant initialization export fn kmain(magic: u32, info: *const MultibootInfo) noreturn { diff --git a/src/multiboot.zig b/src/multiboot.zig index e049ed5..936c59e 100644 --- a/src/multiboot.zig +++ b/src/multiboot.zig @@ -1,18 +1,13 @@ // MULTIBOOT1 // https://www.gnu.org/software/grub/manual/multiboot/multiboot.html -// zig fmt: off -const tty = @import("tty.zig"); -const cstr = @import("std").cstr; -const Process = @import("process.zig").Process; - // This should be in EAX. pub const MULTIBOOT_BOOTLOADER_MAGIC = 0x2BADB002; // Is there basic lower/upper memory information? -pub const MULTIBOOT_INFO_MEMORY = 0x00000001; +pub const MULTIBOOT_INFO_MEMORY = 0x00000001; // Is there a full memory map? -pub const MULTIBOOT_INFO_MEM_MAP = 0x00000040; +pub const MULTIBOOT_INFO_MEM_MAP = 0x00000040; // System information structure passed by the bootloader. pub const MultibootInfo = packed struct { @@ -32,33 +27,33 @@ pub const MultibootInfo = packed struct { // Boot-Module list. mods_count: u32, - mods_addr: u32, + mods_addr: u32, syms: extern union { // present if flags[4] nlist: extern struct { - tabsize: u32, - strsize: u32, - addr: u32, - _reserved: u32, + tabsize: u32, + strsize: u32, + addr: u32, + _reserved: u32, }, // present if flags[5] shdr: extern struct { - num: u32, - size: u32, - addr: u32, - shndx: u32, + num: u32, + size: u32, + addr: u32, + shndx: u32, }, }, // Memory Mapping buffer. // present if flags[6] mmap_length: u32, - mmap_addr: u32, + mmap_addr: u32, // Drive Info buffer. drives_length: u32, - drives_addr: u32, + drives_addr: u32, // ROM configuration table. config_table: u32, @@ -70,9 +65,9 @@ pub const MultibootInfo = packed struct { apm_table: u32, // Video. - vbe_control_info: u32, - vbe_mode_info: u32, - vbe_mode: u16, + vbe_control_info: u32, + vbe_mode_info: u32, + vbe_mode: u16, vbe_interface_seg: u16, vbe_interface_off: u16, vbe_interface_len: u16, @@ -109,30 +104,30 @@ pub const MultibootInfo = packed struct { // Types of memory map entries. pub const MULTIBOOT_MEMORY_AVAILABLE = 1; -pub const MULTIBOOT_MEMORY_RESERVED = 2; +pub const MULTIBOOT_MEMORY_RESERVED = 2; // Entries in the memory map. pub const MultibootMMapEntry = packed struct { size: u32, addr: u64, - len: u64, + len: u64, type: u32, }; pub const MultibootModule = packed struct { // The memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive. mod_start: u32, - mod_end: u32, + mod_end: u32, - cmdline: u32, // Module command line. - pad: u32, // Padding to take it to 16 bytes (must be zero). + cmdline: u32, // Module command line. + pad: u32, // Padding to take it to 16 bytes (must be zero). }; // Multiboot structure to be read by the bootloader. const MultibootHeader = packed struct { - magic: u32, // Must be equal to header magic number. - flags: u32, // Feature flags. - checksum: u32, // Above fields plus this one must equal 0 mod 2^32. + magic: u32, // Must be equal to header magic number. + flags: u32, // Feature flags. + checksum: u32, // Above fields plus this one must equal 0 mod 2^32. // following fields are used if flag bit 16 is specified header_addr: u32 = 0, load_addr: u32 = 0, @@ -144,15 +139,15 @@ const MultibootHeader = packed struct { // Place the header at the very beginning of the binary. export const multiboot_header align(4) linksection(".multiboot") = multiboot: { - const MAGIC = u32(0x1BADB002); // multiboot magic - const ALIGN = u32(1 << 0); // Align loaded modules at 4k - const MEMINFO = u32(1 << 1); // Receive a memory map from the bootloader. - const ADDR = u32(1 << 16); // Load specific addr - const FLAGS = ALIGN | MEMINFO; // Combine the flags. + const MAGIC = u32(0x1BADB002); // multiboot magic + const ALIGN = u32(1 << 0); // Align loaded modules at 4k + const MEMINFO = u32(1 << 1); // Receive a memory map from the bootloader. + const ADDR = u32(1 << 16); // Load specific addr + const FLAGS = ALIGN | MEMINFO; // Combine the flags. - break :multiboot MultibootHeader { - .magic = MAGIC, - .flags = FLAGS, + break :multiboot MultibootHeader{ + .magic = MAGIC, + .flags = FLAGS, .checksum = ~(MAGIC +% FLAGS) +% 1, }; }; diff --git a/src/pci.zig b/src/pci.zig index 320a6c6..bd124ee 100644 --- a/src/pci.zig +++ b/src/pci.zig @@ -1,10 +1,10 @@ -const arch = @import("arch/x86/lib/index.zig"); +usingnamespace @import("kernel"); +const arch = @import("x86"); +const std = @import("std"); +const virtio = @import("virtio.zig"); const PCI_CONFIG_ADDRESS = 0xCF8; const PCI_CONFIG_DATA = 0xCFC; -usingnamespace @import("vga.zig"); -const virtio = @import("virtio.zig"); -const std = @import("std"); // https://wiki.osdev.org/Pci pub const PciAddress = packed struct { diff --git a/src/ps2.zig b/src/ps2.zig index 22b76ed..2b80d5b 100644 --- a/src/ps2.zig +++ b/src/ps2.zig @@ -1,6 +1,5 @@ -usingnamespace @import("vga.zig"); -const x86 = @import("arch/x86/lib/index.zig"); -const console = @import("console.zig"); +usingnamespace @import("kernel"); +const x86 = @import("x86"); const PS2_DATA = 0x60; const PS2_STATUS = 0x64; diff --git a/src/vga.zig b/src/vga.zig index 223b70b..c3f4d78 100644 --- a/src/vga.zig +++ b/src/vga.zig @@ -1,6 +1,4 @@ -const builtin = @import("builtin"); -const mem = @import("std").mem; -const arch = @import("arch/x86/lib/index.zig"); +const arch = @import("x86"); const std = @import("std"); // Screen size. @@ -79,7 +77,7 @@ const VGA = struct { //// // Clear the screen. pub fn clear(self: *VGA) void { - mem.set(VGAEntry, self.vram[0..VGA_SIZE], self.entry(' ')); + std.mem.set(VGAEntry, self.vram[0..VGA_SIZE], self.entry(' ')); self.cursor = 0; self.updateCursor(); @@ -145,9 +143,9 @@ const VGA = struct { const last = VGA_SIZE - VGA_WIDTH; // Index of last line. // Copy all the screen (apart from the first line) up one line. - mem.copy(VGAEntry, self.vram[0..last], self.vram[first..VGA_SIZE]); + std.mem.copy(VGAEntry, self.vram[0..last], self.vram[first..VGA_SIZE]); // Clean the last line. - mem.set(VGAEntry, self.vram[last..VGA_SIZE], self.entry(' ')); + std.mem.set(VGAEntry, self.vram[last..VGA_SIZE], self.entry(' ')); // Bring the cursor back to the beginning of the last line. self.cursor -= VGA_WIDTH;