Alexander Myltsev 0d541cf179 Fix LLVM build.
2025-01-18 15:57:47 +04:00

43 lines
1.0 KiB
ArmAsm

#include "cpu/gdt.h"
.code16
.global _start
_start:
mov $2, %al
out %al, $0x92 // enable A20
cli // 1. disable interrupts
lgdt gdt_descriptor // 2. load GDT descriptor
mov %cr0, %eax
or $1, %eax // 3. enable protected mode
mov %eax, %cr0
ljmp $SEG_KCODE << 3, $init_32bit // 4. far jump
.code32
init_32bit:
mov $SEG_KDATA << 3, %ax // 5. update segment registers
mov %ax, %ds
mov %ax, %ss
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
mov $KERN_STACK_BASE, %ebp // 6. setup stack
mov %ebp, %esp
call bootmain // 7. load and run kernel
jmp . // 8. loop forever
.balign 4
gdt_start:
.quad 0x0 // null descriptor
SEG_ASM(STA_X|STA_R, 0x0, 0xffffffff) # code seg
SEG_ASM(STA_W, 0x0, 0xffffffff) # data seg
gdt_end:
// GDT descriptor
gdt_descriptor:
.word gdt_end - gdt_start - 1 // size (16 bit)
.int gdt_start // address (32 bit)