Raul Rangel has uploaded this change for review. ( https://review.coreboot.org/26927
Change subject: kahlee: Make CPU1 handle all SMIs ......................................................................
kahlee: Make CPU1 handle all SMIs
If CPU0 handles the ELOG_GSMI_APM_CNT SMI after the SMI handler completes, the system will reboot. Forcing CPU1 to always handle the SMI fixes the issue. I have not been able to find an explanation for this.
I realize this is a terrible and ugly hack but it makes it possible to shutdown consistently.
BUG=b:80539294 TEST=built on grunt and tried `halt` a few times in a row.
Change-Id: Ibb2784648a8e827887170f34a01dcd5f411522e2 Signed-off-by: Raul E Rangel rrangel@chromium.org --- M src/cpu/x86/smm/smm_module_handler.c 1 file changed, 20 insertions(+), 3 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/27/26927/1
diff --git a/src/cpu/x86/smm/smm_module_handler.c b/src/cpu/x86/smm/smm_module_handler.c index c2001ec..46c4a7e 100644 --- a/src/cpu/x86/smm/smm_module_handler.c +++ b/src/cpu/x86/smm/smm_module_handler.c @@ -117,6 +117,13 @@ return base; }
+static void pause(void) +{ + asm volatile ( + ".byte 0xf3, 0x90\n" /* PAUSE */ + ); +} + asmlinkage void smm_handler_start(void *arg) { const struct smm_module_params *p; @@ -139,14 +146,24 @@ return; }
+#if defined(CONFIG_BOARD_GOOGLE_BASEBOARD_KAHLEE) + /* + * Force CPU 1 to handle all SMIs. We need to do this because if CPU0 + * handles an SMI for ELOG_GSMI_APM_CNT it will cause the system to + * reboot. + */ + while (cpu == 0 && smi_handler_status == SMI_UNLOCKED) { + // Wait for the other CPU to get the lock + pause(); + } +#endif + /* Are we ok to execute the handler? */ if (!smi_obtain_lock()) { /* For security reasons we don't release the other CPUs * until the CPU with the lock is actually done */ while (smi_handler_status == SMI_LOCKED) { - asm volatile ( - ".byte 0xf3, 0x90\n" /* PAUSE */ - ); + pause(); } return; }