#include "mem.h"
TEXT start(SB),$0
JMP start16
/*
* gdt to get us to 32-bit/segmented/unpaged mode
*/
TEXT tgdt(SB),$0
/* null descriptor */
LONG $0
LONG $0
/* data segment descriptor for 4 gigabytes (PL 0) */
LONG SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW
LONG 0xFFFF
/* exec segment descriptor for 4 gigabytes (PL 0) */
LONG SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(p)|SEGEXEC|SEGR
LONG 0xFFFF
/*
* pointer to initial gdt
*/
TEXT tgdtptr(SB),$0
WORD $(3*8)
LONG $tgdt(SB)
/*
* come here in (16bit) real-address mode
*/
start16:
CLI /* disable interrupts */
/* point data segment at low memory */
XORL AX,AX
MOVW AX,DS
/* point CPU at the interrupt descriptor table */
MOVL tgdt(SB),IDTR
/* point CPU at the global descriptor table */
MOVL gdtptr(SB),GDTR
/* switch to protected mode */
MOVL CR0,AX
ORL $1,AX
MOVL AX,CR0
/* clear prefetch buffer */
JMP flush
/*
* come here in USE16 protected mode
*/
flush:
/* map data and stack address to physical memory */
MOVW $SELECTOR(1, SELGDT, 0),AX
MOVW AX,DS
MOVW AX,ES
MOVW AX,SS
/* switch to 32 bit code */
JMPFAR SELECTOR(2, SELGDT, 0):start32
/*
* come here in USE32 protected mode
*/
TEXT start32(SB),$0
/* clear bss (should use REP) */
MOVL $edata(SB),SI
MOVL $edata+4(SB),DI
MOVL $end(SB),CX
SUBL DI,CX
SHRL $2,CX
XORL AX,AX
MOVL AX,edata(SB)
CLD
REP
MOVSL (SI),(DI)
/* set up stack */
MOVL $mach0(SB),AX
MOVL A0, m(SB)
MOVL $0, 0(A0)
MOVL A0, A7
ADDL $(MACHSIZE-4), A7 /* start stack under machine struct */
MOVL $0, u(SB)
CALL main(SB),$0
/* never returns */
/*
* first 16 ``standard'' traps
*/
TEXT trap0(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $0
JMP alltrap
TEXT trap1(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $1
JMP alltrap
TEXT trap2(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $2
JMP alltrap
TEXT trap3(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $3
JMP alltrap
TEXT trap4(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $4
JMP alltrap
TEXT trap5(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $5
JMP alltrap
TEXT trap6(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $6
JMP alltrap
TEXT trap7(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $7
JMP alltrap
TEXT trap8(SB),$0
PUSHL $8
JMP alltrap
TEXT trap9(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $9
JMP alltrap
TEXT trap10(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $10
JMP alltrap
TEXT trap11(SB),$0
PUSHL $11
JMP alltrap
TEXT trap12(SB),$0
PUSHL $12
JMP alltrap
TEXT trap13(SB),$0
PUSHL $13
JMP alltrap
TEXT trap14(SB),$0
PUSHL $14
JMP alltrap
TEXT trap15(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $15
JMP alltrap
/*
* invalid trap
*/
TEXT invtrap(SB),$0
PUSHL $0 /* put on an error code */
PUSHL $16
JMP alltrap
/*
* common trap code
*/
alltrap:
/* PUSHL DS /**/
PUSHAL
MOVL $KDSEL, AX
/* MOVW AX, DS /**/
CALL trap(SB)
POPAL
/* POPL DS /**/
ADDL $8,SP /* pop the trap and error codes */
IRETL