/*
  * ASM_EXCEPTIONTABLE_ENTRY_EFAULT() creates a special exception table entry
  * (with lowest bit set) for which the fault handler in fixup_exception() will
- * load -EFAULT into %r8 for a read or write fault, and zeroes the target
+ * load -EFAULT into %r29 for a read or write fault, and zeroes the target
  * register in case of a read fault in get_user().
  */
+#define ASM_EXCEPTIONTABLE_REG 29
+#define ASM_EXCEPTIONTABLE_VAR(__variable)             \
+       register long __variable __asm__ ("r29") = 0
 #define ASM_EXCEPTIONTABLE_ENTRY_EFAULT( fault_addr, except_addr )\
        ASM_EXCEPTIONTABLE_ENTRY( fault_addr, except_addr + 1)
 
 #define __get_user_internal(sr, val, ptr)              \
 ({                                                     \
-       register long __gu_err __asm__ ("r8") = 0;      \
+       ASM_EXCEPTIONTABLE_VAR(__gu_err);               \
                                                        \
        switch (sizeof(*(ptr))) {                       \
        case 1: __get_user_asm(sr, val, "ldb", ptr); break; \
 
 #define __put_user_internal(sr, x, ptr)                                \
 ({                                                             \
-       register long __pu_err __asm__ ("r8") = 0;              \
+       ASM_EXCEPTIONTABLE_VAR(__pu_err);                       \
         __typeof__(*(ptr)) __x = (__typeof__(*(ptr)))(x);      \
                                                                \
        switch (sizeof(*(ptr))) {                               \
  * gcc knows about, so there are no aliasing issues. These macros must
  * also be aware that fixups are executed in the context of the fault,
  * and any registers used there must be listed as clobbers.
- * r8 is already listed as err.
+ * The register holding the possible EFAULT error (ASM_EXCEPTIONTABLE_REG)
+ * is already listed as input and output register.
  */
 
 #define __put_user_asm(sr, stx, x, ptr)                                \
 
                 * Fix up get_user() and put_user().
                 * ASM_EXCEPTIONTABLE_ENTRY_EFAULT() sets the least-significant
                 * bit in the relative address of the fixup routine to indicate
-                * that %r8 should be loaded with -EFAULT to report a userspace
-                * access error.
+                * that gr[ASM_EXCEPTIONTABLE_REG] should be loaded with
+                * -EFAULT to report a userspace access error.
                 */
                if (fix->fixup & 1) {
-                       regs->gr[8] = -EFAULT;
+                       regs->gr[ASM_EXCEPTIONTABLE_REG] = -EFAULT;
 
                        /* zero target register for get_user() */
                        if (parisc_acctyp(0, regs->iir) == VM_READ) {