Kernel message sanity checks
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 31 May 2011 18:08:14 +0000 (11:08 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:03 +0000 (17:36 -0700)
Ensures the message went to the proper endpoint.  Now that the slab
allocator was fixed, this shouldn't happen again, but I can imagine
other bugs that would cause it, with crazy results.

Also added a couple other asserts / TODOs.

kern/arch/i686/smp_boot.c
kern/arch/i686/trap.c
kern/include/trap.h
kern/src/process.c

index d40f9d6..cb0dbe6 100644 (file)
@@ -226,6 +226,7 @@ uint32_t smp_main(void)
        /* This blob is the GDT, the GDT PD, and the TSS. */
        unsigned int blob_size = sizeof(segdesc_t) * SEG_COUNT +
                                 sizeof(pseudodesc_t) + sizeof(taskstate_t);
+       /* TODO: don't use kmalloc - might have issues in the future */
        void *gdt_etc = kmalloc(blob_size, 0);          /* we'll never free this btw */
        taskstate_t *my_ts = gdt_etc;
        pseudodesc_t *my_gdt_pd = (void*)my_ts + sizeof(taskstate_t);
index 172d6a9..6bcad7e 100644 (file)
@@ -434,6 +434,7 @@ uint32_t send_kernel_message(uint32_t dst, amr_t pc, TV(a0t) arg0, TV(a1t) arg1,
        // note this will be freed on the destination core
        k_msg = (kernel_message_t *CT(1))TC(kmem_cache_alloc(kernel_msg_cache, 0));
        k_msg->srcid = core_id();
+       k_msg->dstid = dst;
        k_msg->pc = pc;
        k_msg->arg0 = arg0;
        k_msg->arg1 = arg1;
@@ -517,6 +518,7 @@ void __kernel_message(struct trapframe *tf)
                                send_self_ipi(I_KERNEL_MSG);
                        /* Execute the kernel message */
                        assert(msg_cp.pc);
+                       assert(msg_cp.dstid == core_id());
                        /* TODO: when batching syscalls, this should be reread from cur_tf*/
                        msg_cp.pc(tf, msg_cp.srcid, msg_cp.arg0, msg_cp.arg1, msg_cp.arg2);
                }
@@ -567,6 +569,7 @@ void process_routine_kmsg(struct trapframe *tf)
                        send_self_ipi(I_KERNEL_MSG);
                /* Execute the kernel message */
                assert(msg_cp.pc);
+               assert(msg_cp.dstid == core_id());
                msg_cp.pc(tf, msg_cp.srcid, msg_cp.arg0, msg_cp.arg1, msg_cp.arg2);
        }
 }
index ec9737a..1d8fc2f 100644 (file)
@@ -83,6 +83,7 @@ struct kernel_message
        STAILQ_ENTRY(kernel_message NTPTV(a0t) NTPTV(a1t) NTPTV(a2t))
                NTPTV(a0t) NTPTV(a1t) NTPTV(a2t) link;
        uint32_t srcid;
+       uint32_t dstid;
        amr_t pc;
        TV(a0t) arg0;
        TV(a1t) arg1;
index 292e453..00b824a 100644 (file)
@@ -587,6 +587,7 @@ static void __proc_startcore(struct proc *p, trapframe_t *tf)
 void proc_restartcore(void)
 {
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
+       assert(!pcpui->cur_sysc);
        /* If there is no cur_tf, it is because the old one was already restarted
         * (and we weren't interrupting another one to finish).  In which case, we
         * should just smp_idle() */