# HG changeset patch # User taiki # Date 1362735801 -32400 # Node ID 37217fa15dbeefad8c9651c1f9e97edf8ecb0679 # Parent c091673f55e1795e68357c602b0957ca9f692252 add get memory map diff -r c091673f55e1 -r 37217fa15dbe Makefile --- a/Makefile Tue Mar 05 12:14:12 2013 +0900 +++ b/Makefile Fri Mar 08 18:43:21 2013 +0900 @@ -73,6 +73,7 @@ devschemes/devschemes.o \ $(ARCH)/sysdeps.o \ $(ARCH)/elilo_kernel.o \ + $(ARCH)/ready_kernel.o \ $(FILESYSTEMS) TARGETS = elilo.efi diff -r c091673f55e1 -r 37217fa15dbe x86_64/elilo_kernel.c --- a/x86_64/elilo_kernel.c Tue Mar 05 12:14:12 2013 +0900 +++ b/x86_64/elilo_kernel.c Fri Mar 08 18:43:21 2013 +0900 @@ -1,264 +1,6 @@ -#include -#include - -#include "elilo.h" -#include "pgtable_flags.h" -#include "sysdeps.h" -#include "registers.h" - - -#define ALIGN_4K 12 /* use 4KB aligned */ - -#define MEMCPY(to, from, cnt) { \ - UINT8 *t = (UINT8 *)(to); \ - UINT8 *f = (UINT8 *)(from); \ - UINTN n = cnt; \ - if (t && f && n && (tf)) { \ - t += n; \ - f += n; \ - while (n--) { \ - *t-- = *f--; \ - } \ - } \ -} - -#define MEMSET(ptr, size, val) { \ - UINT8 *p = (UINT8 *)(ptr); \ - UINTN n = (UINTN)(size); \ - UINT8 v = (UINT8)(val); \ - if (p && n) { \ - while (n--) { \ - *p++ = v; \ - } \ - } \ -} - -/* -VOID -enable_efer_flags() -{ - - asm volatile ("movl %0, %%ecx \n\t rdmsr \n\t btsl %1, %%eax\n\t wrmsr " :: "r"(msr_efer) ,"r"(efer_flg)); -} - -disable_efer_flags() -{ - asm volatile ("movl %0, %%ecx \n\t rdmsr \n\t btsl %1, %%eax\n\t wrmsr " :: "r"(msr_efer) ,"r"(efer_flg)); -} -*/ -extern pml4_t *pml4; -extern pdpte_t *pdpte; - -VOID -cpuid(UINTN *eax, UINTN *ebx, UINTN *ecx, UINTN *edx) -{ - asm volatile ("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) - : "0" (*eax), "2" (*ecx) : "memory"); -} - -INTN -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(UINT64 addr) +void +kernel_main() { - 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); - asm volatile("mov %0,%%cr3": : "r" (cr3)); - Print(L"Written cr3.\n"); - return 0; -} - -INTN -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; - 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)); - return 0; -} - -VOID -init_pgtable_value(VOID *addr, UINT32 size, UINT64 value) -{ - if (addr == NULL) { - Print(L"addr is not using.\n"); - return; - } - - UINT64 *tmp = (UINT64 *)addr; - - while(size--) { - *tmp++ = value; - } } - -#define PML4_START 0x00101000 -#define PDPTE_START PML4_START + PML4_SIZE - -/* alloc pages use how many pages for 4KiB */ -#define PGCNT_BYTE 4096 - -/* PDPTE indicate original page is 1GB */ -#define ORIG_PAGE_SIZE 1048576 - - -/* init_pgtable() - * init pagetable. use IA-32e page table - * This function initialize PML4 and PDPTE - */ -UINT64 -init_pgtable() -{ - pml4 = (pml4_t *)PML4_START; - UINTN pml4_size = PML4_SIZE * sizeof(pml4_t) / PGCNT_BYTE; - Print(L"allocate pml4 ::%lx \n", pml4); - pml4 = (pml4_t *)alloc_pages(pml4_size, EfiLoaderData, AllocateAddress, pml4); - Print(L"pml4 :%lx\n", pml4); - if (pml4 == NULL) { - Print(L"can not allocate pml4.\n"); - return -1; - } - - pdpte = (pdpte_t *)PDPTE_START; - Print(L"allocate pdpte ::%lx\n", pdpte); - UINTN pdpte_size = PDPTE_SIZE * PML4_SIZE * sizeof(pdpte_t) / PGCNT_BYTE; - pdpte = (pdpte_t *)alloc_pages(pdpte_size , EfiLoaderData, AllocateAddress, pdpte); - Print(L"pdpte :%lx\n", pdpte); - - if (pdpte == NULL) { - Print(L"can not allocate pdpte.\n"); - return -1; - } - - init_pgtable_value((VOID *)pml4, PML4_SIZE * sizeof(pml4_t), 0); - init_pgtable_value((VOID *)pdpte, PDPTE_SIZE * PML4_SIZE * sizeof(pdpte_t), 0); - - UINT64 orig_addr_start = PDPTE_START + (PDPTE_SIZE * PML4_SIZE * sizeof(UINT64)); - UINTN i = 0; - for (; i> ALIGN_4K; - pml4[i].paddr = tmp_pdpte_addr; - pml4[i].p = ENABLE; - UINTN j = 0; - for (;j < PDPTE_SIZE; j++) { - pdpte[(PDPTE_SIZE * i) + j].p = ENABLE; - pdpte[(PDPTE_SIZE * i) + j].ps = ENABLE; - pdpte[(PDPTE_SIZE * i) + j].paddr = orig_addr_start + (PDPTE_SIZE * i + j * ORIG_PAGE_SIZE) * sizeof(UINT64); - } - } - - return (UINT64)pml4; -} - -VOID -stop_kernel() -{ - Print(L"stop\n"); - while(1) { - } -} - -EFI_STATUS -start_elilo_kernel(EFI_HANDLE image) -{ - mmap_desc_t mmapd; - get_memmap(&mmapd); - UINTN cookie = mmapd.cookie; - - while(1) {} - - 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) ); - - UINTN eax = 0, ebx = 0, ecx = 0, edx = 0; - eax = 0x80000008; - cpuid(&eax, &ebx, &ecx, &edx); - Print(L"eax %x\n", eax); - eax &= PHYADDR_WIDTH; - Print(L"use pagetable wise %d\n", eax); - - Print(L"init pagetable...\n"); - init_pgtable(); - - Print(L"enable cr4 pae...\n"); - - UINT64 addr = PML4_START; - Print(L"insert addr %lx to cr3...\n", addr); - insert_addr_to_cr3(addr); - - Print(L"enable paging cr0...\n"); - enable_cr4_pae(); - enable_paging_cr0(); - - while(1) { } - - Print(L"finish to initialize...\n"); - - asm volatile ("hlt" : : ); - Print(L"finish internal kernel\n"); - return EFI_SUCCESS; -}