---
 arch/powerpc/Makefile                          |   1 +
 arch/powerpc/crypto/md5-asm.S                  |  40 +++----
 arch/powerpc/crypto/sha1-powerpc-asm.S         |  10 +-
 arch/powerpc/include/asm/kvm_book3s_asm.h      |   2 +-
 arch/powerpc/include/asm/ppc_asm.h             |  21 +++-
 arch/powerpc/kernel/asm-offsets.c              |   4 +-
 arch/powerpc/kernel/entry_32.S                 |   4 +-
 arch/powerpc/kernel/entry_64.S                 |  45 ++++----
 arch/powerpc/kernel/exceptions-64s.S           |   3 +-
 arch/powerpc/kernel/head_64.S                  |   8 +-
 arch/powerpc/kernel/idle_book3s.S              |  79 +++++++------
 arch/powerpc/kernel/kgdb.c                     |   8 +-
 arch/powerpc/kernel/process.c                  |   4 +-
 arch/powerpc/kernel/tm.S                       |  40 ++++---
 arch/powerpc/kernel/trace/ftrace_64_mprofile.S |  10 +-
 arch/powerpc/kvm/book3s_hv_interrupts.S        |   5 +-
 arch/powerpc/kvm/book3s_interrupts.S           |  93 +++++++++++----
 arch/powerpc/kvm/book3s_pr.c                   |   6 +
 arch/powerpc/lib/checksum_64.S                 |  66 +++++------
 arch/powerpc/lib/copypage_power7.S             |  32 +++---
 arch/powerpc/lib/copyuser_power7.S             | 152 ++++++++++++-------------
 arch/powerpc/lib/crtsavres.S                   |   3 +
 arch/powerpc/lib/memcpy_power7.S               |  80 ++++++-------
 23 files changed, 396 insertions(+), 320 deletions(-)

diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 1381693a4a51..8dd38facc5f2 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -140,6 +140,7 @@ AFLAGS-$(CONFIG_PPC64)      += $(call cc-option,-mabi=elfv1)
 endif
 CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,$(call 
cc-option,-mminimal-toc))
 CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions)
+CFLAGS-$(CONFIG_PPC64) += -ffixed-r13 -ffixed-r14
 CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 $(MULTIPLEWORD)
 
 ifeq ($(CONFIG_PPC_BOOK3S_64),y)
diff --git a/arch/powerpc/crypto/md5-asm.S b/arch/powerpc/crypto/md5-asm.S
index 10cdf5bceebb..99e41af88e19 100644
--- a/arch/powerpc/crypto/md5-asm.S
+++ b/arch/powerpc/crypto/md5-asm.S
@@ -25,31 +25,31 @@
 #define rW02   r10
 #define rW03   r11
 #define rW04   r12
-#define rW05   r14
-#define rW06   r15
-#define rW07   r16
-#define rW08   r17
-#define rW09   r18
-#define rW10   r19
-#define rW11   r20
-#define rW12   r21
-#define rW13   r22
-#define rW14   r23
-#define rW15   r24
-
-#define rT0    r25
-#define rT1    r26
+#define rW05   r15
+#define rW06   r16
+#define rW07   r17
+#define rW08   r18
+#define rW09   r19
+#define rW10   r20
+#define rW11   r21
+#define rW12   r22
+#define rW13   r23
+#define rW14   r24
+#define rW15   r25
+
+#define rT0    r26
+#define rT1    r27
 
 #define INITIALIZE \
        PPC_STLU r1,-INT_FRAME_SIZE(r1); \
-       SAVE_8GPRS(14, r1);             /* push registers onto stack    */ \
-       SAVE_4GPRS(22, r1);                                                \
-       SAVE_GPR(26, r1)
+       SAVE_8GPRS(15, r1);             /* push registers onto stack    */ \
+       SAVE_4GPRS(23, r1);                                                \
+       SAVE_GPR(27, r1)
 
 #define FINALIZE \
-       REST_8GPRS(14, r1);             /* pop registers from stack     */ \
-       REST_4GPRS(22, r1);                                                \
-       REST_GPR(26, r1);                                                  \
+       REST_8GPRS(15, r1);             /* pop registers from stack     */ \
+       REST_4GPRS(23, r1);                                                \
+       REST_GPR(27, r1);                                                  \
        addi    r1,r1,INT_FRAME_SIZE;
 
 #ifdef __BIG_ENDIAN__
diff --git a/arch/powerpc/crypto/sha1-powerpc-asm.S 
b/arch/powerpc/crypto/sha1-powerpc-asm.S
index c8951ce0dcc4..6c38de214c11 100644
--- a/arch/powerpc/crypto/sha1-powerpc-asm.S
+++ b/arch/powerpc/crypto/sha1-powerpc-asm.S
@@ -42,10 +42,10 @@
        or      r6,r6,r0;                       \
        add     r0,RE(t),r15;                   \
        add     RT(t),RT(t),r6;         \
-       add     r14,r0,W(t);                    \
+       add     r6,r0,W(t);                     \
        LWZ(W((t)+4),((t)+4)*4,r4);     \
        rotlwi  RB(t),RB(t),30;                 \
-       add     RT(t),RT(t),r14
+       add     RT(t),RT(t),r6
 
 #define STEPD0_UPDATE(t)                       \
        and     r6,RB(t),RC(t);         \
@@ -124,8 +124,7 @@
 
 _GLOBAL(powerpc_sha_transform)
        PPC_STLU r1,-INT_FRAME_SIZE(r1)
-       SAVE_8GPRS(14, r1)
-       SAVE_10GPRS(22, r1)
+       SAVE_NVGPRS(r1)
 
        /* Load up A - E */
        lwz     RA(0),0(r3)     /* A */
@@ -183,7 +182,6 @@ _GLOBAL(powerpc_sha_transform)
        stw     RD(0),12(r3)
        stw     RE(0),16(r3)
 
-       REST_8GPRS(14, r1)
-       REST_10GPRS(22, r1)
+       REST_NVGPRS(r1)
        addi    r1,r1,INT_FRAME_SIZE
        blr
diff --git a/arch/powerpc/include/asm/kvm_book3s_asm.h 
b/arch/powerpc/include/asm/kvm_book3s_asm.h
index ab386af2904f..fbbd2ca18866 100644
--- a/arch/powerpc/include/asm/kvm_book3s_asm.h
+++ b/arch/powerpc/include/asm/kvm_book3s_asm.h
@@ -143,7 +143,7 @@ struct kvmppc_host_state {
 
 struct kvmppc_book3s_shadow_vcpu {
        bool in_use;
-       ulong gpr[14];
+       ulong gpr[15];
        u32 cr;
        ulong xer;
        ulong ctr;
diff --git a/arch/powerpc/include/asm/ppc_asm.h 
b/arch/powerpc/include/asm/ppc_asm.h
index ae94b3626b6c..109f4dce8a79 100644
--- a/arch/powerpc/include/asm/ppc_asm.h
+++ b/arch/powerpc/include/asm/ppc_asm.h
@@ -10,6 +10,16 @@
 #include <asm/ppc-opcode.h>
 #include <asm/firmware.h>
 
+#ifdef __powerpc64__
+#ifdef CONFIG_PPC_BOOK3S
+#define FIRST_NVGPR            15
+#else
+#define FIRST_NVGPR            14
+#endif
+#else
+#define FIRST_NVGPR            13
+#endif
+
 #ifdef __ASSEMBLY__
 
 #define SZL                    (BITS_PER_LONG/8)
@@ -75,16 +85,21 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)
 #ifdef __powerpc64__
 #define SAVE_GPR(n, base)      std     n,GPR0+8*(n)(base)
 #define REST_GPR(n, base)      ld      n,GPR0+8*(n)(base)
+#ifdef CONFIG_PPC_BOOK3S
+#define SAVE_NVGPRS(base)      SAVE_GPR(15, base); SAVE_2GPRS(16, base); 
SAVE_4GPRS(18, base); SAVE_10GPRS(22, base)
+#define REST_NVGPRS(base)      REST_GPR(15, base); REST_2GPRS(16, base); 
REST_4GPRS(18, base); REST_10GPRS(22, base)
+#else /* CONFIG_PPC_BOOK3S */
 #define SAVE_NVGPRS(base)      SAVE_8GPRS(14, base); SAVE_10GPRS(22, base)
 #define REST_NVGPRS(base)      REST_8GPRS(14, base); REST_10GPRS(22, base)
-#else
+#endif /* CONFIG_PPC_BOOK3S */
+#else /* __powerpc64__ */
 #define SAVE_GPR(n, base)      stw     n,GPR0+4*(n)(base)
 #define REST_GPR(n, base)      lwz     n,GPR0+4*(n)(base)
 #define SAVE_NVGPRS(base)      SAVE_GPR(13, base); SAVE_8GPRS(14, base); \
                                SAVE_10GPRS(22, base)
 #define REST_NVGPRS(base)      REST_GPR(13, base); REST_8GPRS(14, base); \
                                REST_10GPRS(22, base)
-#endif
+#endif /* __powerpc64__ */
 
 #define SAVE_2GPRS(n, base)    SAVE_GPR(n, base); SAVE_GPR(n+1, base)
 #define SAVE_4GPRS(n, base)    SAVE_2GPRS(n, base); SAVE_2GPRS(n+2, base)
@@ -184,7 +199,7 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)
 #ifdef CONFIG_PPC64
 
 #define STACKFRAMESIZE 256
