changeset 1:259b5f0e03ba

add registers.h
author taiki
date Tue, 26 Mar 2013 17:51:58 +0900
parents 8d0e5be5d742
children 08b78c2f55c6
files bootx64.c registers.h
diffstat 2 files changed, 75 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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 <efi.h>
 #include <efilib.h>
 
+#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;
 }
--- /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 */