From 7cb71794b276a25ec3df8ae8b4844ff1be42234a Mon Sep 17 00:00:00 2001 From: Christian Geddes Date: Wed, 20 Nov 2019 15:50:32 -0600 Subject: [PATCH] Correct ptr math and force CI i/o in kernal for machchk escalation When we take machine checks in hostboot we will escalate them to a checkstop by setting bit 31 in the PB Fir reg 0x5012000. This is done via xscom in some kernel code. There were 2 bugs found in this path. The first was in how we were calculating the MMIO addressed used to perform the xscom. The other issue was that we were not forcing the kernel code to perform a cache-inhibited store. This commit addressed both of these problems. Change-Id: I41871fa754cbedf4cdb913711ce02a00f0213334 CQ: SW481030 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/87539 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Tested-by: FSP CI Jenkins Reviewed-by: Daniel M Crowell Reviewed-by: Nicholas E Bofferding Reviewed-by: William G Hoffa --- src/kernel/machchk.C | 11 +++++++++-- src/usr/xscom/xscom.C | 7 ++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/kernel/machchk.C b/src/kernel/machchk.C index d17c1ff9012..73f5831b66d 100644 --- a/src/kernel/machchk.C +++ b/src/kernel/machchk.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2018 */ +/* Contributors Listed Below - COPYRIGHT 2013,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -180,7 +180,14 @@ void forceCheckstop() { printk( "Forcing a xstop with %p = %.16lX\n", g_xstopRegPtr, g_xstopRegValue ); - *g_xstopRegPtr = g_xstopRegValue; + + // Per PowerPC ISA : + // Store Doubleword Caching Inhibited Indexed + // stdcix RS,RA,RB + // let the effective address (EA) be the sum(RA|0)+ (RB). + // (RS) is stored into the doubleword in storage addressed by EA + asm volatile("stdcix %0,0,%1" + :: "r" (g_xstopRegValue) , "r" (reinterpret_cast (g_xstopRegPtr))); } else { diff --git a/src/usr/xscom/xscom.C b/src/usr/xscom/xscom.C index 73d7e9e22b3..3b3a59d40ec 100644 --- a/src/usr/xscom/xscom.C +++ b/src/usr/xscom/xscom.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2011,2018 */ +/* Contributors Listed Below - COPYRIGHT 2011,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -810,11 +810,8 @@ uint64_t generate_mmio_addr( TARGETING::Target* i_proc, // Build the XSCom address (relative to group 0, chip 0) XSComP9Address l_mmioAddr(i_scomAddr); - // Get the offset - uint64_t l_offset = l_mmioAddr.offset(); - // Compute value relative to target chip - l_returnAddr = l_XSComBaseAddr + l_offset; + l_returnAddr = l_XSComBaseAddr + l_mmioAddr; return l_returnAddr; }