Add support to identify KCB on 32bit and correctly abort if it fails.
authorGerd Zellweger <mail@gerdzellweger.com>
Mon, 10 Nov 2014 13:35:22 +0000 (14:35 +0100)
committerGerd Zellweger <mail@gerdzellweger.com>
Mon, 10 Nov 2014 13:35:22 +0000 (14:35 +0100)
include/arch/x86_32/barrelfish/invocations_arch.h
kernel/arch/x86_32/init.c
kernel/arch/x86_32/syscall.c
usr/drivers/cpuboot/main.c
usr/drivers/cpuboot/x86boot.c
usr/kaluga/start_cpu.c

index 29d9765..25d345d 100644 (file)
@@ -291,12 +291,7 @@ static inline errval_t invoke_vnode_unmap(struct capref cap, capaddr_t mapping_c
 static inline errval_t invoke_frame_identify(struct capref frame,
                                              struct frame_identity *ret)
 {
-    uint8_t invoke_bits = get_cap_valid_bits(frame);
-    capaddr_t invoke_cptr = get_cap_addr(frame) >> (CPTR_BITS - invoke_bits);
-
-    struct sysret sysret =
-        syscall2((invoke_bits << 16) | (FrameCmd_Identify << 8)
-                 | SYSCALL_INVOKE, invoke_cptr);
+    struct sysret sysret = cap_invoke1(frame, FrameCmd_Identify);
 
     assert(ret != NULL);
     if (err_is_ok(sysret.error)) {
index bad4df9..ddfbf15 100644 (file)
@@ -773,6 +773,10 @@ void arch_init(uint32_t magic, void *pointer)
         break;
     }
 
+    if (kcb_current == 0x0) {
+        panic("Did not receive a valid KCB.");
+    }
+
     if(magic != KERNEL_BOOT_MAGIC) {
         // Construct the global structure and store its address to retrive it
         // across relocation
index 0ae1657..683e53d 100644 (file)
@@ -575,6 +575,20 @@ static struct sysret handle_frame_scc_identify(struct capability *to,
 }
 #endif
 
+static struct sysret handle_kcb_identify(struct capability *to,
+                                         int cmd, uintptr_t *args)
+{
+    // Return with physical base address of frame
+    // XXX: pack size into bottom bits of base address
+    assert(to->type == ObjType_KernelControlBlock);
+    lvaddr_t vkcb = (lvaddr_t) to->u.kernelcontrolblock.kcb;
+    assert((vkcb & BASE_PAGE_MASK) == 0);
+    return (struct sysret) {
+        .error = SYS_ERR_OK,
+        .value = mem_to_local_phys(vkcb) | OBJBITS_KCB,
+    };
+}
+
 static struct sysret handle_io(struct capability *to, int cmd, uintptr_t *args)
 {
     uint32_t    port = args[0];
@@ -764,6 +778,9 @@ static invocation_handler_t invocations[ObjType_Num][CAP_MAX_CMD] = {
         [DispatcherCmd_PerfMon]      = handle_dispatcher_perfmon,
         [DispatcherCmd_DumpPTables]  = dispatcher_dump_ptables,
     },
+    [ObjType_KernelControlBlock] = {
+        [FrameCmd_Identify] = handle_kcb_identify,
+    },
     [ObjType_Frame] = {
         [FrameCmd_Identify] = handle_frame_identify,
         [FrameCmd_ModifyFlags] = handle_frame_modify_flags,
index 3464001..d048c59 100644 (file)
@@ -506,7 +506,7 @@ int main (int argc, char **argv)
     initialize();
     int ret = -1;
 
-    DEBUG("x86boot start");
+    DEBUG("x86boot start\n");
     
     // ENSURE_SEQUENTIAL
     errval_t err;
@@ -517,7 +517,7 @@ int main (int argc, char **argv)
     }
     //
 
-    DEBUG("x86boot got lock");
+    DEBUG("x86boot got lock\n");
     // Parse arguments, call handler function
     int c;
     while (1) {
index faca4f5..4356a3b 100644 (file)
@@ -621,11 +621,14 @@ errval_t spawn_xcore_monitor(coreid_t coreid, int hwid,
 
 
     struct frame_identity fid;
-    invoke_frame_identify(kcb, &fid);
+    err = invoke_frame_identify(kcb, &fid);
+    if (err_is_fail(err)) {
+        USER_PANIC_ERR(err, "Invoke frame identity for KCB failed. "
+                            "Did you add the syscall handler for that architecture?");
+    }
     DEBUG("%s:%s:%d: fid.base is 0x%"PRIxGENPADDR"\n",
            __FILE__, __FUNCTION__, __LINE__, fid.base);
     core_data->kcb = (genpaddr_t) fid.base;
-
 #ifdef CONFIG_FLOUNDER_BACKEND_UMP_IPI
     core_data->chan_id           = chanid;
 #endif
index 339e1be..efcc400 100644 (file)
@@ -56,7 +56,9 @@ static void cpu_change_event(octopus_mode_t mode, char* record, void* state)
         if (mi != NULL) {
             err = mi->start_function(0, mi, record);
             if (err_is_fail(err)) {
-                USER_PANIC_ERR(err, "start function failed.");
+                printf("Boot driver not found. Do not boot discovered CPU %"PRIu64".\n", 
+                       barrelfish_id);
+                goto out;
             }
             assert(err_is_ok(err));
         }