/* * Minimal Multiboot2 boot test — proves QEMU x86_64 can boot our kernel. * * SPDX-License-Identifier: MIT */ .section .multiboot, "ax" .align 8 #define MULTIBOOT2_MAGIC 0x36d76289 #define MULTIBOOT2_ARCH 0 #define MULTIBOOT2_HDR_LEN 24 mb2_header: .long MULTIBOOT2_MAGIC .long MULTIBOOT2_ARCH .long -(MULTIBOOT2_MAGIC + MULTIBOOT2_ARCH) .word MULTIBOOT2_HDR_LEN .word 0 .section .text, "ax" .code32 .global _start _start: /* Set up stack */ movl $(_stack_top), %esp /* Save Multiboot2 info */ pushl $0 pushl %eax /* magic */ pushl %ebx /* mboot info addr */ /* Jump to 64-bit code */ ljmp $0x08, $start64 .section .text64, "ax" .code64 start64: /* Set up 64-bit segments */ movw $0x10, %ax movw %ax, %ds movw %ax, %es movw %ax, %ss xorw %ax, %ax movw %ax, %fs movw %ax, %gs /* Restore Multiboot2 info */ popq %rdi /* magic */ popq %rsi /* info addr */ addq $8, %rsp /* skip padding */ /* Write 'UOS' to VGA text buffer (0xb8000) to prove we're alive */ movq $0x204F5355204F5355, %rax /* "UOS UOS" */ movq %rax, (%rax) /* Write to serial port COM1 (0x3F8) */ movw $0x3F8, %dx movb $'U', %al outb %al, (%dx) movb $'O', %al outb %al, (%dx) movb $'S', %al outb %al, (%dx) movb $' ', %al outb %al, (%dx) movb $'O', %al outb %al, (%dx) movb $'K', %al outb %al, (%dx) movb $0x0A, %al /* newline */ outb %al, (%dx) movb $0x0D, %al /* carriage return */ outb %al, (%dx) /* Halt */ cli .Lhalt: hlt jmp .Lhalt .section .bss, "aw" .align 16 _stack_bottom: .space 4096 _stack_top: