45 lines
879 B
ArmAsm
45 lines
879 B
ArmAsm
.code16gcc
|
|
#include "assembly.h"
|
|
.section .init
|
|
ENTRY(pm_entry)
|
|
xor %ax, %ax
|
|
mov %ax, %ds
|
|
mov %ax, %es
|
|
mov %ax, %fs
|
|
mov %ax, %gs
|
|
mov %ax, %ss
|
|
mov $0x7c00, %sp
|
|
|
|
mov %cr0, %eax
|
|
and $~((1 << 30) | (1 << 29)), %eax # clear CD and NW
|
|
or $1, %al
|
|
mov %eax, %cr0
|
|
lgdtl %cs:0xff80 + gdt32_descr - pm_entry
|
|
ljmpl $8, $0xffffff80 + 2f - pm_entry
|
|
2:
|
|
.code32
|
|
mov $16, %ax
|
|
mov %ax, %ds
|
|
mov %ax, %es
|
|
mov %ax, %fs
|
|
mov %ax, %gs
|
|
mov %ax, %ss
|
|
ljmp $8, $0xffff0000
|
|
|
|
gdt32:
|
|
.quad 0
|
|
.quad 0x00cf9b000000ffff // flat 32-bit code segment
|
|
.quad 0x00cf93000000ffff // flat 32-bit data segment
|
|
.quad 0x000f9b0f0000ffff // 64K 16-bit code segment at 0xF0000
|
|
.quad 0x000f93000000ffff // 64K 16-bit data segment at 0x0
|
|
gdt32_end:
|
|
|
|
gdt32_descr:
|
|
.word gdt32_end - gdt32 - 1
|
|
.long 0xffffff80 + gdt32 - pm_entry
|
|
ENTRY_END(pm_entry)
|
|
|
|
.code16gcc
|
|
.section .resetvector
|
|
jmp pm_entry
|
|
|