From a98393d68bb76c21015d2d41d4092f9552016bad Mon Sep 17 00:00:00 2001 From: Marin Ivanov Date: Thu, 2 May 2024 19:02:42 +0300 Subject: cleanup: prefix boot labels --- src/boot/boot.zig | 29 ++++++++++ src/boot/boot32.s | 137 ++++++++++++++++++++++++++++++++++++++++++++++ src/boot/boot64.s | 15 ++++++ src/bootstrap/boot.zig | 29 ---------- src/bootstrap/boot32.s | 143 ------------------------------------------------- src/bootstrap/boot64.s | 16 ------ src/main.zig | 2 +- 7 files changed, 182 insertions(+), 189 deletions(-) create mode 100644 src/boot/boot.zig create mode 100644 src/boot/boot32.s create mode 100644 src/boot/boot64.s delete mode 100644 src/bootstrap/boot.zig delete mode 100644 src/bootstrap/boot32.s delete mode 100644 src/bootstrap/boot64.s diff --git a/src/boot/boot.zig b/src/boot/boot.zig new file mode 100644 index 0000000..998e1e5 --- /dev/null +++ b/src/boot/boot.zig @@ -0,0 +1,29 @@ +comptime { + asm (@embedFile("boot64.s")); + asm (@embedFile("boot32.s")); +} + +const MAGIC = 0xE85250D6; +const ARCHITECTURE = 0; + +const EndTag = packed struct { + type: u16 = 0, + flags: u16 = 0, + size: u32 = 8, +}; + +const MultibootHeader = extern struct { + magic: u32, + architecture: u32, + header_len: u32, + checksum: u32, + endtag: EndTag, +}; + +export const multiboot2 align(4) linksection(".multiboot") = MultibootHeader{ + .magic = MAGIC, + .architecture = ARCHITECTURE, + .header_len = 24, + .checksum = 0x100000000 - (MAGIC + ARCHITECTURE + 24), + .endtag = EndTag{}, +}; diff --git a/src/boot/boot32.s b/src/boot/boot32.s new file mode 100644 index 0000000..5650422 --- /dev/null +++ b/src/boot/boot32.s @@ -0,0 +1,137 @@ +.global _start +.extern long_mode_start + +.section .text +.code32 + +/* Entry point. It puts the machine into a consistent state and starts long mode. */ +_start: + mov $0x80000, %esp // Setup the stack. + + call boot_check_multiboot + call boot_check_cpuid + call boot_check_long_mode + + call boot_setup_page_tables + call boot_enable_paging + + lgdt (boot_gdtdesc) + jmpl $0x8, $boot_long_mode_start + hlt + +boot_check_multiboot: + cmp $0x36d76289, %eax + jne .boot_no_multiboot + ret +.boot_no_multiboot: + mov $'M', %al + jmp boot_error + +boot_check_cpuid: + pushfd + pop %eax + mov %eax, %ecx + xor $(1 << 21), %eax + push %eax + popfd + pushfd + pop %eax + push %ecx + popfd + cmp %eax, %ecx + je .boot_no_cpuid + ret +.boot_no_cpuid: + mov $'C', %al + jmp boot_error + +boot_check_long_mode: + mov $0x80000000, %eax + cpuid + cmp $0x80000001, %eax + jb .boot_no_long_mode + + mov $0x80000001, %eax + cpuid + test $(1 << 29), %edx + jz .boot_no_long_mode + + ret +.boot_no_long_mode: + mov $'L', %al + jmp boot_error + +boot_setup_page_tables: + mov $page_table_l3, %eax + or $0b11 , %eax /* present, writable */ + mov %eax, (page_table_l4) + + mov $page_table_l2, %eax + or $0b11, %eax /* present, writable */ + mov %eax, (page_table_l3) + + mov $0, %ecx /* counter */ +.boot_pages_loop: + + mov $0x200000, %eax /* 2MiB */ + mul %ecx + or $0b10000011, %eax /* present, writable, huge page */ + mov %eax, +page_table_l2(,%ecx,8) + + inc %ecx /* increment counter */ + cmp $512, %ecx /* checks if the whole table is mapped */ + jne .boot_pages_loop /* if not, continue */ + + ret + +boot_enable_paging: + /* pass page table location to cpu */ + mov $page_table_l4, %eax + mov %eax, %cr3 + + /* enable PAE */ + mov %cr4, %eax + or $(1 << 5), %eax + mov %eax, %cr4 + + /* enable long mode */ + mov $0xC0000080, %ecx + rdmsr + or $(1 << 8), %eax + wrmsr + + /* enable paging */ + mov %cr0, %eax + or $(1 << 31), %eax + mov %eax, %cr0 + + ret + +boot_error: + /* print in VGA "ERR: X" where X is the error code */ + movl $0x4f524f45, 0xb8000 + movl $0x4f3a4f52, 0xb8004 + movl $0x4f204f20, 0xb8008 + movb %al, 0xb800a + hlt + +.section .bss +.align 4096 +page_table_l4: + .skip 4096 +page_table_l3: + .skip 4096 +page_table_l2: + .skip 4096 +stack_bottom: + .skip 4096 * 4 +stack_top: + +.section .rodata +.p2align 2 /* force 4 byte alignment */ +boot_gdt64: + .quad 0 /* zero entry */ + .quad (1 << 43) | (1 << 44) | (1 << 47) | (1 << 53) /* code segment */ +boot_gdtdesc: + .word (boot_gdtdesc - boot_gdt64 - 1) /* sizeof(gdt) - 1 */ + .long boot_gdt64 /* address gdt */ \ No newline at end of file diff --git a/src/boot/boot64.s b/src/boot/boot64.s new file mode 100644 index 0000000..e851388 --- /dev/null +++ b/src/boot/boot64.s @@ -0,0 +1,15 @@ +.global boot_long_mode_start +.extern kmain + +.section .text +.code64 +boot_long_mode_start: + // load null into all data segment registers + mov $0, %ax + mov %ax, %ss + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs + + jmp kmain \ No newline at end of file diff --git a/src/bootstrap/boot.zig b/src/bootstrap/boot.zig deleted file mode 100644 index 998e1e5..0000000 --- a/src/bootstrap/boot.zig +++ /dev/null @@ -1,29 +0,0 @@ -comptime { - asm (@embedFile("boot64.s")); - asm (@embedFile("boot32.s")); -} - -const MAGIC = 0xE85250D6; -const ARCHITECTURE = 0; - -const EndTag = packed struct { - type: u16 = 0, - flags: u16 = 0, - size: u32 = 8, -}; - -const MultibootHeader = extern struct { - magic: u32, - architecture: u32, - header_len: u32, - checksum: u32, - endtag: EndTag, -}; - -export const multiboot2 align(4) linksection(".multiboot") = MultibootHeader{ - .magic = MAGIC, - .architecture = ARCHITECTURE, - .header_len = 24, - .checksum = 0x100000000 - (MAGIC + ARCHITECTURE + 24), - .endtag = EndTag{}, -}; diff --git a/src/bootstrap/boot32.s b/src/bootstrap/boot32.s deleted file mode 100644 index dc02102..0000000 --- a/src/bootstrap/boot32.s +++ /dev/null @@ -1,143 +0,0 @@ -.global _start -.extern long_mode_start - -.section .text -.code32 - -/* Entry point. It puts the machine into a consistent state and starts long mode. */ -_start: - mov $0x80000, %esp // Setup the stack. - push %ebx // Pass multiboot info structure. - push %eax // Pass multiboot magic code. - - call check_multiboot - call check_cpuid - call check_long_mode - - call setup_page_tables - call enable_paging - - lgdt (gdtdesc) - jmpl $0x8, $long_mode_start - - call halt -halt: - hlt - -check_multiboot: - cmp $0x36d76289, %eax - jne .no_multiboot - ret -.no_multiboot: - mov $'M', %al - jmp error - -check_cpuid: - pushfd - pop %eax - mov %eax, %ecx - xor $(1 << 21), %eax - push %eax - popfd - pushfd - pop %eax - push %ecx - popfd - cmp %eax, %ecx - je .no_cpuid - ret -.no_cpuid: - mov $'C', %al - jmp error - -check_long_mode: - mov $0x80000000, %eax - cpuid - cmp $0x80000001, %eax - jb .no_long_mode - - mov $0x80000001, %eax - cpuid - test $(1 << 29), %edx - jz .no_long_mode - - ret -.no_long_mode: - mov $'L', %al - jmp error - -setup_page_tables: - mov $page_table_l3, %eax - or $0b11 , %eax /* present, writable */ - mov %eax, (page_table_l4) - - mov $page_table_l2, %eax - or $0b11, %eax /* present, writable */ - mov %eax, (page_table_l3) - - mov $0, %ecx /* counter */ -.loop: - - mov $0x200000, %eax /* 2MiB */ - mul %ecx - or $0b10000011, %eax /* present, writable, huge page */ - mov %eax, +page_table_l2(,%ecx,8) - - inc %ecx /* increment counter */ - cmp $512, %ecx /* checks if the whole table is mapped */ - jne .loop /* if not, continue */ - - ret - -enable_paging: - /* pass page table location to cpu */ - mov $page_table_l4, %eax - mov %eax, %cr3 - - /* enable PAE */ - mov %cr4, %eax - or $(1 << 5), %eax - mov %eax, %cr4 - - /* enable long mode */ - mov $0xC0000080, %ecx - rdmsr - or $(1 << 8), %eax - wrmsr - - /* enable paging */ - mov %cr0, %eax - or $(1 << 31), %eax - mov %eax, %cr0 - - ret - -error: - /* print in VGA "ERR: X" where X is the error code */ - movl $0x4f524f45, 0xb8000 - movl $0x4f3a4f52, 0xb8004 - movl $0x4f204f20, 0xb8008 - movb %al, 0xb800a - hlt - -.section .bss -.align 4096 -page_table_l4: - .skip 4096 -page_table_l3: - .skip 4096 -page_table_l2: - .skip 4096 -stack_bottom: - .skip 4096 * 4 -stack_top: - -.section .rodata -.p2align 2 /* force 4 byte alignment */ -gdt64: - .quad 0 /* zero entry */ -.code_segment: - .quad (1 << 43) | (1 << 44) | (1 << 47) | (1 << 53) /* code segment */ -gdtdesc: - .word (gdtdesc - gdt64 - 1) /* sizeof(gdt) - 1 */ - .long gdt64 /* address gdt */ \ No newline at end of file diff --git a/src/bootstrap/boot64.s b/src/bootstrap/boot64.s deleted file mode 100644 index 493912b..0000000 --- a/src/bootstrap/boot64.s +++ /dev/null @@ -1,16 +0,0 @@ -.global long_mode_start -.extern kmain - -.section .text -.code64 -long_mode_start: - // load null into all data segment registers - mov $0, %ax - mov %ax, %ss - mov %ax, %ds - mov %ax, %es - mov %ax, %fs - mov %ax, %gs - - call kmain - hlt \ No newline at end of file diff --git a/src/main.zig b/src/main.zig index 36dcd5e..e647a81 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,5 +1,5 @@ comptime { - _ = @import("bootstrap/boot.zig"); + _ = @import("boot/boot.zig"); } const debug = @import("debugcon.zig"); -- cgit v1.2.3