-#define __STK_REG(i)   (112 + ((i)-14)*8)
+#define __STK_REG(i)   (112 + ((i)-15)*8)
 #define STK_REG(i)     __STK_REG(__REG_##i)
 
 #ifdef PPC64_ELF_ABI_v2
diff --git a/arch/powerpc/kernel/asm-offsets.c 
b/arch/powerpc/kernel/asm-offsets.c
index 397681f43eed..db8407483c9e 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -283,9 +283,9 @@ int main(void)
        STACK_PT_REGS_OFFSET(GPR11, gpr[11]);
        STACK_PT_REGS_OFFSET(GPR12, gpr[12]);
        STACK_PT_REGS_OFFSET(GPR13, gpr[13]);
-#ifndef CONFIG_PPC64
+#ifndef CONFIG_PPC_BOOK3E_64
        STACK_PT_REGS_OFFSET(GPR14, gpr[14]);
-#endif /* CONFIG_PPC64 */
+#endif
        /*
         * Note: these symbols include _ because they overlap with special
         * register names
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index e780e1fbf6c2..4b3cf4dc7d05 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -458,8 +458,8 @@ ret_from_fork:
 ret_from_kernel_thread:
        REST_NVGPRS(r1)
        bl      schedule_tail
-       mtlr    r14
-       mr      r3,r15
+       mtlr    FIRST_NVGPR
+       mr      r3,FIRST_NVGPR+1
        PPC440EP_ERR42
        blrl
        li      r3,0
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index f2ffb9aa7ff4..b9bf44635b10 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -419,7 +419,7 @@ _ASM_NOKPROBE_SYMBOL(save_nvgprs);
  * The sigsuspend and rt_sigsuspend system calls can call do_signal
  * and thus put the process into the stopped state where we might
  * want to examine its user state with ptrace.  Therefore we need
- * to save all the nonvolatile registers (r14 - r31) before calling
+ * to save all the nonvolatile registers (r15 - r31) before calling
  * the C code.  Similarly, fork, vfork and clone need the full
  * register state on the stack so that it can be copied to the child.
  */
@@ -463,10 +463,10 @@ _GLOBAL(ret_from_fork)
 _GLOBAL(ret_from_kernel_thread)
        bl      schedule_tail
        REST_NVGPRS(r1)
-       mtlr    r14
-       mr      r3,r15
+       mtlr    FIRST_NVGPR
+       mr      r3,FIRST_NVGPR+1
 #ifdef PPC64_ELF_ABI_v2
-       mr      r12,r14
+       mr      r12,FIRST_NVGPR
 #endif
        blrl
        li      r3,0
@@ -495,9 +495,7 @@ _GLOBAL(_switch)
        mflr    r0
        std     r0,16(r1)
        stdu    r1,-SWITCH_FRAME_SIZE(r1)
-       /* r3-r13 are caller saved -- Cort */
-       SAVE_8GPRS(14, r1)
-       SAVE_10GPRS(22, r1)
+       SAVE_NVGPRS(r1)
        std     r0,_NIP(r1)     /* Return to switch caller */
        mfcr    r23
        std     r23,_CCR(r1)
@@ -609,9 +607,8 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
        ld      r6,_CCR(r1)
        mtcrf   0xFF,r6
 
-       /* r3-r13 are destroyed -- Cort */
-       REST_8GPRS(14, r1)
-       REST_10GPRS(22, r1)
+       /* Volatile regs are destroyed */
+       REST_NVGPRS(r1)
 
        /* convert old thread to its task_struct for return value */
        addi    r3,r3,-THREAD
@@ -1011,12 +1008,14 @@ _GLOBAL(enter_rtas)
 
        /* Because RTAS is running in 32b mode, it clobbers the high order half
         * of all registers that it saves.  We therefore save those registers
-        * RTAS might touch to the stack.  (r0, r3-r13 are caller saved)
+        * RTAS might touch to the stack.  (r0, r3-r12 are caller saved)
         */
        SAVE_GPR(2, r1)                 /* Save the TOC */
        SAVE_GPR(13, r1)                /* Save paca */
-       SAVE_8GPRS(14, r1)              /* Save the non-volatiles */
-       SAVE_10GPRS(22, r1)             /* ditto */
+#ifdef CONFIG_PPC_BOOK3S
+       SAVE_GPR(14, r1)                /* Save r14 */
+#endif
+       SAVE_NVGPRS(r1)                 /* Save the non-volatiles */
 
        mfcr    r4
        std     r4,_CCR(r1)
@@ -1118,8 +1117,10 @@ rtas_restore_regs:
        /* relocation is on at this point */
        REST_GPR(2, r1)                 /* Restore the TOC */
        REST_GPR(13, r1)                /* Restore paca */
-       REST_8GPRS(14, r1)              /* Restore the non-volatiles */
-       REST_10GPRS(22, r1)             /* ditto */
+#ifdef CONFIG_PPC_BOOK3S
+       REST_GPR(14, r1)                /* Restore r14 */
+#endif
+       REST_NVGPRS(r1)                 /* Restore the non-volatiles */
 
        GET_PACA(r13)
 
@@ -1149,12 +1150,14 @@ _GLOBAL(enter_prom)
 
        /* Because PROM is running in 32b mode, it clobbers the high order half
         * of all registers that it saves.  We therefore save those registers
-        * PROM might touch to the stack.  (r0, r3-r13 are caller saved)
+        * PROM might touch to the stack.  (r0, r3-r14 are caller saved)
         */
        SAVE_GPR(2, r1)
        SAVE_GPR(13, r1)
-       SAVE_8GPRS(14, r1)
-       SAVE_10GPRS(22, r1)
+#ifdef CONFIG_PPC_BOOK3S
+       SAVE_GPR(14, r1)
+#endif
+       SAVE_NVGPRS(r1)
        mfcr    r10
        mfmsr   r11
        std     r10,_CCR(r1)
@@ -1198,8 +1201,10 @@ _GLOBAL(enter_prom)
        /* Restore other registers */
        REST_GPR(2, r1)
        REST_GPR(13, r1)
-       REST_8GPRS(14, r1)
-       REST_10GPRS(22, r1)
+#ifdef CONFIG_PPC_BOOK3S
+       REST_GPR(14, r1)
+#endif
+       REST_NVGPRS(r1)
        ld      r4,_CCR(r1)
        mtcr    r4
        
diff --git a/arch/powerpc/kernel/exceptions-64s.S 
b/arch/powerpc/kernel/exceptions-64s.S
index 60d9c68ef414..189c456450e2 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -1656,8 +1656,7 @@ BEGIN_FTR_SECTION
        ld      r10,EX_CFAR(r3)
        std     r10,ORIG_GPR3(r1)
 END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
-       SAVE_8GPRS(14,r1)
-       SAVE_10GPRS(22,r1)
+       SAVE_NVGPRS(r1)
        lhz     r12,PACA_TRAP_SAVE(r13)
        std     r12,_TRAP(r1)
        addi    r11,r1,INT_FRAME_SIZE
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
index 56f9e112b98d..87b2c2264118 100644
--- a/arch/powerpc/kernel/head_64.S
+++ b/arch/powerpc/kernel/head_64.S
@@ -802,9 +802,9 @@ __secondary_start:
        /* Initialize the kernel stack */
        LOAD_REG_ADDR(r3, current_set)
        sldi    r28,r24,3               /* get current_set[cpu#]         */
-       ldx     r14,r3,r28
-       addi    r14,r14,THREAD_SIZE-STACK_FRAME_OVERHEAD
-       std     r14,PACAKSAVE(r13)
+       ldx     r15,r3,r28
+       addi    r15,r15,THREAD_SIZE-STACK_FRAME_OVERHEAD
+       std     r15,PACAKSAVE(r13)
 
        /* Do early setup for that CPU (SLB and hash table pointer) */
        bl      early_setup_secondary
@@ -813,7 +813,7 @@ __secondary_start:
         * setup the new stack pointer, but *don't* use this until
         * translation is on.
         */
-       mr      r1, r14
+       mr      r1, r15
 
        /* Clear backchain so we get nice backtraces */
        li      r7,0
diff --git a/arch/powerpc/kernel/idle_book3s.S 
b/arch/powerpc/kernel/idle_book3s.S
index 01e1c1997893..5065c4cb5f12 100644
--- a/arch/powerpc/kernel/idle_book3s.S
+++ b/arch/powerpc/kernel/idle_book3s.S
@@ -150,19 +150,19 @@ power9_restore_additional_sprs:
 /*
  * Used by threads when the lock bit of core_idle_state is set.
  * Threads will spin in HMT_LOW until the lock bit is cleared.
- * r14 - pointer to core_idle_state
- * r15 - used to load contents of core_idle_state
+ * r15 - pointer to core_idle_state
+ * r16 - used to load contents of core_idle_state
  * r9  - used as a temporary variable
  */
 
 core_idle_lock_held:
        HMT_LOW
