summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorTony Luck <tony.luck@intel.com>2005-04-25 13:22:44 -0700
committerTony Luck <tony.luck@intel.com>2005-04-25 13:22:44 -0700
commitf0a8d3c9ec1f82d2a41faa6c46b8db7bd5b1eb8d (patch)
tree2b01c7a6d8513e9b08749d3c9cdafdc2cbf19d6b /arch
parent0985ea8f2db87d32b0b750229889e55fed7458ef (diff)
downloadlinux-f0a8d3c9ec1f82d2a41faa6c46b8db7bd5b1eb8d.tar.gz
linux-f0a8d3c9ec1f82d2a41faa6c46b8db7bd5b1eb8d.tar.bz2
linux-f0a8d3c9ec1f82d2a41faa6c46b8db7bd5b1eb8d.zip
[IA64] Need to handle lfetch in "no_context" case.
Thanks to Mark for tracking down this one. Users of __copy_from_user_inatomic() will be sad if we don't handle lfetch faults for the "no_context" case. Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/ia64/mm/fault.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c
index da859125aaef..4174ec999dde 100644
--- a/arch/ia64/mm/fault.c
+++ b/arch/ia64/mm/fault.c
@@ -209,10 +209,13 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
}
no_context:
- if (isr & IA64_ISR_SP) {
+ if ((isr & IA64_ISR_SP)
+ || ((isr & IA64_ISR_NA) && (isr & IA64_ISR_CODE_MASK) == IA64_ISR_CODE_LFETCH))
+ {
/*
- * This fault was due to a speculative load set the "ed" bit in the psr to
- * ensure forward progress (target register will get a NaT).
+ * This fault was due to a speculative load or lfetch.fault, set the "ed"
+ * bit in the psr to ensure forward progress. (Target register will get a
+ * NaT for ld.s, lfetch will be canceled.)
*/
ia64_psr(regs)->ed = 1;
return;