mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-14 03:56:43 +07:00
powerpc/powernv/idle: Clear r12 on wakeup from stop lite
pnv_wakeup_noloss() expects r12 to contain SRR1 value to determine if the wakeup reason is an HMI in CHECK_HMI_INTERRUPT. When we wakeup with ESL=0, SRR1 will not contain the wakeup reason, so there is no point setting r12 to SRR1. However, we don't set r12 at all so r12 contains garbage (likely a kernel pointer), and is still used to check HMI assuming that it contained SRR1. This causes the OPAL msglog to be filled with the following print: HMI: Received HMI interrupt: HMER = 0x0040000000000000 This patch clears r12 after waking up from stop with ESL=EC=0, so that we don't accidentally enter the HMI handler in pnv_wakeup_noloss() if the value of r12[42:45] corresponds to HMI as wakeup reason. Prior to commit9d29250136
("powerpc/64s/idle: Avoid SRR usage in idle sleep/wake paths") this bug existed, in that we would incorrectly look at SRR1 to check for a HMI when SRR1 didn't contain a wakeup reason. However the SRR1 value would just happen to never have bits 42:45 set. Fixes:9d29250136
("powerpc/64s/idle: Avoid SRR usage in idle sleep/wake paths") Signed-off-by: Akshay Adiga <akshay.adiga@linux.vnet.ibm.com> Reviewed-by: Nicholas Piggin <npiggin@gmail.com> [mpe: Change log and comment massaging] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
39e4675183
commit
4d0d7c02df
@ -256,6 +256,19 @@ power_enter_stop:
|
||||
bne .Lhandle_esl_ec_set
|
||||
IDLE_STATE_ENTER_SEQ(PPC_STOP)
|
||||
li r3,0 /* Since we didn't lose state, return 0 */
|
||||
|
||||
/*
|
||||
* pnv_wakeup_noloss() expects r12 to contain the SRR1 value so
|
||||
* it can determine if the wakeup reason is an HMI in
|
||||
* CHECK_HMI_INTERRUPT.
|
||||
*
|
||||
* However, when we wakeup with ESL=0, SRR1 will not contain the wakeup
|
||||
* reason, so there is no point setting r12 to SRR1.
|
||||
*
|
||||
* Further, we clear r12 here, so that we don't accidentally enter the
|
||||
* HMI in pnv_wakeup_noloss() if the value of r12[42:45] == WAKE_HMI.
|
||||
*/
|
||||
li r12, 0
|
||||
b pnv_wakeup_noloss
|
||||
|
||||
.Lhandle_esl_ec_set:
|
||||
|
Loading…
Reference in New Issue
Block a user