diff --git a/src/kernel/start.S b/src/kernel/start.S index 0eda5b0039b..5b99ef69152 100644 --- a/src/kernel/start.S +++ b/src/kernel/start.S @@ -5,7 +5,7 @@ # # OpenPOWER HostBoot Project # -# Contributors Listed Below - COPYRIGHT 2010,2018 +# Contributors Listed Below - COPYRIGHT 2010,2019 # [+] International Business Machines Corp. # [+] Joel Stanley # @@ -765,6 +765,10 @@ intvect_system_reset: ;// Raise priority to high. or 2,2,2 + ;// Need to send a msgysnc to prevent weak consistency issues + ;// with doorbells (they execute this path prior to dbell intr) + .long 0x7C0006EC + ;// Free up two registers temporarily. mtsprg0 r1 mtsprg1 r2 diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C index 1df43b78e96..ff45f1ccf03 100644 --- a/src/kernel/syscall.C +++ b/src/kernel/syscall.C @@ -65,19 +65,20 @@ void kernel_execute_hyp_doorbell() doorbell_clear(); //Execute all work items on doorbell_actions stack - KernelWorkItem *l_work = t->cpu->doorbell_actions.pop(); + cpu_t* l_cpu = CpuManager::getCurrentCPU(); + KernelWorkItem *l_work = l_cpu->doorbell_actions.pop(); while(l_work != nullptr) { //Execute Work Item and then delete it (*l_work)(); delete l_work; - l_work = t->cpu->doorbell_actions.pop(); + l_work = l_cpu->doorbell_actions.pop(); } //IPC messages come in only on the master, so //If this is a doorbell to the master -- check cpu_t* master = CpuManager::getMasterCPU(); - if(t->cpu == master) + if(l_cpu == master) { size_t pir = getPIR(); printk("IPC msg pir %lx incoming\n", pir);