#include "mem.h"
/*
* gdt to get us to 32-bit/segmented/unpaged mode
*/
GLOBL tgdt(SB),$(6*4)
/* null descriptor */
DATA tgdt+0(SB)/4, $0
DATA tgdt+4(SB)/4, $0
/* data segment descriptor for 4 gigabytes (PL 0) */
DATA tgdt+8(SB)/4, $(0xFFFF)
DATA tgdt+12(SB)/4, $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
/* exec segment descriptor for 4 gigabytes (PL 0) */
DATA tgdt+16(SB)/4, $(0xFFFF)
DATA tgdt+20(SB)/4, $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
/*
* pointer to initial gdt
*/
GLOBL tgdtptr(SB),$6
DATA tgdtptr+0(SB)/2, $(3*8)
DATA tgdtptr+2(SB)/4, $tgdt(SB)
TEXT start(SB),$0
/*
* about to walk all over ms/dos - turn off interrupts
*/
CLI
/*
* move the first 1k bytes down to low core and jump to them
* - looks wierd because it is being assembled by a 32 bit
* assembler for a 16 bit world
*/
MOVL $0,BX
INCL BX
SHLL $(10-1),BX
MOVL BX,CX
MOVL $0,SI
MOVW SI,ES
MOVL SI,DI
CLD
REP
MOVSL
/* JMPFAR* 00:$lowcore(SB) /**/
BYTE $0xEA
WORD $lowcore(SB)
WORD $0
TEXT lowcore(SB),$0
/*
* move the next 63K down
*/
MOVL $0,CX
INCL CX
SHLL $(15-1),CX
SUBL BX,CX
SHLL $1,BX
MOVL BX,SI
MOVL BX,DI
REP
MOVSL
/*
* now that we're in low core, update the DS
*/
MOVL $0,BX
MOVW BX,DS
/*
* goto protected mode
*/
/* MOVL tgdtptr(SB),GDTR /**/
BYTE $0x0f
BYTE $0x01
BYTE $0x16
WORD $tgdtptr(SB)
MOVL CR0,AX
ORL $1,AX
MOVL AX,CR0
/*
* clear prefetch queue (wierd code to avoid optimizations)
*/
CLC
JCC flush
MOVL AX,AX
flush:
/*
* set all segs
*/
/* MOVW $SELECTOR(1, SELGDT, 0),AX /**/
BYTE $0xc7
BYTE $0xc0
WORD $SELECTOR(1, SELGDT, 0)
MOVW AX,DS
MOVW AX,SS
MOVW AX,ES
/* JMPFAR* SELECTOR(2, SELGDT, 0):$protected(SB) /**/
BYTE $0xEA
WORD $mode32bit(SB)
WORD $SELECTOR(2, SELGDT, 0)
TEXT mode32bit(SB),$0
/*
* print a blue 3 on a red background
*/
MOVL $0xb8100,BX
MOVB $0x33,AL
MOVB AL,(BX)
INCW BX
MOVB $0x43,AL
MOVB AL,(BX)
/*
* Clear BSS
*/
LEAL edata(SB),SI
LEAL edata+4(SB),DI
MOVL $0,AX
MOVL AX,(SI)
LEAL end(SB),CX
SUBL DI,CX
SHRL $2,CX
REP
MOVSL
/*
* print a blue 4 on a red background
*/
MOVL $0xb8100,BX
MOVB $0x34,AL
MOVB AL,(BX)
INCW BX
MOVB $0x43,AL
MOVB AL,(BX)
here:
JMP here
/*
* stack and mach
*/
MOVL $mach0(SB),SP
MOVL SP,m(SB)
MOVL $0,0(SP)
ADDL $(MACHSIZE-4),SP /* start stack under machine struct */
MOVL $0, u(SB)
CALL main(SB)
/*
* print a blue 4 on a red background
*/
MOVL $0xb8100,BX
MOVB $0x34,AL
MOVB AL,(BX)
INCW BX
MOVB $0x43,AL
MOVB AL,(BX)
loop:
JMP loop
GLOBL mach0+0(SB), $MACHSIZE
GLOBL u(SB), $4
GLOBL m(SB), $4