bits 16 org 0x7c3e kernel_sectors equ 64 kernel_segment equ 0x3000 support_flags equ 0x4000 pci_hw_char equ 0x4001 pci_ver equ 0x4002 last_pci_bus equ 0x4004 pci_support equ 0x80 pae_support equ 0x40 in al, 0x92 or al, 0x02 out 0x92, al xor ax, ax mov ss, ax mov sp, 0x7ffc mov ax, 0x0013 int 0x10 mov ax, kernel_segment mov es, ax mov ax, 0x0200 + kernel_sectors xor bx, bx mov cx, 0x0002 xor dh, dh int 0x13 mov ax, 0xb101 int 0x1a cmp edx, 0x20494350 jne no_pci test ah, ah jnz no_pci mov byte [support_flags], pci_support mov byte [pci_hw_char], al mov word [pci_ver], bx mov byte [last_pci_bus], cl no_pci: mov eax, 1 cpuid test dl, 0x40 jz no_pae or byte [support_flags], pae_support no_pae: mov ax, 0x1000 mov es, ax xor di, di mov edx, 0x534d4150 xor ebx, ebx mmap_loop: mov eax, 0xe820 mov ecx, 24 int 0x15 jc mmap_end add di, 24 test ebx, ebx jnz mmap_loop mmap_end: mov word [0x4006], di cli lgdt [gdt] mov eax, cr0 or al, 0x01 mov cr0, eax jmp 0x10:pmode bits 32 pmode: mov ax, 0x18 mov ds, ax mov es, ax mov ss, ax mov esp, 0x00040000 xor ebp, ebp call kernel_segment * 16 halt: hlt jmp halt times $$ + 510 - 0x3e - $ - (gdt.e - gdt) db 0 gdt: dw .e - .t dd .t .t: dq 0x0000_0000_0000_0000;0x00: null dq 0x0040_8900_4f98_0068;0x08: tss, 0x4f98 dq 0x00cf_9a00_0000_ffff;0x10: kernel code dq 0x00cf_9200_0000_ffff;0x18: kernel data dq 0x00cf_fa00_0000_ffff;0x20: user code dq 0x00cf_f200_0000_ffff;0x28: user data .e: dw 0xaa55