# HG changeset patch # User taiki # Date 1362453252 -32400 # Node ID c091673f55e1795e68357c602b0957ca9f692252 # Parent 18072b56ac6eea7817b2d8b0043c109314ca7e8d add get memory map diff -r 18072b56ac6e -r c091673f55e1 Make.rules --- 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) diff -r 18072b56ac6e -r c091673f55e1 elilo.c --- 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; } diff -r 18072b56ac6e -r c091673f55e1 x86_64/elilo_kernel.c --- 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) { }