changeset 6:c091673f55e1

add get memory map
author taiki
date Tue, 05 Mar 2013 12:14:12 +0900
parents 18072b56ac6e
children 37217fa15dbe
files Make.rules elilo.c x86_64/elilo_kernel.c
diffstat 3 files changed, 41 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/Make.rules	Tue Feb 26 13:47:49 2013 +0900
+++ b/Make.rules	Tue Mar 05 12:14:12 2013 +0900
@@ -27,6 +27,8 @@
 	$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \
 		   -j .rela -j .reloc --target=$(FORMAT) $*.so $@
 	cp $(TARGETS) bootx64.efi
+	mount -t vfat /dev/sdb1 /mnt/sdb1
+	cp bootx64.efi /mnt/sdb1/EFI/BOOT
 
 %.so: %.o 
 	$(LD) $(LDFLAGS) $^ -o $@ $(LOADLIBES)
--- a/elilo.c	Tue Feb 26 13:47:49 2013 +0900
+++ b/elilo.c	Tue Mar 05 12:14:12 2013 +0900
@@ -304,8 +304,7 @@
 	if (mmem.start_addr) free(mmem.start_addr);
 	if (bp) free_boot_params(bp);
 exit_error:
-    Print(L"Start original ELILO kernel.\n");
-    start_elilo_kernel(image, cookie);
+    start_elilo_kernel(image);
 	return ELILO_LOAD_ERROR;
 
 }
--- a/x86_64/elilo_kernel.c	Tue Feb 26 13:47:49 2013 +0900
+++ b/x86_64/elilo_kernel.c	Tue Mar 05 12:14:12 2013 +0900
@@ -63,24 +63,35 @@
 }
 
 INTN
-enable_cr4_pae(cr4_t cr4)
-{
+enable_cr4_pae()
+{   
+    cr4_t cr4;
+    MEMSET(&cr4, sizeof(UINT64), 0);
+
     asm volatile("mov %%cr4,%0\n\t" : "=r" (cr4));
+
     cr4.pae = ENABLE;
     cr4.pcide = DISABLE;
+
     asm volatile("mov %0,%%cr4": : "r" (cr4));
     //asm volatile("movq %%rax, %%cr4"::"a"(cr4_flag));
     return 0;
 }
 
 UINTN
-insert_addr_to_cr3(cr3_t cr3, UINT64 addr)
+insert_addr_to_cr3(UINT64 addr)
 {
+    cr3_t cr3;
+    MEMSET(&cr3, sizeof(UINT64), 0);
+
     // asm volatile ("movq %0, %%rax \n\tmovq %%rax, %%cr3" :: "m"(addr) );
+
     /* write cr3 */
     Print(L"Read cr3.\n");
     asm volatile("mov %%cr3,%0\n\t" : "=r" (cr3));
     Print(L"Getting cr3 is pwt:%d, pcd:%d pdb 0x%lx\n addr:%lx \n", cr3.pwt, cr3.pcd, cr3.pdb, addr);
+    Print(L"%lx\n", cr3);
+    while(1) { }
     addr = addr >> ALIGN_4K;
     cr3.pdb = addr;
     Print(L"Write addr:%lx to cr3 / cr3.pdb: %lx.\n", addr, cr3.pdb);
@@ -93,17 +104,25 @@
 disable_paging_cr0()
 {   
     cr0_t cr0;
+    MEMSET(&cr0, sizeof(UINT64), 0);
+
     asm volatile("mov %%cr0,%0\n\t" : "=r" (cr0));
+
     cr0.pg = DISABLE;
+
     asm volatile("mov %0,%%cr0": : "r" (cr0));
     // asm volatile("movl %0, %%eax \n\t movq %%rax, %%cr0"::"m"(cr0_flag));
     return 0;
 }
 
 INTN
-enable_paging_cr0(cr0_t cr0)
+enable_paging_cr0()
 {   
+    cr0_t cr0;
+    MEMSET(&cr0, sizeof(UINT64), 0);
+
     asm volatile("mov %%cr0,%0\n\t" : "=r" (cr0));
+    Print(L"Register cr0 : %lx \n", cr0);
     cr0.pg = ENABLE;
     asm volatile("mov %0,%%cr0": : "r" (cr0));
     // asm volatile("movl %0, %%eax \n\t movq %%rax, %%cr0"::"m"(cr0_flag));
@@ -193,25 +212,27 @@
 }
 
 EFI_STATUS
-start_elilo_kernel(EFI_HANDLE image, UINTN cookie)
+start_elilo_kernel(EFI_HANDLE image)
 {
-    uefi_call_wrapper(BS->ExitBootServices, 2, image, cookie);
+    mmap_desc_t mmapd;
+    get_memmap(&mmapd);
+    UINTN cookie = mmapd.cookie;
 
-    cr0_t cr0;
-    cr3_t cr3;
-    cr4_t cr4;
+    while(1) {}
 
-    MEMSET(&cr0, sizeof(UINT64), 0);
-    MEMSET(&cr3, sizeof(UINT64), 0);
-    MEMSET(&cr4, sizeof(UINT64), 0);
+	EFI_STATUS status = uefi_call_wrapper(BS->ExitBootServices, 2, image, cookie);
+    if (EFI_ERROR(status)) {
+        Print(L"EFI ERROR %r \n", status);
+    }
+    Print(L"Start original ELILO kernel.\n");
 
     asm volatile ("cli"::);
 
     MEMSET(gdt_addr.base, gdt_addr.limit, 0);
     MEMCPY(gdt_addr.base, init_gdt, sizeof_init_gdt);
 
-    // asm volatile ( "lidt %0" : : "m" (idt_addr) );
-    // asm volatile ( "lgdt %0" : : "m" (gdt_addr) );
+    asm volatile ( "lidt %0" : : "m" (idt_addr) );
+    asm volatile ( "lgdt %0" : : "m" (gdt_addr) );
 
     UINTN eax = 0, ebx = 0, ecx = 0, edx = 0;
     eax = 0x80000008;
@@ -220,9 +241,6 @@
     eax &= PHYADDR_WIDTH;
     Print(L"use pagetable wise %d\n", eax);
 
-    Print(L"disable cr0...\n");
-    disable_paging_cr0();
-
     Print(L"init pagetable...\n");
     init_pgtable();
 
@@ -230,11 +248,11 @@
 
     UINT64 addr = PML4_START;
     Print(L"insert addr %lx to cr3...\n", addr);
-    insert_addr_to_cr3(cr3, addr);
+    insert_addr_to_cr3(addr);
 
     Print(L"enable paging cr0...\n");
-    enable_cr4_pae(cr4); 
-    enable_paging_cr0(cr0);
+    enable_cr4_pae(); 
+    enable_paging_cr0();
 
     while(1) { }