Skip the shitty e1000s on c89
[akaros.git] / kern / arch / x86 / pmap32.c
index 7d63535..526202b 100644 (file)
@@ -32,7 +32,7 @@ physaddr_t RO boot_cr3;               // Physical address of boot time page directory
 // To load the SS register, the CPL must equal the DPL.  Thus,
 // we must duplicate the segments for the user and the kernel.
 //
-segdesc_t gdt[] =
+segdesc_t gdt_in_c[] =
 {
        // 0x0 - unused (always faults -- for trapping NULL far pointers)
        SEG_NULL,
@@ -56,8 +56,11 @@ segdesc_t gdt[] =
        [GD_LDT >> 3] = SEG_NULL
 };
 
+/* Want gdt to be a pointer, not an array type (can replace it more easily) */
+segdesc_t *gdt = gdt_in_c;
+
 pseudodesc_t gdt_pd = {
-       sizeof(gdt) - 1, (unsigned long) gdt
+       sizeof(gdt_in_c) - 1, (unsigned long) gdt_in_c
 };
 
 // --------------------------------------------------------------
@@ -208,10 +211,10 @@ vm_init(void)
 
        // APIC mapping: using PAT (but not *the* PAT flag) to make these type UC
        // IOAPIC
-       boot_map_segment(pgdir, IOAPIC_BASE, PGSIZE, IOAPIC_PBASE, 
+       boot_map_segment(pgdir, IOAPIC_BASE, APIC_SIZE, IOAPIC_PBASE,
                         PTE_PCD | PTE_PWT | PTE_W | PTE_G);
        // Local APIC
-       boot_map_segment(pgdir, LAPIC_BASE, PGSIZE, LAPIC_PBASE,
+       boot_map_segment(pgdir, LAPIC_BASE, APIC_SIZE, LAPIC_PBASE,
                         PTE_PCD | PTE_PWT | PTE_W | PTE_G);
 
        // Check that the initial page directory has been set up correctly.
@@ -273,6 +276,16 @@ vm_init(void)
 
        // Flush the TLB for good measure, to kill the pgdir[0] mapping.
        tlb_flush_global();
+       core_id_ready = TRUE;
+}
+
+void x86_cleanup_bootmem(void)
+{
+       #define trampoline_pg 0x00001000UL
+       // Remove the mapping of the page used by the trampoline
+       page_remove(boot_pgdir, (void*)trampoline_pg);
+       // Remove the page table used for that mapping
+       pagetable_remove(boot_pgdir, (void*)trampoline_pg);
 }
 
 //
@@ -634,7 +647,7 @@ int env_user_mem_walk(env_t* e, void* start, size_t len,
        physaddr_t pa;
 
        assert((uintptr_t)start % PGSIZE == 0 && len % PGSIZE == 0);
-       void* end = (char*)start+len;
+       uintptr_t end = (uintptr_t)start+len;
        uint32_t pdeno_start = PDX(start);
        uint32_t pdeno_end = PDX(ROUNDUP(end,PTSIZE));
        /* concerned about overflow.  this should catch it for now, given the above
@@ -653,9 +666,8 @@ int env_user_mem_walk(env_t* e, void* start, size_t len,
                                      PTX(end) : NPTENTRIES );
                int ret;
                for (pteno = pteno_start; pteno < pteno_end; pteno++) {
-                       if (!PAGE_UNMAPPED(pt[pteno]))
-                               if((ret = callback(e, &pt[pteno], PGADDR(pdeno, pteno, 0), arg)))
-                                       return ret;
+                       if((ret = callback(e, &pt[pteno], PGADDR(pdeno, pteno, 0), arg)))
+                               return ret;
                }
        }
        return 0;