Uses kref for struct page
[akaros.git] / kern / arch / i686 / pmap.c
index c221f3a..902764c 100644 (file)
@@ -9,7 +9,7 @@
 #include <arch/mmu.h>
 #include <arch/apic.h>
 
-#include <ros/error.h>
+#include <error.h>
 #include <sys/queue.h>
 
 #include <atomic.h>
@@ -55,7 +55,7 @@ segdesc_t gdt[] =
        // 0x28 - tss, initialized in idt_init()
        [GD_TSS >> 3] = SEG_NULL,
 
-       // 0x30 - LDT, set per-process in proc_startcore()
+       // 0x30 - LDT, set per-process
        [GD_LDT >> 3] = SEG_NULL
 };
 
@@ -203,6 +203,7 @@ void setup_default_mtrrs(barrier_t* smp_barrier)
        // flush tlb
        tlb_flush_global();
        // disable MTRRs, and sets default type to WB (06)
+#ifndef __CONFIG_NOMTRRS__ 
        write_msr(IA32_MTRR_DEF_TYPE, 0x00000006);
 
        // Now we can actually safely adjust the MTRRs
@@ -228,6 +229,7 @@ void setup_default_mtrrs(barrier_t* smp_barrier)
 
        // keeps default type to WB (06), turns MTRRs on, and turns off fixed ranges
        write_msr(IA32_MTRR_DEF_TYPE, 0x00000806);
+#endif 
        // reflush caches and TLB
        cache_flush();
        tlb_flush_global();
@@ -277,9 +279,9 @@ vm_init(void)
         * PSE status: 
         * - can walk and set up boot_map_segments with jumbos but can't
         *   insert yet.  need to look at the page_dir and friends.
-        * - anything related to a single struct Page still can't handle 
+        * - anything related to a single struct page still can't handle 
         *   jumbos.  will need to think about and adjust Page functions
-        * - do we want to store info like this in the struct Page?  or just check
+        * - do we want to store info like this in the struct page?  or just check
         *   by walking the PTE
         * - when we alloc a page, and we want it to be 4MB, we'll need
         *   to have contiguous memory, etc
@@ -364,6 +366,12 @@ vm_init(void)
        boot_map_segment(pgdir, (uintptr_t)LAPIC_BASE, PGSIZE, LAPIC_BASE,
                         PTE_PCD | PTE_PWT | PTE_W | PTE_G);
 
+#ifdef __CONFIG_E1000_MMIO_HACK__
+       // MMIO HACK
+       boot_map_segment(pgdir, (uintptr_t)LAPIC_BASE + PGSIZE, 0x20000, 
+                        E1000_MMIO_ADDR, PTE_PCD | PTE_PWT | PTE_W | PTE_G);
+#endif
+
        // Check that the initial page directory has been set up correctly.
        check_boot_pgdir(pse);
 
@@ -630,11 +638,6 @@ int get_va_perms(pde_t *pgdir, const void *SNT va)
        return the_pte & the_pde & (PTE_U | PTE_W | PTE_P);
 }
 
-void *get_free_va_range(pde_t *pgdir, uintptr_t addr, size_t len)
-{
-       return NULL;
-}
-
 /* Flushes a TLB, including global pages.  We should always have the CR4_PGE
  * flag set, but just in case, we'll check.  Toggling this bit flushes the TLB.
  */
@@ -697,13 +700,13 @@ page_check(void)
        }
        assert(PTE_ADDR(boot_pgdir[0]) == page2pa(pp0));
        assert(check_va2pa(boot_pgdir, 0x0) == page2pa(pp1));
-       assert(pp1->page_ref == 1);
-       assert(pp0->page_ref == 1);
+       assert(kref_refcnt(&pp1->pg_kref) == 1);
+       assert(kref_refcnt(&pp0->pg_kref) == 1);
 
        // should be able to map pp2 at PGSIZE because pp0 is already allocated for page table
        assert(page_insert(boot_pgdir, pp2, (void*SNT) PGSIZE, 0) == 0);
        assert(check_va2pa(boot_pgdir, PGSIZE) == page2pa(pp2));
-       assert(pp2->page_ref == 1);
+       assert(kref_refcnt(&pp2->pg_kref) == 1);
 
        // Make sure that pgdir_walk returns a pointer to the pte and
        // not the table or some other garbage
@@ -718,7 +721,7 @@ page_check(void)
        // should be able to map pp2 at PGSIZE because it's already there
        assert(page_insert(boot_pgdir, pp2, (void*SNT) PGSIZE, PTE_U) == 0);
        assert(check_va2pa(boot_pgdir, PGSIZE) == page2pa(pp2));
-       assert(pp2->page_ref == 1);
+       assert(kref_refcnt(&pp2->pg_kref) == 1);
 
        // Make sure that we actually changed the permission on pp2 when we re-mapped it
        {
@@ -740,8 +743,8 @@ page_check(void)
        assert(check_va2pa(boot_pgdir, 0) == page2pa(pp1));
        assert(check_va2pa(boot_pgdir, PGSIZE) == page2pa(pp1));
        // ... and ref counts should reflect this
-       assert(pp1->page_ref == 2);
-       assert(pp2->page_ref == 0);
+       assert(kref_refcnt(&pp1->pg_kref) == 2);
+       assert(kref_refcnt(&pp2->pg_kref) == 0);
 
        // pp2 should be returned by page_alloc
        assert(kpage_alloc(&pp) == 0 && pp == pp2);
@@ -751,15 +754,15 @@ page_check(void)
        page_remove(boot_pgdir, 0x0);
        assert(check_va2pa(boot_pgdir, 0x0) == ~0);
        assert(check_va2pa(boot_pgdir, PGSIZE) == page2pa(pp1));
-       assert(pp1->page_ref == 1);
-       assert(pp2->page_ref == 0);
+       assert(kref_refcnt(&pp1->pg_kref) == 1);
+       assert(kref_refcnt(&pp2->pg_kref) == 0);
 
        // unmapping pp1 at PGSIZE should free it
        page_remove(boot_pgdir, (void*SNT) PGSIZE);
        assert(check_va2pa(boot_pgdir, 0x0) == ~0);
        assert(check_va2pa(boot_pgdir, PGSIZE) == ~0);
-       assert(pp1->page_ref == 0);
-       assert(pp2->page_ref == 0);
+       assert(kref_refcnt(&pp1->pg_kref) == 0);
+       assert(kref_refcnt(&pp2->pg_kref) == 0);
 
        // so it should be returned by page_alloc
        assert(kpage_alloc(&pp) == 0 && pp == pp1);
@@ -771,8 +774,8 @@ page_check(void)
        // forcibly take pp0 back
        assert(PTE_ADDR(boot_pgdir[0]) == page2pa(pp0));
        boot_pgdir[0] = 0;
-       assert(pp0->page_ref == 1);
-       pp0->page_ref = 0;
+       assert(kref_refcnt(&pp0->pg_kref) == 1);
+       page_setref(pp0, 0);
 
        // Catch invalid pointer addition in pgdir_walk - i.e. pgdir + PDX(va)
        {
@@ -786,7 +789,7 @@ page_check(void)
 
          // Clean up again
          boot_pgdir[PDX(va)] = 0;
-         pp0->page_ref = 0;
+         page_setref(pp0, 0);
        }
 
        // give free list back