|
@@ -64,23 +64,30 @@
|
|
|
__access_ok((__force unsigned long)(addr), (size), get_fs()))
|
|
|
|
|
|
/*
|
|
|
- * The exception table consists of pairs of addresses: the first is the
|
|
|
- * address of an instruction that is allowed to fault, and the second is
|
|
|
+ * The exception table consists of pairs of relative addresses: the first is
|
|
|
+ * the address of an instruction that is allowed to fault, and the second is
|
|
|
* the address at which the program should continue. No registers are
|
|
|
- * modified, so it is entirely up to the continuation code to figure out
|
|
|
- * what to do.
|
|
|
+ * modified, so it is entirely up to the continuation code to figure out what
|
|
|
+ * to do.
|
|
|
*
|
|
|
- * All the routines below use bits of fixup code that are out of line
|
|
|
- * with the main instruction path. This means when everything is well,
|
|
|
- * we don't even have to jump over them. Further, they do not intrude
|
|
|
- * on our cache or tlb entries.
|
|
|
+ * All the routines below use bits of fixup code that are out of line with the
|
|
|
+ * main instruction path. This means when everything is well, we don't even
|
|
|
+ * have to jump over them. Further, they do not intrude on our cache or tlb
|
|
|
+ * entries.
|
|
|
*/
|
|
|
|
|
|
+#define ARCH_HAS_RELATIVE_EXTABLE
|
|
|
+
|
|
|
struct exception_table_entry {
|
|
|
- unsigned long insn;
|
|
|
- unsigned long fixup;
|
|
|
+ int insn;
|
|
|
+ int fixup;
|
|
|
};
|
|
|
|
|
|
+static inline unsigned long extable_fixup(const struct exception_table_entry *x)
|
|
|
+{
|
|
|
+ return (unsigned long)&x->fixup + x->fixup;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* These are the main single-value transfer routines. They automatically
|
|
|
* use the right size if we just have the right pointer type.
|