diff options
author | Nicholas Piggin <npiggin@gmail.com> | 2018-04-08 16:49:37 +1000 |
---|---|---|
committer | Stewart Smith <stewart@linux.ibm.com> | 2018-04-18 20:23:07 -0500 |
commit | 8514e4dc9a82f3ff85d40138f2c8e8a1dc64efa4 (patch) | |
tree | bfa96163d153d55f4d546256096c74a46a84760d /include | |
parent | ad0941960bd045644f6834d6e711bedbde3c29c8 (diff) | |
download | skiboot-8514e4dc9a82f3ff85d40138f2c8e8a1dc64efa4.zip skiboot-8514e4dc9a82f3ff85d40138f2c8e8a1dc64efa4.tar.gz skiboot-8514e4dc9a82f3ff85d40138f2c8e8a1dc64efa4.tar.bz2 |
asm/head: implement quiescing without stack or clobbering regs
Quiescing currently is implmeented in C in opal_entry before the
opal call handler is called. This works well enough for simple
cases like fast reset when one CPU wants all others out of the way.
Linux would like to use it to prevent an sreset IPI from
interrupting firmware, which could lead to deadlocks when crash
dumping or entering the debugger. Linux interrupts do not recover
well when returning back to general OPAL code, due to r13 not being
restored. OPAL also can't be re-entered, which may happen e.g.,
from the debugger.
So move the quiesce hold/reject to entry code, beore the stack or
r1 or r13 registers are switched. OPAL can be interrupted and
returned to or re-entered during this period.
This does not completely solve all such problems. OPAL will be
interrupted with sreset if the quiesce times out, and it can be
interrupted by MCEs as well. These still have the issues above.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/cpu.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/include/cpu.h b/include/cpu.h index 68f2463..4a6bc4a 100644 --- a/include/cpu.h +++ b/include/cpu.h @@ -61,10 +61,10 @@ struct cpu_thread { uint64_t save_r1; void *icp_regs; uint32_t in_opal_call; + uint32_t quiesce_opal_call; uint32_t con_suspend; struct list_head locks_held; bool con_need_flush; - bool quiesce_opal_call; bool in_mcount; bool in_poller; bool in_reinit; |