diff --git a/service/ptos/arch/amd64/cpu/locore.S b/service/ptos/arch/amd64/cpu/locore.S index 405903e..bc9c5fd 100644 --- a/service/ptos/arch/amd64/cpu/locore.S +++ b/service/ptos/arch/amd64/cpu/locore.S @@ -9,6 +9,89 @@ .text .globl MdBspEntry MdBspEntry: - cli - hlt - jmp MdBspEntry + cli /* Disable interrupts on startup */ + cld /* Just in case, can't predict the state */ + xor %rbp, %rbp /* Terminate callstack for traces */ + + lea g_GDTR(%rip), %rdi + call MdGdtLoad +1: hlt + jmp 1b + + .text + .globl MdGdtLoad +MdGdtLoad: + push %r12 + push %r13 + push %r14 + push %r15 + push %rbx + push %rbp + + lgdt (%rdi) + push $0x08 + lea 1f(%rip), %rbx + push %rbx + lretq +1: mov $0x10, %ax + mov %ax, %ds + mov %ax, %es + mov %ax, %ss + mov %ax, %fs + xor %ax, %ax + mov %ax, %gs + + pop %rbp + pop %rbx + pop %r15 + pop %r14 + pop %r13 + pop %r12 + retq + + .section .data + .globl g_GDT +g_GDT: +.NULL: + .word 0x0000 + .word 0x0000 + .byte 0x00 + .byte 0b00000000 + .byte 0b00000000 + .byte 0x00 +.CODE: + .word 0x0000 + .word 0x0000 + .byte 0x00 + .byte 0b10011010 + .byte 0b00100000 + .byte 0x00 +.DATA: + .word 0x0000 + .word 0x0000 + .byte 0x00 + .byte 0b10010010 + .byte 0b00000000 + .byte 0x00 +.UCODE: + .word 0x0000 + .word 0x0000 + .byte 0x00 + .byte 0b11111010 + .byte 0b10101111 + .byte 0x00 +.UDATA: + .word 0x0000 + .word 0x0000 + .byte 0x00 + .byte 0b11110010 + .byte 0b00000000 + .byte 0x00 +.TSS: + .quad 0x00 + .quad 0x00 + + .globl g_GDTR +g_GDTR: + .word g_GDTR - g_GDT + .quad g_GDT