# HG changeset patch # User taiki # Date 1364287918 -32400 # Node ID 259b5f0e03ba414c1db71c7a7f981fde87d48726 # Parent 8d0e5be5d7427b63cf395be91ddbf6d9aa5ebde1 add registers.h diff -r 8d0e5be5d742 -r 259b5f0e03ba bootx64.c --- a/bootx64.c Tue Mar 19 14:06:26 2013 +0900 +++ b/bootx64.c Tue Mar 26 17:51:58 2013 +0900 @@ -1,6 +1,8 @@ #include #include +#include "registers.h" + EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { @@ -79,7 +81,14 @@ Print(L"error 'exit boot services' %r \n", status); } + asm volatile ("cli" ::); + + cr0_t cr0; + asm volatile("mov %%cr0,%0\n\t" : "=r" (cr0)); while(1) { } + cr0.pg = 0; + asm volatile("mov %0, %%cr0" : : "r" (cr0)); + return EFI_SUCCESS; } diff -r 8d0e5be5d742 -r 259b5f0e03ba registers.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/registers.h Tue Mar 26 17:51:58 2013 +0900 @@ -0,0 +1,66 @@ +#ifndef REGISTERS +#define REGISTERS + +typedef struct _cr3_t { + UINT64 ignored1:3; + UINT64 pwt:1; /* page-level write through */ + UINT64 pcd:1; /* page-level cache disable */ + UINT64 ignored2:7; + UINT64 pdb:40; /* page directory base */ + UINT64 reserved :12; +} cr3_t; +#define PHYADDR_WIDTH 127 + +typedef struct _cr4_t { + UINT64 vme:1; + UINT64 pvi:1; + UINT64 tsd:1; + UINT64 de:1; + UINT64 pse:1; // page size extensions + UINT64 pae:1; // physical address extension + UINT64 mce:1; + UINT64 pge:1; + UINT64 pce:1; + UINT64 osfxsr:1; + UINT64 osxmmexcept:1; + UINT64 ignored2 :2; + UINT64 vmxe: 1; + UINT64 smxe: 1; + UINT64 ignored3: 1; + UINT64 fsgsbase: 1; + UINT64 pcide: 1; + UINT64 osxsave: 1; + UINT64 ignored4: 1; + UINT64 smep: 1; + UINT64 reserved:43; +} cr4_t; + +typedef struct _cr0_t { + UINT64 pe :1; + UINT64 mp :1; + UINT64 em :1; + UINT64 ts :1; + UINT64 et :1; + UINT64 ne :1; + UINT64 ignored1 :10; + UINT64 wp :1; + UINT64 ignored2 :1; + UINT64 am :1; + UINT64 ignored3 :10; + UINT64 nw :1; + UINT64 cd :1; + UINT64 pg :1; /* pageing */ +} cr0_t; + +typedef struct _efer_t { + UINT64 syscall_enable :1; + UINT64 reserved1:7; + UINT64 ia32e_enable :1; + UINT64 reserved2 :1; + UINT64 ia32e_active :1; + UINT64 edb_enable :1; + UINT64 reserved3 :52; +} efer_t; + + +#endif /* REGISTERS */