kernel: fix object creation for KCB on arm, x86_32
authorMoritz Hoffmann <moritz.hoffmann@inf.ethz.ch>
Tue, 16 Jun 2015 11:33:28 +0000 (13:33 +0200)
committerMoritz Hoffmann <moritz.hoffmann@inf.ethz.ch>
Tue, 16 Jun 2015 11:37:41 +0000 (13:37 +0200)
Signed-off-by: Moritz Hoffmann <moritz.hoffmann@inf.ethz.ch>

kernel/arch/arm_gem5/init.c
kernel/arch/arm_gem5/startup_arch.c
kernel/arch/armv5/init.c
kernel/arch/x86_32/init.c
kernel/startup.c

index bdc9ede..d629de4 100644 (file)
@@ -275,10 +275,6 @@ static void  __attribute__ ((noinline,noreturn)) text_init(void)
     // Relocate global to "memory"
     global = (struct global*)local_phys_to_mem((lpaddr_t)global);
 
-    // Relocate kcb_current to "memory"
-    kcb_current = (struct kcb *)
-        local_phys_to_mem((lpaddr_t) kcb_current);
-
     // Map-out low memory
     if(glbl_core_data->multiboot_flags & MULTIBOOT_INFO_FLAG_HAS_MMAP) {
         struct arm_coredata_mmap *mmap = (struct arm_coredata_mmap *)
@@ -365,9 +361,6 @@ void arch_init(void *pointer)
         // Construct the global structure
         memset(&global->locks, 0, sizeof(global->locks));
         
-        extern struct kcb bspkcb;
-        memset(&bspkcb, 0, sizeof(bspkcb));
-        kcb_current = &bspkcb;
     } else {
         global = (struct global *)GLOBAL_VBASE;
         memset(&global->locks, 0, sizeof(global->locks));
index d6dad3b..85c6ce7 100644 (file)
@@ -693,24 +693,28 @@ void arm_kernel_startup(void)
     /* Initialize the core_data */
     /* Used when bringing up other cores, must be at consistent global address
      * seen by all cores */
-    struct arm_core_data *core_data
-    = (void *)((lvaddr_t)&kernel_first_byte - BASE_PAGE_SIZE);
+    struct arm_core_data *core_data =
+            (void *) ((lvaddr_t)&kernel_first_byte - BASE_PAGE_SIZE);
 
     struct dcb *init_dcb;
 
-    if(hal_cpu_is_bsp())
-    {
+    if (hal_cpu_is_bsp()) {
        /* Initialize the location to allocate phys memory from */
         printf("start_free_ram = 0x%lx\n", glbl_core_data->start_free_ram);
        bsp_init_alloc_addr = glbl_core_data->start_free_ram;
 
+        /* allocate initial KCB */
+        kcb_current = (struct kcb *) local_phys_to_mem(bsp_alloc_phys(sizeof(*kcb_current)));
+        assert(kcb_current);
+
+        /* spawn init */
        init_dcb = spawn_bsp_init(BSP_INIT_MODULE_NAME, bsp_alloc_phys);
 
         pit_start(0);
 
-    }
-    else
-    {
+    } else {
+        kcb_current = (struct kcb *)
+            local_phys_to_mem((lpaddr_t) kcb_current);
 
        my_core_id = core_data->dst_core_id;
 
index 65523bd..f1be295 100644 (file)
@@ -211,9 +211,6 @@ void arch_init(uint32_t     board_id,
         debug(SUBSYS_STARTUP, "elf_file %08"PRIxLVADDR"\n", elf_file);
 
         my_core_id = hal_get_cpu_id();
-        extern struct kcb bspkcb;
-        memset(&bspkcb, 0, sizeof(bspkcb));
-        kcb_current = &bspkcb;
         
         pic_init();
         pit_init(tick_hz);
index 63c365f..8c27ee3 100644 (file)
@@ -543,9 +543,6 @@ static void  __attribute__ ((noreturn, noinline)) text_init(void)
     conio_relocate_vidmem(local_phys_to_mem(VIDEO_MEM));
 #endif
 
-    kcb_current = (struct kcb *)
-        local_phys_to_mem((lpaddr_t) kcb_current);
-
     /*
      * Also reset the global descriptor table (GDT), so we get
      * segmentation again and can catch interrupts/exceptions (the IDT
index c60555a..f073e27 100644 (file)
@@ -161,7 +161,7 @@ struct dcb *spawn_module(struct spawn_state *st,
     assert(err_is_ok(err));
 
     // on BSP core: Add BSP KCB to rootcn
-    if (apic_is_bsp()) {
+    if (arch_core_is_bsp()) {
         // cannot use caps_create_new() here, as that would zero out KCB, so
         // we replicate the cap initialization here.
         struct capability bspkcb_cap;