-3:     lwz     r15,0(r14)
-       andis.  r15,r15,PNV_CORE_IDLE_LOCK_BIT@h
+3:     lwz     r16,0(r15)
+       andis.  r16,r16,PNV_CORE_IDLE_LOCK_BIT@h
        bne     3b
        HMT_MEDIUM
-       lwarx   r15,0,r14
-       andis.  r9,r15,PNV_CORE_IDLE_LOCK_BIT@h
+       lwarx   r16,0,r15
+       andis.  r9,r16,PNV_CORE_IDLE_LOCK_BIT@h
        bne-    core_idle_lock_held
        blr
 
@@ -263,21 +263,21 @@ pnv_enter_arch207_idle_mode:
 2:
        /* Sleep or winkle */
        lbz     r7,PACA_THREAD_MASK(r13)
-       ld      r14,PACA_CORE_IDLE_STATE_PTR(r13)
+       ld      r15,PACA_CORE_IDLE_STATE_PTR(r13)
        li      r5,0
        beq     cr3,3f
        lis     r5,PNV_CORE_IDLE_WINKLE_COUNT@h
 3:
 lwarx_loop1:
-       lwarx   r15,0,r14
+       lwarx   r16,0,r15
 
-       andis.  r9,r15,PNV_CORE_IDLE_LOCK_BIT@h
+       andis.  r9,r16,PNV_CORE_IDLE_LOCK_BIT@h
        bnel-   core_idle_lock_held
 
-       add     r15,r15,r5                      /* Add if winkle */
-       andc    r15,r15,r7                      /* Clear thread bit */
+       add     r16,r16,r5                      /* Add if winkle */
+       andc    r16,r16,r7                      /* Clear thread bit */
 
-       andi.   r9,r15,PNV_CORE_IDLE_THREAD_BITS
+       andi.   r9,r16,PNV_CORE_IDLE_THREAD_BITS
 
 /*
  * If cr0 = 0, then current thread is the last thread of the core entering
@@ -291,7 +291,7 @@ lwarx_loop1:
 pnv_fastsleep_workaround_at_entry:
        beq     fastsleep_workaround_at_entry
 
-       stwcx.  r15,0,r14
+       stwcx.  r16,0,r15
        bne-    lwarx_loop1
        isync
 
@@ -300,8 +300,8 @@ common_enter: /* common code for all the threads entering 
sleep or winkle */
        IDLE_STATE_ENTER_SEQ_NORET(PPC_SLEEP)
 
 fastsleep_workaround_at_entry:
-       oris    r15,r15,PNV_CORE_IDLE_LOCK_BIT@h
-       stwcx.  r15,0,r14
+       oris    r16,r16,PNV_CORE_IDLE_LOCK_BIT@h
+       stwcx.  r16,0,r15
        bne-    lwarx_loop1
        isync
 
@@ -311,9 +311,9 @@ fastsleep_workaround_at_entry:
        bl      opal_config_cpu_idle_state
 
        /* Unlock */
-       xoris   r15,r15,PNV_CORE_IDLE_LOCK_BIT@h
+       xoris   r16,r16,PNV_CORE_IDLE_LOCK_BIT@h
        lwsync
-       stw     r15,0(r14)
+       stw     r16,0(r15)
        b       common_enter
 
 enter_winkle:
@@ -381,15 +381,15 @@ END_FTR_SECTION_IFCLR(CPU_FTR_POWER9_DD2_1)
  * stack and enter stop
  */
        lbz     r7,PACA_THREAD_MASK(r13)
-       ld      r14,PACA_CORE_IDLE_STATE_PTR(r13)
+       ld      r15,PACA_CORE_IDLE_STATE_PTR(r13)
 
 lwarx_loop_stop:
-       lwarx   r15,0,r14
-       andis.  r9,r15,PNV_CORE_IDLE_LOCK_BIT@h
+       lwarx   r16,0,r15
+       andis.  r9,r16,PNV_CORE_IDLE_LOCK_BIT@h
        bnel-   core_idle_lock_held
-       andc    r15,r15,r7                      /* Clear thread bit */
+       andc    r16,r16,r7                      /* Clear thread bit */
 
-       stwcx.  r15,0,r14
+       stwcx.  r16,0,r15
        bne-    lwarx_loop_stop
        isync
 
@@ -643,8 +643,7 @@ pnv_wakeup_tb_loss:
        stb     r0,PACA_NAPSTATELOST(r13)
 
        /*
-        *
-        * Save SRR1 and LR in NVGPRs as they might be clobbered in
+        * Save SRR1 (r12) and LR in NVGPRs as they might be clobbered in
         * opal_call() (called in CHECK_HMI_INTERRUPT). SRR1 is required
         * to determine the wakeup reason if we branch to kvm_start_guest. LR
         * is required to return back to reset vector after hypervisor state
@@ -657,7 +656,7 @@ BEGIN_FTR_SECTION
        CHECK_HMI_INTERRUPT
 END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
 
-       ld      r14,PACA_CORE_IDLE_STATE_PTR(r13)
+       ld      r15,PACA_CORE_IDLE_STATE_PTR(r13)
        lbz     r7,PACA_THREAD_MASK(r13)
 
        /*
@@ -671,15 +670,15 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
         * In either case loop until the lock bit is cleared.
         */
 1:
-       lwarx   r15,0,r14
-       andis.  r9,r15,PNV_CORE_IDLE_LOCK_BIT@h
+       lwarx   r16,0,r15
+       andis.  r9,r16,PNV_CORE_IDLE_LOCK_BIT@h
        bnel-   core_idle_lock_held
-       oris    r15,r15,PNV_CORE_IDLE_LOCK_BIT@h
-       stwcx.  r15,0,r14
+       oris    r16,r16,PNV_CORE_IDLE_LOCK_BIT@h
+       stwcx.  r16,0,r15
        bne-    1b
        isync
 
-       andi.   r9,r15,PNV_CORE_IDLE_THREAD_BITS
+       andi.   r9,r16,PNV_CORE_IDLE_THREAD_BITS
        cmpwi   cr2,r9,0
 
        /*
@@ -745,27 +744,27 @@ BEGIN_FTR_SECTION
         */
        cmpwi   r18,PNV_THREAD_WINKLE
        bne     2f
-       andis.  r9,r15,PNV_CORE_IDLE_WINKLE_COUNT_ALL_BIT@h
-       subis   r15,r15,PNV_CORE_IDLE_WINKLE_COUNT@h
+       andis.  r9,r16,PNV_CORE_IDLE_WINKLE_COUNT_ALL_BIT@h
+       subis   r16,r16,PNV_CORE_IDLE_WINKLE_COUNT@h
        beq     2f
-       ori     r15,r15,PNV_CORE_IDLE_THREAD_WINKLE_BITS /* all were winkle */
+       ori     r16,r16,PNV_CORE_IDLE_THREAD_WINKLE_BITS /* all were winkle */
 2:
        /* Shift thread bit to winkle mask, then test if this thread is set,
         * and remove it from the winkle bits */
        slwi    r8,r7,8
-       and     r8,r8,r15
-       andc    r15,r15,r8
+       and     r8,r8,r16
+       andc    r16,r16,r8
        cmpwi   cr4,r8,1 /* cr4 will be gt if our bit is set, lt if not */
 
        lbz     r4,PACA_SUBCORE_SIBLING_MASK(r13)
-       and     r4,r4,r15
+       and     r4,r4,r16
        cmpwi   r4,0    /* Check if first in subcore */
 
-       or      r15,r15,r7              /* Set thread bit */
+       or      r16,r16,r7              /* Set thread bit */
        beq     first_thread_in_subcore
 END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
 
-       or      r15,r15,r7              /* Set thread bit */
+       or      r16,r16,r7              /* Set thread bit */
        beq     cr2,first_thread_in_core
 
        /* Not first thread in core or subcore to wake up */
@@ -842,9 +841,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
        mtspr   SPRN_WORC,r4
 
 clear_lock:
-       xoris   r15,r15,PNV_CORE_IDLE_LOCK_BIT@h
+       xoris   r16,r16,PNV_CORE_IDLE_LOCK_BIT@h
        lwsync
-       stw     r15,0(r14)
+       stw     r16,0(r15)
 
 common_exit:
        /*
diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c
index 35e240a0a408..d593e381f34d 100644
--- a/arch/powerpc/kernel/kgdb.c
+++ b/arch/powerpc/kernel/kgdb.c
@@ -230,11 +230,11 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, 
struct task_struct *p)
        for (reg = 0; reg < 3; reg++)
                PACK64(ptr, regs->gpr[reg]);
 
-       /* Regs GPR3-13 are caller saved, not in regs->gpr[] */
-       ptr += 11;
+       /* Regs GPR3-13/14 are caller saved, not in regs->gpr[] */
+       ptr += FIRST_NVGPR - 2;
 
