Exposed SPARC iobus to userspace
[akaros.git] / kern / arch / sparc / boot.c
index d5f4a1b..36d806c 100644 (file)
@@ -13,8 +13,6 @@
 #pragma nodeputy
 #endif
 
-extern uintptr_t mmu_context_table[NCONTEXTS];
-
 void
 build_multiboot_info(multiboot_info_t* mbi)
 {
@@ -30,25 +28,17 @@ build_multiboot_info(multiboot_info_t* mbi)
 
 // set up a basic virtual -> physical mapping so we can boot the kernel
 void
-build_boot_pgdir(void)
+pagetable_init(void)
 {
        extern uintptr_t l1_page_table[NL1ENTRIES];
 
        // relocate symbols
-       uintptr_t* mmuctxtbl = (uintptr_t*)((uint8_t*)mmu_context_table-KERNBASE);
        uintptr_t* l1 = (uintptr_t*)((uint8_t*)l1_page_table-KERNBASE);
 
        uintptr_t kernsize = /* 4GB */ - KERNBASE;
 
-       // make all context table entries invalid
-       int i;
-       for(i = 0; i < NCONTEXTS; i++)
-               mmuctxtbl[i] = 0;
-
-       // except for the zeroth one, which points to our L1 PT
-       *mmuctxtbl = PTD((uintptr_t)l1);
-
        // make all L1 PTEs invalid by default
+       int i;
        for(i = 0; i < NL1ENTRIES; i++)
                l1[i] = 0;
 
@@ -67,24 +57,34 @@ build_boot_pgdir(void)
 void
 mmu_init(void)
 {
+       extern uintptr_t l1_page_table[NL1ENTRIES];
+       uintptr_t* l1 = (uintptr_t*)((uint8_t*)l1_page_table-KERNBASE);
+
        int zero = 0;
-       uintptr_t* mmuctxtbl = (uintptr_t*)((uint8_t*)mmu_context_table-KERNBASE);
+       uintptr_t* mmuctxtbl = (uintptr_t*)((uint8_t*)(mmu_context_tables[core_id()])-KERNBASE);
 
-       // set physical address of context table
-       store_alternate(0x100,4,(uintptr_t)mmuctxtbl>>4);
+       // make all context table entries invalid
+       int i;
+       for(i = 0; i < NCONTEXTS; i++)
+               mmuctxtbl[i] = 0;
+
+       // except for the zeroth one, which points to our L1 PT
+       *mmuctxtbl = PTD((uintptr_t)l1);
 
        // set current context (== 0)
        store_alternate(0x200,4,zero);
 
-       // turn on MMU
-       store_alternate(0x000,4,1);
+       // set physical address of context table
+       store_alternate(0x100,4,(uintptr_t)mmuctxtbl>>4);
 
+       // turn on MMU
        tlbflush();
+       store_alternate(0x000,4,1);
 }
 
 // delete temporary mappings used by the entry code
 void
-mmu_boot_cleanup(void)
+mmu_boot_cleanup_core0(void)
 {
        extern uintptr_t l1_page_table[NL1ENTRIES];
        uintptr_t kernsize = -KERNBASE;
@@ -96,39 +96,8 @@ mmu_boot_cleanup(void)
 }
 
 void
-mmu_boot(void)
+mmu_boot_cleanup_all(void)
 {
-       int id = core_id(), i, ncores = num_cores();
-
-       static volatile int barrier[MAX_NUM_CPUS] = {0};
-       static volatile int done_0 = 0, done1 = 0;
-       volatile int* done0 = (int*)((uintptr_t)&done_0 - KERNBASE); 
-
-       if(id == 0)
-       {
-               build_boot_pgdir();
-               *done0 = 1;
-       }
-       else
-               while(!*done0);
-
-       mmu_init();
-
-       extern void relocate(void);
-       relocate();
-
-       if(id == 0)
-       {
-               for(i = 1; i < ncores; i++)
-                       while(!barrier[i]);
-               mmu_boot_cleanup();
-               done1 = 1;
-       }
-       else
-       {
-               barrier[id] = 1;
-               while(!done1);
-       }
-
+       // nothing special here
        tlbflush();
 }