diff options
author | Robin Getz <robin.getz@analog.com> | 2009-05-18 14:33:26 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2009-06-12 06:11:44 -0400 |
commit | b9a3899d59c3f0fc074573f0eba2419b1e4c0bca (patch) | |
tree | 09d20c3b062604d615c9d224c06c5df5a5acbcec /arch/blackfin/Kconfig.debug | |
parent | 97b070c8e7e82be30c8a3bf19e69b8c0c71f1fac (diff) |
Blackfin: make deferred hardware errors more exact
Hardware errors on the Blackfin architecture are queued by nature of the
hardware design. Things that could generate a hardware level queue up at
the system interface and might not process until much later, at which
point the system would send a notification back to the core.
As such, it is possible for user space code to do something that would
trigger a hardware error, but have it delay long enough for the process
context to switch. So when the hardware error does signal, we mistakenly
evaluate it as a different process or as kernel context and panic (erp!).
This makes it pretty difficult to find the offending context. But wait,
there is good news somewhere.
By forcing a SSYNC in the interrupt entry, we force all pending queues at
the system level to be processed and all hardware errors to be signaled.
Then we check the current interrupt state to see if the hardware error is
now signaled. If so, we re-queue the current interrupt and return thus
allowing the higher priority hardware error interrupt to process properly.
Since we haven't done any other context processing yet, the right context
will be selected and killed. There is still the possibility that the
exact offending instruction will be unknown, but at least we'll have a
much better idea of where to look.
The downside of course is that this causes system-wide syncs at every
interrupt point which results in significant performance degradation.
Since this situation should not occur in any properly configured system
(as hardware errors are triggered by things like bad pointers), make it a
debug configuration option and disable it by default.
Signed-off-by: Robin Getz <robin.getz@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'arch/blackfin/Kconfig.debug')
-rw-r--r-- | arch/blackfin/Kconfig.debug | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/blackfin/Kconfig.debug b/arch/blackfin/Kconfig.debug index 79e7e63ab709..1fc4981d486f 100644 --- a/arch/blackfin/Kconfig.debug +++ b/arch/blackfin/Kconfig.debug | |||
@@ -54,6 +54,19 @@ config DEBUG_HWERR | |||
54 | hardware error interrupts and need to know where they are coming | 54 | hardware error interrupts and need to know where they are coming |
55 | from. | 55 | from. |
56 | 56 | ||
57 | config EXACT_HWERR | ||
58 | bool "Try to make Hardware errors exact" | ||
59 | depends on DEBUG_HWERR | ||
60 | help | ||
61 | By default, the Blackfin hardware errors are not exact - the error | ||
62 | be reported multiple cycles after the error happens. This delay | ||
63 | can cause the wrong application, or even the kernel to receive a | ||
64 | signal to be killed. If you are getting HW errors in your system, | ||
65 | try turning this on to ensure they are at least comming from the | ||
66 | proper thread. | ||
67 | |||
68 | On production systems, it is safe (and a small optimization) to say N. | ||
69 | |||
57 | config DEBUG_DOUBLEFAULT | 70 | config DEBUG_DOUBLEFAULT |
58 | bool "Debug Double Faults" | 71 | bool "Debug Double Faults" |
59 | default n | 72 | default n |