-       /* Regs GPR14-31 */
-       for (reg = 14; reg < 32; reg++)
+       /* Regs GPR14/15-31 */
+       for (reg = FIRST_NVGPR; reg < 32; reg++)
                PACK64(ptr, regs->gpr[reg]);
 
 #ifdef CONFIG_FSL_BOOKE
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 2a63cc78257d..f56e42f06f24 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -1672,12 +1672,12 @@ int copy_thread(unsigned long clone_flags, unsigned 
long usp,
                childregs->gpr[1] = sp + sizeof(struct pt_regs);
                /* function */
                if (usp)
-                       childregs->gpr[14] = ppc_function_entry((void *)usp);
+                       childregs->gpr[FIRST_NVGPR] = ppc_function_entry((void 
*)usp);
 #ifdef CONFIG_PPC64
                clear_tsk_thread_flag(p, TIF_32BIT);
                childregs->softe = IRQ_SOFT_MASK_NONE;
 #endif
-               childregs->gpr[15] = kthread_arg;
+               childregs->gpr[FIRST_NVGPR + 1] = kthread_arg;
                p->thread.regs = NULL;  /* no user register state */
                ti->flags |= _TIF_RESTOREALL;
                f = ret_from_kernel_thread;
diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S
index b92ac8e711db..3f62b8157aea 100644
--- a/arch/powerpc/kernel/tm.S
+++ b/arch/powerpc/kernel/tm.S
@@ -106,27 +106,28 @@ _GLOBAL(tm_reclaim)
        /* We've a struct pt_regs at [r1+STACK_FRAME_OVERHEAD]. */
 
        std     r3, STK_PARAM(R3)(r1)
+       SAVE_GPR(14, r1)
        SAVE_NVGPRS(r1)
 
        /* We need to setup MSR for VSX register save instructions. */
-       mfmsr   r14
-       mr      r15, r14
-       ori     r15, r15, MSR_FP
-       li      r16, 0
-       ori     r16, r16, MSR_EE /* IRQs hard off */
-       andc    r15, r15, r16
-       oris    r15, r15, MSR_VEC@h
+       mfmsr   r15
+       mr      r16, r15
+       ori     r16, r16, MSR_FP
+       li      r17, 0
+       ori     r17, r17, MSR_EE /* IRQs hard off */
+       andc    r16, r16, r17
+       oris    r16, r16, MSR_VEC@h
 #ifdef CONFIG_VSX
        BEGIN_FTR_SECTION
-       oris    r15,r15, MSR_VSX@h
+       oris    r16,r16, MSR_VSX@h
        END_FTR_SECTION_IFSET(CPU_FTR_VSX)
 #endif
-       mtmsrd  r15
-       std     r14, TM_FRAME_L0(r1)
+       mtmsrd  r16
+       std     r15, TM_FRAME_L0(r1)
 
        /* Do sanity check on MSR to make sure we are suspended */
        li      r7, (MSR_TS_S)@higher
-       srdi    r6, r14, 32
+       srdi    r6, r15, 32
        and     r6, r6, r7
 1:     tdeqi   r6, 0
        EMIT_BUG_ENTRY 1b,__FILE__,__LINE__,0
@@ -205,7 +206,8 @@ _GLOBAL(tm_reclaim)
        std     r6, GPR12(r7)
        std     r8, GPR13(r7)
 
-       SAVE_NVGPRS(r7)                         /* user r14-r31 */
+       SAVE_GPR(14, r7)                        /* user r14 */
+       SAVE_NVGPRS(r7)                         /* user r15-r31 */
 
        /* ******************** NIP ******************** */
        mfspr   r3, SPRN_TFHAR
@@ -278,12 +280,13 @@ _GLOBAL(tm_reclaim)
        /* AMR is checkpointed too, but is unsupported by Linux. */
 
        /* Restore original MSR/IRQ state & clear TM mode */
-       ld      r14, TM_FRAME_L0(r1)            /* Orig MSR */
+       ld      r15, TM_FRAME_L0(r1)            /* Orig MSR */
 
-       li      r15, 0
-       rldimi  r14, r15, MSR_TS_LG, (63-MSR_TS_LG)-1
-       mtmsrd  r14
+       li      r16, 0
+       rldimi  r15, r16, MSR_TS_LG, (63-MSR_TS_LG)-1
+       mtmsrd  r15
 
+       REST_GPR(14, r1)
        REST_NVGPRS(r1)
 
        addi    r1, r1, TM_FRAME_SIZE
@@ -319,6 +322,7 @@ _GLOBAL(__tm_recheckpoint)
        /* We've a struct pt_regs at [r1+STACK_FRAME_OVERHEAD].
         * This is used for backing up the NVGPRs:
         */
+       SAVE_GPR(14, r1)
        SAVE_NVGPRS(r1)
 
        /* Load complete register state from ts_ckpt* registers */
@@ -391,8 +395,9 @@ restore_gprs:
        REST_GPR(4, r7)                         /* GPR4 */
        REST_4GPRS(8, r7)                       /* GPR8-11 */
        REST_2GPRS(12, r7)                      /* GPR12-13 */
+       REST_GPR(14, r7)                        /* GPR14 */
 
-       REST_NVGPRS(r7)                         /* GPR14-31 */
+       REST_NVGPRS(r7)                         /* GPR15-31 */
 
        /* Load up PPR and DSCR here so we don't run with user values for long
         */
@@ -471,6 +476,7 @@ restore_gprs:
        li      r4, MSR_RI
        mtmsrd  r4, 1
 
+       REST_GPR(14, r1)
        REST_NVGPRS(r1)
 
        addi    r1, r1, TM_FRAME_SIZE
diff --git a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S 
b/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
index 3f3e81852422..a0f62ff3442f 100644
--- a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
+++ b/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
@@ -76,7 +76,7 @@ _GLOBAL(ftrace_caller)
        ld      r5,0(r3)
 
 #ifdef CONFIG_LIVEPATCH
-       mr      r14,r7          /* remember old NIP */
+       mr      r15,r7          /* remember old NIP */
 #endif
        /* Calculate ip from nip-4 into r3 for call below */
        subi    r3, r7, MCOUNT_INSN_SIZE
@@ -100,10 +100,10 @@ ftrace_call:
        nop
 
        /* Load the possibly modified NIP */
-       ld      r15, _NIP(r1)
+       ld      r16, _NIP(r1)
 
 #ifdef CONFIG_LIVEPATCH
-       cmpd    r14, r15        /* has NIP been altered? */
+       cmpd    r15, r16        /* has NIP been altered? */
 #endif
 
 #if defined(CONFIG_LIVEPATCH) && defined(CONFIG_KPROBES_ON_FTRACE)
@@ -111,7 +111,7 @@ ftrace_call:
        beq     1f
 
        /* Check if there is an active jprobe on us */
-       subi    r3, r14, 4
+       subi    r3, r15, 4
        bl      __is_active_jprobe
        nop
 
@@ -130,7 +130,7 @@ ftrace_call:
 #endif
 
        /* Load CTR with the possibly modified NIP */
-       mtctr   r15
+       mtctr   r16
 
        /* Restore gprs */
        REST_GPR(0,r1)
diff --git a/arch/powerpc/kvm/book3s_hv_interrupts.S 
b/arch/powerpc/kvm/book3s_hv_interrupts.S
index dc54373c8780..ef1c0c1e57ff 100644
--- a/arch/powerpc/kvm/book3s_hv_interrupts.S
+++ b/arch/powerpc/kvm/book3s_hv_interrupts.S
@@ -46,7 +46,7 @@ _GLOBAL(__kvmppc_vcore_entry)
        /* Save host state to the stack */
        stdu    r1, -SWITCH_FRAME_SIZE(r1)
 
-       /* Save non-volatile registers (r14 - r31) and CR */
+       /* Save non-volatile registers (r15 - r31) and CR */
        SAVE_NVGPRS(r1)
        mfcr    r3
        std     r3, _CCR(r1)
@@ -149,9 +149,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
         * R3       = trap number on this thread
         * R12      = exit handler id
         * R13      = PACA
+        * R14      = ? XXX
         */
 
-       /* Restore non-volatile host registers (r14 - r31) and CR */
+       /* Restore non-volatile host registers (r15 - r31) and CR */
        REST_NVGPRS(r1)
        ld      r4, _CCR(r1)
        mtcr    r4
diff --git a/arch/powerpc/kvm/book3s_interrupts.S 
b/arch/powerpc/kvm/book3s_interrupts.S
index 901e6fe00c39..b275a544129e 100644
--- a/arch/powerpc/kvm/book3s_interrupts.S
+++ b/arch/powerpc/kvm/book3s_interrupts.S
@@ -38,6 +38,45 @@
 
 #endif /* CONFIG_PPC_BOOK3S_XX */
 
+#if defined(CONFIG_PPC_BOOK3S_64)
+#define VCPU_LOAD_NVGPRS(vcpu) \
+       PPC_LL  r15, VCPU_GPR(R15)(vcpu); \
+       PPC_LL  r16, VCPU_GPR(R16)(vcpu); \
+       PPC_LL  r17, VCPU_GPR(R17)(vcpu); \
+       PPC_LL  r18, VCPU_GPR(R18)(vcpu); \
+       PPC_LL  r19, VCPU_GPR(R19)(vcpu); \
+       PPC_LL  r20, VCPU_GPR(R20)(vcpu); \
+       PPC_LL  r21, VCPU_GPR(R21)(vcpu); \
+       PPC_LL  r22, VCPU_GPR(R22)(vcpu); \
+       PPC_LL  r23, VCPU_GPR(R23)(vcpu); \
+       PPC_LL  r24, VCPU_GPR(R24)(vcpu); \
+       PPC_LL  r25, VCPU_GPR(R25)(vcpu); \
+       PPC_LL  r26, VCPU_GPR(R26)(vcpu); \
+       PPC_LL  r27, VCPU_GPR(R27)(vcpu); \
+       PPC_LL  r28, VCPU_GPR(R28)(vcpu); \
+       PPC_LL  r29, VCPU_GPR(R29)(vcpu); \
+       PPC_LL  r30, VCPU_GPR(R30)(vcpu); \
+       PPC_LL  r31, VCPU_GPR(R31)(vcpu);
+
+#define VCPU_STORE_NVGPRS(vcpu) \
+       PPC_STL r15, VCPU_GPR(R15)(vcpu); \
+       PPC_STL r16, VCPU_GPR(R16)(vcpu); \
+       PPC_STL r17, VCPU_GPR(R17)(vcpu); \
+       PPC_STL r18, VCPU_GPR(R18)(vcpu); \
+       PPC_STL r19, VCPU_GPR(R19)(vcpu); \
+       PPC_STL r20, VCPU_GPR(R20)(vcpu); \
+       PPC_STL r21, VCPU_GPR(R21)(vcpu); \
+       PPC_STL r22, VCPU_GPR(R22)(vcpu); \
+       PPC_STL r23, VCPU_GPR(R23)(vcpu); \
+       PPC_STL r24, VCPU_GPR(R24)(vcpu); \
+       PPC_STL r25, VCPU_GPR(R25)(vcpu); \
+       PPC_STL r26, VCPU_GPR(R26)(vcpu); \
+       PPC_STL r27, VCPU_GPR(R27)(vcpu); \
+       PPC_STL r28, VCPU_GPR(R28)(vcpu); \
+       PPC_STL r29, VCPU_GPR(R29)(vcpu); \
+       PPC_STL r30, VCPU_GPR(R30)(vcpu); \
+       PPC_STL r31, VCPU_GPR(R31)(vcpu);
+#else
 #define VCPU_LOAD_NVGPRS(vcpu) \
        PPC_LL  r14, VCPU_GPR(R14)(vcpu); \
        PPC_LL  r15, VCPU_GPR(R15)(vcpu); \
@@ -56,7 +95,28 @@
        PPC_LL  r28, VCPU_GPR(R28)(vcpu); \
        PPC_LL  r29, VCPU_GPR(R29)(vcpu); \
        PPC_LL  r30, VCPU_GPR(R30)(vcpu); \
-       PPC_LL  r31, VCPU_GPR(R31)(vcpu); \
+       PPC_LL  r31, VCPU_GPR(R31)(vcpu);
+
+#define VCPU_STORE_NVGPRS(vcpu) \
+       PPC_STL r14, VCPU_GPR(R14)(vcpu); \
+       PPC_STL r15, VCPU_GPR(R15)(vcpu); \
+       PPC_STL r16, VCPU_GPR(R16)(vcpu); \
+       PPC_STL r17, VCPU_GPR(R17)(vcpu); \
+       PPC_STL r18, VCPU_GPR(R18)(vcpu); \
+       PPC_STL r19, VCPU_GPR(R19)(vcpu); \
+       PPC_STL r20, VCPU_GPR(R20)(vcpu); \
+       PPC_STL r21, VCPU_GPR(R21)(vcpu); \
+       PPC_STL r22, VCPU_GPR(R22)(vcpu); \
+       PPC_STL r23, VCPU_GPR(R23)(vcpu); \
+       PPC_STL r24, VCPU_GPR(R24)(vcpu); \
+       PPC_STL r25, VCPU_GPR(R25)(vcpu); \
+       PPC_STL r26, VCPU_GPR(R26)(vcpu); \
+       PPC_STL r27, VCPU_GPR(R27)(vcpu); \
+       PPC_STL r28, VCPU_GPR(R28)(vcpu); \
+       PPC_STL r29, VCPU_GPR(R29)(vcpu); \
+       PPC_STL r30, VCPU_GPR(R30)(vcpu); \
+       PPC_STL r31, VCPU_GPR(R31)(vcpu);
+#endif
 
 /*****************************************************************************
  *                                                                           *
@@ -81,12 +141,12 @@ kvm_start_entry:
        /* Save r3 (kvm_run) and r4 (vcpu) */
        SAVE_2GPRS(3, r1)
 
-       /* Save non-volatile registers (r14 - r31) */
+       /* Save non-volatile registers (r14/r15 - r31) */
        SAVE_NVGPRS(r1)
 
        /* Save CR */
-       mfcr    r14
-       stw     r14, _CCR(r1)
+       mfcr    r15
+       stw     r15, _CCR(r1)
 
        /* Save LR */
        PPC_STL r0, _LINK(r1)
@@ -183,24 +243,7 @@ after_sprg3_load:
        /* R7 = vcpu */
        PPC_LL  r7, GPR4(r1)
 
-       PPC_STL r14, VCPU_GPR(R14)(r7)
-       PPC_STL r15, VCPU_GPR(R15)(r7)
-       PPC_STL r16, VCPU_GPR(R16)(r7)
-       PPC_STL r17, VCPU_GPR(R17)(r7)
-       PPC_STL r18, VCPU_GPR(R18)(r7)
-       PPC_STL r19, VCPU_GPR(R19)(r7)
-       PPC_STL r20, VCPU_GPR(R20)(r7)
-       PPC_STL r21, VCPU_GPR(R21)(r7)
-       PPC_STL r22, VCPU_GPR(R22)(r7)
-       PPC_STL r23, VCPU_GPR(R23)(r7)
-       PPC_STL r24, VCPU_GPR(R24)(r7)
-       PPC_STL r25, VCPU_GPR(R25)(r7)
-       PPC_STL r26, VCPU_GPR(R26)(r7)
-       PPC_STL r27, VCPU_GPR(R27)(r7)
-       PPC_STL r28, VCPU_GPR(R28)(r7)
-       PPC_STL r29, VCPU_GPR(R29)(r7)
-       PPC_STL r30, VCPU_GPR(R30)(r7)
-       PPC_STL r31, VCPU_GPR(R31)(r7)
+       VCPU_STORE_NVGPRS(r7)
 
        /* Pass the exit number as 3rd argument to kvmppc_handle_exit */
        lwz     r5, VCPU_TRAP(r7)
@@ -221,10 +264,10 @@ kvm_exit_loop:
        PPC_LL  r4, _LINK(r1)
        mtlr    r4
 
-       lwz     r14, _CCR(r1)
-       mtcr    r14
+       lwz     r15, _CCR(r1)
+       mtcr    r15
 
-       /* Restore non-volatile host registers (r14 - r31) */
+       /* Restore non-volatile host registers (r14/r15 - r31) */
        REST_NVGPRS(r1)
 
        addi    r1, r1, SWITCH_FRAME_SIZE
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
index d0dc8624198f..b149d4fa4a45 100644
--- a/arch/powerpc/kvm/book3s_pr.c
+++ b/arch/powerpc/kvm/book3s_pr.c
@@ -159,6 +159,9 @@ void kvmppc_copy_to_svcpu(struct kvmppc_book3s_shadow_vcpu 
*svcpu,
        svcpu->gpr[11] = vcpu->arch.gpr[11];
        svcpu->gpr[12] = vcpu->arch.gpr[12];
        svcpu->gpr[13] = vcpu->arch.gpr[13];
+#ifdef CONFIG_PPC_BOOK3S_64
+       svcpu->gpr[14] = vcpu->arch.gpr[14];
+#endif
        svcpu->cr  = vcpu->arch.cr;
        svcpu->xer = vcpu->arch.xer;
        svcpu->ctr = vcpu->arch.ctr;
@@ -209,6 +212,9 @@ void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu,
        vcpu->arch.gpr[11] = svcpu->gpr[11];
        vcpu->arch.gpr[12] = svcpu->gpr[12];
        vcpu->arch.gpr[13] = svcpu->gpr[13];
+#ifdef CONFIG_PPC_BOOK3S_64
+       vcpu->arch.gpr[14] = svcpu->gpr[14];
+#endif
        vcpu->arch.cr  = svcpu->cr;
        vcpu->arch.xer = svcpu->xer;
        vcpu->arch.ctr = svcpu->ctr;
diff --git a/arch/powerpc/lib/checksum_64.S b/arch/powerpc/lib/checksum_64.S
index d7f1a966136e..19b0fd549b24 100644
--- a/arch/powerpc/lib/checksum_64.S
+++ b/arch/powerpc/lib/checksum_64.S
@@ -64,9 +64,9 @@ _GLOBAL(__csum_partial)
        mtctr   r6
 
        stdu    r1,-STACKFRAMESIZE(r1)
-       std     r14,STK_REG(R14)(r1)
        std     r15,STK_REG(R15)(r1)
        std     r16,STK_REG(R16)(r1)
+       std     r17,STK_REG(R17)(r1)
 
        ld      r6,0(r3)
        ld      r9,8(r3)
@@ -84,11 +84,11 @@ _GLOBAL(__csum_partial)
 2:
        adde    r0,r0,r6
        ld      r12,32(r3)
-       ld      r14,40(r3)
+       ld      r15,40(r3)
 
        adde    r0,r0,r9
-       ld      r15,48(r3)
-       ld      r16,56(r3)
+       ld      r16,48(r3)
+       ld      r17,56(r3)
        addi    r3,r3,64
 
        adde    r0,r0,r10
@@ -97,13 +97,13 @@ _GLOBAL(__csum_partial)
 
        adde    r0,r0,r12
 
-       adde    r0,r0,r14
-
        adde    r0,r0,r15
+
+       adde    r0,r0,r16
        ld      r6,0(r3)
        ld      r9,8(r3)
 
-       adde    r0,r0,r16
+       adde    r0,r0,r17
        ld      r10,16(r3)
        ld      r11,24(r3)
        bdnz    2b
@@ -111,23 +111,23 @@ _GLOBAL(__csum_partial)
 
        adde    r0,r0,r6
        ld      r12,32(r3)
-       ld      r14,40(r3)
+       ld      r15,40(r3)
 
        adde    r0,r0,r9
-       ld      r15,48(r3)
-       ld      r16,56(r3)
+       ld      r16,48(r3)
+       ld      r17,56(r3)
        addi    r3,r3,64
 
        adde    r0,r0,r10
        adde    r0,r0,r11
        adde    r0,r0,r12
-       adde    r0,r0,r14
        adde    r0,r0,r15
        adde    r0,r0,r16
+       adde    r0,r0,r17
 
-       ld      r14,STK_REG(R14)(r1)
        ld      r15,STK_REG(R15)(r1)
        ld      r16,STK_REG(R16)(r1)
+       ld      r17,STK_REG(R17)(r1)
        addi    r1,r1,STACKFRAMESIZE
 
        andi.   r4,r4,63
@@ -258,9 +258,9 @@ dstnr;      sth     r6,0(r4)
        mtctr   r6
 
        stdu    r1,-STACKFRAMESIZE(r1)
-       std     r14,STK_REG(R14)(r1)
        std     r15,STK_REG(R15)(r1)
        std     r16,STK_REG(R16)(r1)
+       std     r17,STK_REG(R17)(r1)
 
 source;        ld      r6,0(r3)
 source;        ld      r9,8(r3)
@@ -278,11 +278,11 @@ source;   ld      r11,24(r3)
 2:
        adde    r0,r0,r6
 source;        ld      r12,32(r3)
-source;        ld      r14,40(r3)
+source;        ld      r15,40(r3)
 
        adde    r0,r0,r9
-source;        ld      r15,48(r3)
-source;        ld      r16,56(r3)
+source;        ld      r16,48(r3)
+source;        ld      r17,56(r3)
        addi    r3,r3,64
 
        adde    r0,r0,r10
@@ -295,18 +295,18 @@ dest;     std     r11,24(r4)
 
        adde    r0,r0,r12
 dest;  std     r12,32(r4)
-dest;  std     r14,40(r4)
+dest;  std     r15,40(r4)
 
-       adde    r0,r0,r14
-dest;  std     r15,48(r4)
-dest;  std     r16,56(r4)
+       adde    r0,r0,r15
+dest;  std     r16,48(r4)
+dest;  std     r17,56(r4)
        addi    r4,r4,64
 
-       adde    r0,r0,r15
+       adde    r0,r0,r16
 source;        ld      r6,0(r3)
 source;        ld      r9,8(r3)
 
-       adde    r0,r0,r16
+       adde    r0,r0,r17
 source;        ld      r10,16(r3)
 source;        ld      r11,24(r3)
        bdnz    2b
@@ -314,11 +314,11 @@ source;   ld      r11,24(r3)
 
        adde    r0,r0,r6
 source;        ld      r12,32(r3)
-source;        ld      r14,40(r3)
+source;        ld      r15,40(r3)
 
        adde    r0,r0,r9
-source;        ld      r15,48(r3)
-source;        ld      r16,56(r3)
+source;        ld      r16,48(r3)
+source;        ld      r17,56(r3)
        addi    r3,r3,64
 
        adde    r0,r0,r10
@@ -331,19 +331,19 @@ dest;     std     r11,24(r4)
 
        adde    r0,r0,r12
 dest;  std     r12,32(r4)
-dest;  std     r14,40(r4)
+dest;  std     r15,40(r4)
 
-       adde    r0,r0,r14
-dest;  std     r15,48(r4)
-dest;  std     r16,56(r4)
+       adde    r0,r0,r15
+dest;  std     r16,48(r4)
+dest;  std     r17,56(r4)
        addi    r4,r4,64
 
-       adde    r0,r0,r15
        adde    r0,r0,r16
+       adde    r0,r0,r17
 
-       ld      r14,STK_REG(R14)(r1)
        ld      r15,STK_REG(R15)(r1)
        ld      r16,STK_REG(R16)(r1)
+       ld      r17,STK_REG(R17)(r1)
        addi    r1,r1,STACKFRAMESIZE
 
        andi.   r5,r5,63
@@ -406,9 +406,9 @@ dstnr;      stb     r6,0(r4)
        blr
 
 .Lsrc_error:
-       ld      r14,STK_REG(R14)(r1)
        ld      r15,STK_REG(R15)(r1)
        ld      r16,STK_REG(R16)(r1)
+       ld      r17,STK_REG(R17)(r1)
        addi    r1,r1,STACKFRAMESIZE
 .Lsrc_error_nr:
        cmpdi   0,r7,0
@@ -418,9 +418,9 @@ dstnr;      stb     r6,0(r4)
        blr
 
 .Ldest_error:
-       ld      r14,STK_REG(R14)(r1)
        ld      r15,STK_REG(R15)(r1)
        ld      r16,STK_REG(R16)(r1)
+       ld      r17,STK_REG(R17)(r1)
        addi    r1,r1,STACKFRAMESIZE
 .Ldest_error_nr:
        cmpdi   0,r8,0
diff --git a/arch/powerpc/lib/copypage_power7.S 
b/arch/powerpc/lib/copypage_power7.S
index ca5fc8fa7efc..c65fc4a412f2 100644
--- a/arch/powerpc/lib/copypage_power7.S
+++ b/arch/powerpc/lib/copypage_power7.S
@@ -113,13 +113,13 @@ _GLOBAL(copypage_power7)
 #endif
 
 .Lnonvmx_copy:
-       std     r14,STK_REG(R14)(r1)
        std     r15,STK_REG(R15)(r1)
        std     r16,STK_REG(R16)(r1)
        std     r17,STK_REG(R17)(r1)
        std     r18,STK_REG(R18)(r1)
        std     r19,STK_REG(R19)(r1)
        std     r20,STK_REG(R20)(r1)
+       std     r21,STK_REG(R21)(r1)
 
 1:     ld      r0,0(r4)
        ld      r5,8(r4)
@@ -130,13 +130,13 @@ _GLOBAL(copypage_power7)
        ld      r10,48(r4)
        ld      r11,56(r4)
        ld      r12,64(r4)
-       ld      r14,72(r4)
-       ld      r15,80(r4)
-       ld      r16,88(r4)
-       ld      r17,96(r4)
-       ld      r18,104(r4)
-       ld      r19,112(r4)
-       ld      r20,120(r4)
+       ld      r15,72(r4)
+       ld      r16,80(r4)
+       ld      r17,88(r4)
+       ld      r18,96(r4)
+       ld      r19,104(r4)
+       ld      r20,112(r4)
+       ld      r21,120(r4)
        addi    r4,r4,128
        std     r0,0(r3)
        std     r5,8(r3)
@@ -147,22 +147,22 @@ _GLOBAL(copypage_power7)
        std     r10,48(r3)
        std     r11,56(r3)
        std     r12,64(r3)
-       std     r14,72(r3)
-       std     r15,80(r3)
-       std     r16,88(r3)
-       std     r17,96(r3)
-       std     r18,104(r3)
-       std     r19,112(r3)
-       std     r20,120(r3)
+       std     r15,72(r3)
+       std     r16,80(r3)
+       std     r17,88(r3)
+       std     r18,96(r3)
+       std     r19,104(r3)
+       std     r20,112(r3)
+       std     r21,120(r3)
        addi    r3,r3,128
        bdnz    1b
 
-       ld      r14,STK_REG(R14)(r1)
        ld      r15,STK_REG(R15)(r1)
        ld      r16,STK_REG(R16)(r1)
        ld      r17,STK_REG(R17)(r1)
        ld      r18,STK_REG(R18)(r1)
        ld      r19,STK_REG(R19)(r1)
        ld      r20,STK_REG(R20)(r1)
+       ld      r21,STK_REG(R21)(r1)
        addi    r1,r1,STACKFRAMESIZE
        blr
diff --git a/arch/powerpc/lib/copyuser_power7.S 
b/arch/powerpc/lib/copyuser_power7.S
index d416a4a66578..9c137451149b 100644
--- a/arch/powerpc/lib/copyuser_power7.S
+++ b/arch/powerpc/lib/copyuser_power7.S
@@ -50,9 +50,9 @@
 
 
 .Ldo_err4:
-       ld      r16,STK_REG(R16)(r1)
-       ld      r15,STK_REG(R15)(r1)
-       ld      r14,STK_REG(R14)(r1)
+       ld      r17,STK_REG(R16)(r1)
+       ld      r16,STK_REG(R15)(r1)
+       ld      r15,STK_REG(R14)(r1)
 .Ldo_err3:
        bl      exit_vmx_usercopy
        ld      r0,STACKFRAMESIZE+16(r1)
@@ -61,15 +61,15 @@
 #endif /* CONFIG_ALTIVEC */
 
 .Ldo_err2:
-       ld      r22,STK_REG(R22)(r1)
-       ld      r21,STK_REG(R21)(r1)
-       ld      r20,STK_REG(R20)(r1)
-       ld      r19,STK_REG(R19)(r1)
-       ld      r18,STK_REG(R18)(r1)
-       ld      r17,STK_REG(R17)(r1)
-       ld      r16,STK_REG(R16)(r1)
-       ld      r15,STK_REG(R15)(r1)
-       ld      r14,STK_REG(R14)(r1)
+       ld      r23,STK_REG(R22)(r1)
+       ld      r22,STK_REG(R21)(r1)
+       ld      r21,STK_REG(R20)(r1)
+       ld      r20,STK_REG(R19)(r1)
+       ld      r19,STK_REG(R18)(r1)
+       ld      r18,STK_REG(R17)(r1)
+       ld      r17,STK_REG(R16)(r1)
+       ld      r16,STK_REG(R15)(r1)
+       ld      r15,STK_REG(R14)(r1)
 .Lexit:
        addi    r1,r1,STACKFRAMESIZE
 .Ldo_err1:
@@ -130,15 +130,15 @@ err1;     stw     r0,0(r3)
 
        mflr    r0
        stdu    r1,-STACKFRAMESIZE(r1)
-       std     r14,STK_REG(R14)(r1)
-       std     r15,STK_REG(R15)(r1)
-       std     r16,STK_REG(R16)(r1)
-       std     r17,STK_REG(R17)(r1)
-       std     r18,STK_REG(R18)(r1)
-       std     r19,STK_REG(R19)(r1)
-       std     r20,STK_REG(R20)(r1)
-       std     r21,STK_REG(R21)(r1)
-       std     r22,STK_REG(R22)(r1)
+       std     r15,STK_REG(R14)(r1)
+       std     r16,STK_REG(R15)(r1)
+       std     r17,STK_REG(R16)(r1)
+       std     r18,STK_REG(R17)(r1)
+       std     r19,STK_REG(R18)(r1)
+       std     r20,STK_REG(R19)(r1)
+       std     r21,STK_REG(R20)(r1)
+       std     r22,STK_REG(R21)(r1)
+       std     r23,STK_REG(R22)(r1)
        std     r0,STACKFRAMESIZE+16(r1)
 
        srdi    r6,r5,7
@@ -155,14 +155,14 @@ err2;     ld      r9,32(r4)
 err2;  ld      r10,40(r4)
 err2;  ld      r11,48(r4)
 err2;  ld      r12,56(r4)
-err2;  ld      r14,64(r4)
-err2;  ld      r15,72(r4)
-err2;  ld      r16,80(r4)
-err2;  ld      r17,88(r4)
-err2;  ld      r18,96(r4)
-err2;  ld      r19,104(r4)
-err2;  ld      r20,112(r4)
-err2;  ld      r21,120(r4)
+err2;  ld      r15,64(r4)
+err2;  ld      r16,72(r4)
+err2;  ld      r17,80(r4)
+err2;  ld      r18,88(r4)
+err2;  ld      r19,96(r4)
+err2;  ld      r20,104(r4)
+err2;  ld      r21,112(r4)
+err2;  ld      r22,120(r4)
        addi    r4,r4,128
 err2;  std     r0,0(r3)
 err2;  std     r6,8(r3)
@@ -172,28 +172,28 @@ err2;     std     r9,32(r3)
 err2;  std     r10,40(r3)
 err2;  std     r11,48(r3)
 err2;  std     r12,56(r3)
-err2;  std     r14,64(r3)
-err2;  std     r15,72(r3)
-err2;  std     r16,80(r3)
-err2;  std     r17,88(r3)
-err2;  std     r18,96(r3)
-err2;  std     r19,104(r3)
-err2;  std     r20,112(r3)
-err2;  std     r21,120(r3)
+err2;  std     r15,64(r3)
+err2;  std     r16,72(r3)
+err2;  std     r17,80(r3)
+err2;  std     r18,88(r3)
+err2;  std     r19,96(r3)
+err2;  std     r20,104(r3)
+err2;  std     r21,112(r3)
+err2;  std     r22,120(r3)
        addi    r3,r3,128
        bdnz    4b
 
        clrldi  r5,r5,(64-7)
 
-       ld      r14,STK_REG(R14)(r1)
-       ld      r15,STK_REG(R15)(r1)
-       ld      r16,STK_REG(R16)(r1)
-       ld      r17,STK_REG(R17)(r1)
-       ld      r18,STK_REG(R18)(r1)
-       ld      r19,STK_REG(R19)(r1)
-       ld      r20,STK_REG(R20)(r1)
-       ld      r21,STK_REG(R21)(r1)
-       ld      r22,STK_REG(R22)(r1)
+       ld      r15,STK_REG(R14)(r1)
+       ld      r16,STK_REG(R15)(r1)
+       ld      r17,STK_REG(R16)(r1)
+       ld      r18,STK_REG(R17)(r1)
+       ld      r19,STK_REG(R18)(r1)
+       ld      r20,STK_REG(R19)(r1)
+       ld      r21,STK_REG(R20)(r1)
+       ld      r22,STK_REG(R21)(r1)
+       ld      r23,STK_REG(R22)(r1)
        addi    r1,r1,STACKFRAMESIZE
 
        /* Up to 127B to go */
@@ -404,14 +404,14 @@ err3;     stvx    v0,r3,r11
 7:     sub     r5,r5,r6
        srdi    r6,r5,7
 
-       std     r14,STK_REG(R14)(r1)
-       std     r15,STK_REG(R15)(r1)
-       std     r16,STK_REG(R16)(r1)
+       std     r15,STK_REG(R14)(r1)
+       std     r16,STK_REG(R15)(r1)
+       std     r17,STK_REG(R16)(r1)
 
        li      r12,64
-       li      r14,80
-       li      r15,96
-       li      r16,112
+       li      r15,80
+       li      r16,96
+       li      r17,112
 
        mtctr   r6
 
@@ -426,24 +426,24 @@ err4;     lvx     v6,r4,r9
 err4;  lvx     v5,r4,r10
 err4;  lvx     v4,r4,r11
 err4;  lvx     v3,r4,r12
-err4;  lvx     v2,r4,r14
-err4;  lvx     v1,r4,r15
-err4;  lvx     v0,r4,r16
+err4;  lvx     v2,r4,r15
+err4;  lvx     v1,r4,r16
+err4;  lvx     v0,r4,r17
        addi    r4,r4,128
 err4;  stvx    v7,0,r3
 err4;  stvx    v6,r3,r9
 err4;  stvx    v5,r3,r10
 err4;  stvx    v4,r3,r11
 err4;  stvx    v3,r3,r12
-err4;  stvx    v2,r3,r14
-err4;  stvx    v1,r3,r15
-err4;  stvx    v0,r3,r16
+err4;  stvx    v2,r3,r15
+err4;  stvx    v1,r3,r16
+err4;  stvx    v0,r3,r17
        addi    r3,r3,128
        bdnz    8b
 
-       ld      r14,STK_REG(R14)(r1)
-       ld      r15,STK_REG(R15)(r1)
-       ld      r16,STK_REG(R16)(r1)
+       ld      r15,STK_REG(R14)(r1)
+       ld      r16,STK_REG(R15)(r1)
+       ld      r17,STK_REG(R16)(r1)
 
        /* Up to 127B to go */
        clrldi  r5,r5,(64-7)
@@ -589,14 +589,14 @@ err3;     stvx    v11,r3,r11
 7:     sub     r5,r5,r6
        srdi    r6,r5,7
 
-       std     r14,STK_REG(R14)(r1)
-       std     r15,STK_REG(R15)(r1)
-       std     r16,STK_REG(R16)(r1)
+       std     r15,STK_REG(R14)(r1)
+       std     r16,STK_REG(R15)(r1)
+       std     r17,STK_REG(R16)(r1)
 
        li      r12,64
-       li      r14,80
-       li      r15,96
-       li      r16,112
+       li      r15,80
+       li      r16,96
+       li      r17,112
 
        mtctr   r6
 
@@ -616,11 +616,11 @@ err4;     lvx     v4,r4,r11
        VPERM(v11,v5,v4,v16)
 err4;  lvx     v3,r4,r12
        VPERM(v12,v4,v3,v16)
-err4;  lvx     v2,r4,r14
+err4;  lvx     v2,r4,r15
        VPERM(v13,v3,v2,v16)
-err4;  lvx     v1,r4,r15
+err4;  lvx     v1,r4,r16
        VPERM(v14,v2,v1,v16)
-err4;  lvx     v0,r4,r16
+err4;  lvx     v0,r4,r17
        VPERM(v15,v1,v0,v16)
        addi    r4,r4,128
 err4;  stvx    v8,0,r3
@@ -628,15 +628,15 @@ err4;     stvx    v9,r3,r9
 err4;  stvx    v10,r3,r10
 err4;  stvx    v11,r3,r11
 err4;  stvx    v12,r3,r12
-err4;  stvx    v13,r3,r14
-err4;  stvx    v14,r3,r15
-err4;  stvx    v15,r3,r16
+err4;  stvx    v13,r3,r15
+err4;  stvx    v14,r3,r16
+err4;  stvx    v15,r3,r17
        addi    r3,r3,128
        bdnz    8b
 
-       ld      r14,STK_REG(R14)(r1)
-       ld      r15,STK_REG(R15)(r1)
-       ld      r16,STK_REG(R16)(r1)
+       ld      r15,STK_REG(R14)(r1)
+       ld      r16,STK_REG(R15)(r1)
+       ld      r17,STK_REG(R16)(r1)
 
        /* Up to 127B to go */
        clrldi  r5,r5,(64-7)
diff --git a/arch/powerpc/lib/crtsavres.S b/arch/powerpc/lib/crtsavres.S
index 7e5e1c28e56a..c46ad2f0a718 100644
--- a/arch/powerpc/lib/crtsavres.S
+++ b/arch/powerpc/lib/crtsavres.S
@@ -314,9 +314,12 @@ _GLOBAL(_restvr_31)
 
 #else /* CONFIG_PPC64 */
 
+/* 64-bit has -ffixed-r13, Book3S also has -ffixed-r14 */
+#ifdef CONFIG_PPC_BOOK3E
 .globl _savegpr0_14
 _savegpr0_14:
        std     r14,-144(r1)
+#endif
 .globl _savegpr0_15
 _savegpr0_15:
        std     r15,-136(r1)
diff --git a/arch/powerpc/lib/memcpy_power7.S b/arch/powerpc/lib/memcpy_power7.S
index 193909abd18b..dd679a0fa650 100644
--- a/arch/powerpc/lib/memcpy_power7.S
+++ b/arch/powerpc/lib/memcpy_power7.S
@@ -75,7 +75,6 @@ _GLOBAL(memcpy_power7)
 
        mflr    r0
        stdu    r1,-STACKFRAMESIZE(r1)
-       std     r14,STK_REG(R14)(r1)
        std     r15,STK_REG(R15)(r1)
        std     r16,STK_REG(R16)(r1)
        std     r17,STK_REG(R17)(r1)
@@ -84,6 +83,7 @@ _GLOBAL(memcpy_power7)
        std     r20,STK_REG(R20)(r1)
        std     r21,STK_REG(R21)(r1)
        std     r22,STK_REG(R22)(r1)
+       std     r23,STK_REG(R23)(r1)
        std     r0,STACKFRAMESIZE+16(r1)
 
        srdi    r6,r5,7
@@ -100,14 +100,14 @@ _GLOBAL(memcpy_power7)
        ld      r10,40(r4)
        ld      r11,48(r4)
        ld      r12,56(r4)
-       ld      r14,64(r4)
-       ld      r15,72(r4)
-       ld      r16,80(r4)
-       ld      r17,88(r4)
-       ld      r18,96(r4)
-       ld      r19,104(r4)
-       ld      r20,112(r4)
-       ld      r21,120(r4)
+       ld      r15,64(r4)
+       ld      r16,72(r4)
+       ld      r17,80(r4)
+       ld      r18,88(r4)
+       ld      r19,96(r4)
+       ld      r20,104(r4)
+       ld      r21,112(r4)
+       ld      r22,120(r4)
        addi    r4,r4,128
        std     r0,0(r3)
        std     r6,8(r3)
@@ -117,20 +117,19 @@ _GLOBAL(memcpy_power7)
        std     r10,40(r3)
        std     r11,48(r3)
        std     r12,56(r3)
-       std     r14,64(r3)
-       std     r15,72(r3)
-       std     r16,80(r3)
-       std     r17,88(r3)
-       std     r18,96(r3)
-       std     r19,104(r3)
-       std     r20,112(r3)
-       std     r21,120(r3)
+       std     r15,64(r3)
+       std     r16,72(r3)
+       std     r17,80(r3)
+       std     r18,88(r3)
+       std     r19,96(r3)
+       std     r20,104(r3)
+       std     r21,112(r3)
+       std     r22,120(r3)
        addi    r3,r3,128
        bdnz    4b
 
        clrldi  r5,r5,(64-7)
 
-       ld      r14,STK_REG(R14)(r1)
        ld      r15,STK_REG(R15)(r1)
        ld      r16,STK_REG(R16)(r1)
        ld      r17,STK_REG(R17)(r1)
@@ -139,6 +138,7 @@ _GLOBAL(memcpy_power7)
        ld      r20,STK_REG(R20)(r1)
        ld      r21,STK_REG(R21)(r1)
        ld      r22,STK_REG(R22)(r1)
+       ld      r23,STK_REG(R23)(r1)
        addi    r1,r1,STACKFRAMESIZE
 
        /* Up to 127B to go */
@@ -349,14 +349,14 @@ _GLOBAL(memcpy_power7)
 7:     sub     r5,r5,r6
        srdi    r6,r5,7
 
-       std     r14,STK_REG(R14)(r1)
        std     r15,STK_REG(R15)(r1)
        std     r16,STK_REG(R16)(r1)
+       std     r17,STK_REG(R17)(r1)
 
        li      r12,64
-       li      r14,80
-       li      r15,96
-       li      r16,112
+       li      r15,80
+       li      r16,96
+       li      r17,112
 
        mtctr   r6
 
@@ -371,24 +371,24 @@ _GLOBAL(memcpy_power7)
        lvx     v5,r4,r10
        lvx     v4,r4,r11
        lvx     v3,r4,r12
-       lvx     v2,r4,r14
-       lvx     v1,r4,r15
-       lvx     v0,r4,r16
+       lvx     v2,r4,r15
+       lvx     v1,r4,r16
+       lvx     v0,r4,r17
        addi    r4,r4,128
        stvx    v7,0,r3
        stvx    v6,r3,r9
        stvx    v5,r3,r10
        stvx    v4,r3,r11
        stvx    v3,r3,r12
-       stvx    v2,r3,r14
-       stvx    v1,r3,r15
-       stvx    v0,r3,r16
+       stvx    v2,r3,r15
+       stvx    v1,r3,r16
+       stvx    v0,r3,r17
        addi    r3,r3,128
        bdnz    8b
 
-       ld      r14,STK_REG(R14)(r1)
        ld      r15,STK_REG(R15)(r1)
        ld      r16,STK_REG(R16)(r1)
+       ld      r17,STK_REG(R17)(r1)
 
        /* Up to 127B to go */
        clrldi  r5,r5,(64-7)
@@ -535,14 +535,14 @@ _GLOBAL(memcpy_power7)
 7:     sub     r5,r5,r6
        srdi    r6,r5,7
 
-       std     r14,STK_REG(R14)(r1)
        std     r15,STK_REG(R15)(r1)
        std     r16,STK_REG(R16)(r1)
+       std     r17,STK_REG(R17)(r1)
 
        li      r12,64
-       li      r14,80
-       li      r15,96
-       li      r16,112
+       li      r15,80
+       li      r16,96
+       li      r17,112
 
        mtctr   r6
 
@@ -562,11 +562,11 @@ _GLOBAL(memcpy_power7)
        VPERM(v11,v5,v4,v16)
        lvx     v3,r4,r12
        VPERM(v12,v4,v3,v16)
-       lvx     v2,r4,r14
+       lvx     v2,r4,r15
        VPERM(v13,v3,v2,v16)
-       lvx     v1,r4,r15
+       lvx     v1,r4,r16
        VPERM(v14,v2,v1,v16)
-       lvx     v0,r4,r16
+       lvx     v0,r4,r17
        VPERM(v15,v1,v0,v16)
        addi    r4,r4,128
        stvx    v8,0,r3
@@ -574,15 +574,15 @@ _GLOBAL(memcpy_power7)
        stvx    v10,r3,r10
        stvx    v11,r3,r11
        stvx    v12,r3,r12
-       stvx    v13,r3,r14
-       stvx    v14,r3,r15
-       stvx    v15,r3,r16
+       stvx    v13,r3,r15
+       stvx    v14,r3,r16
+       stvx    v15,r3,r17
        addi    r3,r3,128
        bdnz    8b
 
-       ld      r14,STK_REG(R14)(r1)
        ld      r15,STK_REG(R15)(r1)
        ld      r16,STK_REG(R16)(r1)
+       ld      r17,STK_REG(R17)(r1)
 
        /* Up to 127B to go */
        clrldi  r5,r5,(64-7)
-- 
2.15.0

Reply via email to