summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/kernel/start.S6
-rw-r--r--src/kernel/syscall.C7
2 files changed, 9 insertions, 4 deletions
diff --git a/src/kernel/start.S b/src/kernel/start.S
index 0eda5b003..5b99ef691 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 1df43b78e..ff45f1ccf 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);
OpenPOWER on IntegriCloud