summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sbe/sbefw/pk_app_cfg.h29
-rw-r--r--sbe/sbefw/sbeirq.C67
-rw-r--r--sbe/sbefw/sbeirq.H27
-rwxr-xr-xsbe/test/testPutGetScom.py58
4 files changed, 180 insertions, 1 deletions
diff --git a/sbe/sbefw/pk_app_cfg.h b/sbe/sbefw/pk_app_cfg.h
index 36f8b775..a7489ab8 100644
--- a/sbe/sbefw/pk_app_cfg.h
+++ b/sbe/sbefw/pk_app_cfg.h
@@ -1,3 +1,27 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: sbe/sbefw/pk_app_cfg.h $ */
+/* */
+/* OpenPOWER sbe Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2015,2016 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
/*
* @file: ppe/sbe/sbefw/pk_app_cfg.h
*
@@ -107,4 +131,9 @@
*/
#define PK_TRACE_TIMER_OUTPUT 0
+#ifdef PPE42_MACHINE_CHECK_HANDLER
+#undef PPE42_MACHINE_CHECK_HANDLER
+#endif
+#define PPE42_MACHINE_CHECK_HANDLER SBE_MACHINE_CHECK_HANDLER
+
#endif /*__PK_APP_CFG_H__*/
diff --git a/sbe/sbefw/sbeirq.C b/sbe/sbefw/sbeirq.C
index 0f160509..efcb210b 100644
--- a/sbe/sbefw/sbeirq.C
+++ b/sbe/sbefw/sbeirq.C
@@ -1,3 +1,27 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: sbe/sbefw/sbeirq.C $ */
+/* */
+/* OpenPOWER sbe Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2015,2016 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
/*
* @file: ppe/sbe/sbefw/sbeirq.C
*
@@ -124,3 +148,46 @@ int sbeIRQSetup (void)
#undef SBE_FUNC
}
+////////////////////////////////////////////////////////////////
+// SBE handler for the PPE machine check interrupt
+////////////////////////////////////////////////////////////////
+// TODO: via RTC 155896 - Change the way bad scoms are handled.
+// Once HW375602 is fixed, there will be no need for this
+// interrupt handler.
+extern "C" void __sbe_machine_check_handler()
+{
+ asm(
+ "# Save r4 to stack, since it is going to be used by\n"
+ "# this handler\n"
+ "stwu %r1, -8(%r1)\n"
+ "stw %r4, 0(%r1)\n"
+ "# Check the MCS bits (29:31) in the ISR to determine the cause for the machine check\n"
+ "# For a data machine check, the MCS should be 0x001 to 0x011\n"
+ "mfisr %r4\n"
+ "andi. %r4, %r4, 0x0007\n"
+ "bwz %r4, __hang_forever\n"
+ "cmpwibgt %r4, 0x0003, __hang_forever\n"
+ "# The EDR contains the address that caused the machine check\n"
+ "mfedr %r4\n"
+ "srawi %r4, %r4, 16\n"
+ "# If the address is in the range 0x00000000 - 0x7f000000, we treat it as a\n"
+ "# failed scom and jump to __scom_error\n"
+ "cmplwi %r4, 0x8000\n"
+ "blt __scom_error\n"
+ "# Else, just hang here forever\n"
+ "__hang_forever:\n"
+ "b .\n"
+ "__scom_error:\n"
+ "# The srr0 contains the address of the instruction that caused the machine\n"
+ "# check (since the the interrupt is raised *before* the instruction\n"
+ "# completed execution). Since we want the code to continue with the next\n"
+ "# instruction, we increment srr0 by 4, restore r4, and rfi to branch to srr0\n"
+ "mfsrr0 %r4\n"
+ "addi %r4, %r4, 4\n"
+ "mtsrr0 %r4\n"
+ "lwz %r4, 0(%r1)\n"
+ "addi %r1, %r1, 8\n"
+ "rfi\n"
+ );
+}
+
diff --git a/sbe/sbefw/sbeirq.H b/sbe/sbefw/sbeirq.H
index acf32079..d01affbf 100644
--- a/sbe/sbefw/sbeirq.H
+++ b/sbe/sbefw/sbeirq.H
@@ -1,3 +1,27 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: sbe/sbefw/sbeirq.H $ */
+/* */
+/* OpenPOWER sbe Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2015,2016 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
/*
* $file: ppe/sbe/sbefw/sbeirq.H
*
@@ -80,6 +104,7 @@
#define SBE_IRQ_RESERVED_62 62
#define SBE_IRQ_RESERVED_63 63
-
+#define SBE_MACHINE_CHECK_HANDLER \
+ b __sbe_machine_check_handler
#endif //_SBE_IRQ_H
diff --git a/sbe/test/testPutGetScom.py b/sbe/test/testPutGetScom.py
index 63007191..53d0ea2c 100755
--- a/sbe/test/testPutGetScom.py
+++ b/sbe/test/testPutGetScom.py
@@ -1,3 +1,27 @@
+# IBM_PROLOG_BEGIN_TAG
+# This is an automatically generated prolog.
+#
+# $Source: sbe/test/testPutGetScom.py $
+#
+# OpenPOWER sbe Project
+#
+# Contributors Listed Below - COPYRIGHT 2015,2016
+# [+] International Business Machines Corp.
+#
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+# IBM_PROLOG_END_TAG
import sys
sys.path.append("targets/p9_nimbus/sbeTest" )
import testUtil
@@ -15,21 +39,47 @@ PUTSCOM_TESTDATA = [0,0,0,6,
0xde,0xca,0xff,0xee,
0x00,0x00,0x00,0x00 ]
+PUTSCOM_TESTDATA_INVALID = [0,0,0,6,
+ 0,0,0xA2,0x02,
+ 0,0,0x0,0x00,
+ # TODO via RTC 152952: This address is invalid for
+ # Nimbus but not for Cumulus
+ 0x0a,0x00,0x00,0x00,
+ 0xde,0xca,0xff,0xee,
+ 0x00,0x00,0x00,0x00 ]
+
PUTSCOM_EXPDATA = [0xc0,0xde,0xa2,0x02,
0x0,0x0,0x0,0x0,
0x00,0x0,0x0,0x03];
+PUTSCOM_EXPDATA_INVALID = [0xc0,0xde,0xa2,0x02,
+ 0x0,0xfe,0x0,0x0a,
+ 0x00,0x0,0x0,0x04,
+ 0x00,0x0,0x0,0x04];
+
GETSCOM_TESTDATA = [0,0,0,4,
0,0,0xA2,0x01,
0,0,0x0,0x00,
0,0x05,0x0,0x3E]
+GETSCOM_TESTDATA_INVALID = [0,0,0,4,
+ 0,0,0xA2,0x01,
+ 0,0,0x0,0x00,
+ # TODO via RTC: 152952: This address is invalid for
+ # Nimbus but not for Cumulus
+ 0x0a,0x0,0x0,0x0]
+
GETSCOM_EXPDATA = [0xde,0xca,0xff,0xee,
0x00,0x00,0x00,0x00,
0xc0,0xde,0xa2,0x01,
0x0,0x0,0x0,0x0,
0x00,0x0,0x0,0x03];
+GETSCOM_EXPDATA_INVALID = [0xc0,0xde,0xa2,0x01,
+ 0x0,0xfe,0x0,0x0a,
+ 0x00,0x0,0x0,0x04,
+ 0x00,0x0,0x0,0x04];
+
# MAIN Test Run Starts Here...
#-------------------------------------------------
def main( ):
@@ -38,10 +88,18 @@ def main( ):
testUtil.writeEot( )
testUtil.readDsFifo( PUTSCOM_EXPDATA )
testUtil.readEot( )
+ testUtil.writeUsFifo( PUTSCOM_TESTDATA_INVALID )
+ testUtil.writeEot( )
+ testUtil.readDsFifo( PUTSCOM_EXPDATA_INVALID )
+ testUtil.readEot( )
testUtil.writeUsFifo( GETSCOM_TESTDATA )
testUtil.writeEot( )
testUtil.readDsFifo( GETSCOM_EXPDATA )
testUtil.readEot( )
+ testUtil.writeUsFifo( GETSCOM_TESTDATA_INVALID )
+ testUtil.writeEot( )
+ testUtil.readDsFifo( GETSCOM_EXPDATA_INVALID )
+ testUtil.readEot( )
#-------------------------------------------------
# Calling all test code
OpenPOWER on IntegriCloud