#include "mem.h"
/*
* Macro for calculating offset within the page directory base.
* Note that this is assembler-specific hence the '<<2'.
*/
#define PDO(a) (((((a))>>22) & 0x03FF)<<2)
TEXT _warp64(SB), $0
CLI
MOVL entry+0(FP), BP /* entry */
MOVL CR3, CX /* load address of PDB */
ADDL $KZERO, CX
MOVL PDO(KZERO)(CX), DX /* double-map KZERO at 0 */
MOVL DX, PDO(0)(CX)
MOVL CR3, CX
MOVL CX, CR3 /* load and flush the mmu */
MOVL $_start32id<>-KZERO(SB), AX
JMP* AX /* jump to identity-map */
TEXT _start32id<>(SB), $0
MOVL CR0, DX /* turn off paging */
ANDL $~PG, DX
MOVL $_stop32pg<>-KZERO(SB), AX
MOVL DX, CR0
JMP* AX /* forward into the past */
TEXT _stop32pg<>(SB), $0
MOVL multibootheader-KZERO(SB), BX
MOVL $0x2badb002, AX
JMP* BP
|