Frederic Barrat <fbar...@linux.ibm.com> writes: > The 'resume_as_sreset' attribute of a cpu is set when a thread is > entering a stop state on ppc books. It causes the thread to be > re-routed to vector 0x100 when woken up by an exception. So it must be > cleared on reset or a thread might be re-routed unexpectedly after a > reset, when it was not in a stop state and/or when the appropriate > exception handler isn't set up yet. > > Using skiboot, it can be tested by resetting the system when it is > quiet and most threads are idle and in stop state. > > After the reset occurs, skiboot elects a primary thread and all the > others wait in secondary_wait. The primary thread does all the system > initialization from main_cpu_entry() and at some point, the > decrementer interrupt starts ticking. The exception vector for the > decrementer interrupt is in place, so that shouldn't be a > problem. However, if that primary thread was in stop state prior to > the reset, and because the resume_as_sreset parameters is still set, > it is re-routed to exception vector 0x100. Which, at that time, is > still defined as the entry point for BML. So that primary thread > restarts as new and ends up being treated like any other secondary > thread. All threads are now waiting in secondary_wait. > > It results in a full system hang with no message on the console, as > the uart hasn't been init'ed yet. It's actually not obvious to realise > what's happening if not tracing reset (-d cpu_reset). The fix is > simply to clear the 'resume_as_sreset' attribute on reset. > > Signed-off-by: Frederic Barrat <fbar...@linux.ibm.com>
Reviewed-by: Fabiano Rosas <faro...@linux.ibm.com>