diff options
author | Scott Wood <scottwood@freescale.com> | 2011-06-14 19:34:27 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-07-12 06:16:31 -0400 |
commit | c51584d52e3878aa9b2bb98cdfb87173e7acf560 (patch) | |
tree | c52d3133b30fcc6b68555b8b55232f89fb4b7c84 | |
parent | 685659ee70db0bac47ffd619c726cf600e504fd7 (diff) |
powerpc/e500: SPE register saving: take arbitrary struct offset
Previously, these macros hardcoded THREAD_EVR0 as the base of the save
area, relative to the base register passed. This base offset is now
passed as a separate macro parameter, allowing reuse with other SPE
save areas, such as used by KVM.
Acked-by: Kumar Gala <galak@kernel.crashing.org>
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r-- | arch/powerpc/include/asm/ppc_asm.h | 28 | ||||
-rw-r--r-- | arch/powerpc/kernel/head_fsl_booke.S | 6 |
2 files changed, 19 insertions, 15 deletions
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index 1b422381fc16..368f72f79808 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h | |||
@@ -150,18 +150,22 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR) | |||
150 | #define REST_16VSRSU(n,b,base) REST_8VSRSU(n,b,base); REST_8VSRSU(n+8,b,base) | 150 | #define REST_16VSRSU(n,b,base) REST_8VSRSU(n,b,base); REST_8VSRSU(n+8,b,base) |
151 | #define REST_32VSRSU(n,b,base) REST_16VSRSU(n,b,base); REST_16VSRSU(n+16,b,base) | 151 | #define REST_32VSRSU(n,b,base) REST_16VSRSU(n,b,base); REST_16VSRSU(n+16,b,base) |
152 | 152 | ||
153 | #define SAVE_EVR(n,s,base) evmergehi s,s,n; stw s,THREAD_EVR0+4*(n)(base) | 153 | /* |
154 | #define SAVE_2EVRS(n,s,base) SAVE_EVR(n,s,base); SAVE_EVR(n+1,s,base) | 154 | * b = base register for addressing, o = base offset from register of 1st EVR |
155 | #define SAVE_4EVRS(n,s,base) SAVE_2EVRS(n,s,base); SAVE_2EVRS(n+2,s,base) | 155 | * n = first EVR, s = scratch |
156 | #define SAVE_8EVRS(n,s,base) SAVE_4EVRS(n,s,base); SAVE_4EVRS(n+4,s,base) | 156 | */ |
157 | #define SAVE_16EVRS(n,s,base) SAVE_8EVRS(n,s,base); SAVE_8EVRS(n+8,s,base) | 157 | #define SAVE_EVR(n,s,b,o) evmergehi s,s,n; stw s,o+4*(n)(b) |
158 | #define SAVE_32EVRS(n,s,base) SAVE_16EVRS(n,s,base); SAVE_16EVRS(n+16,s,base) | 158 | #define SAVE_2EVRS(n,s,b,o) SAVE_EVR(n,s,b,o); SAVE_EVR(n+1,s,b,o) |
159 | #define REST_EVR(n,s,base) lwz s,THREAD_EVR0+4*(n)(base); evmergelo n,s,n | 159 | #define SAVE_4EVRS(n,s,b,o) SAVE_2EVRS(n,s,b,o); SAVE_2EVRS(n+2,s,b,o) |
160 | #define REST_2EVRS(n,s,base) REST_EVR(n,s,base); REST_EVR(n+1,s,base) | 160 | #define SAVE_8EVRS(n,s,b,o) SAVE_4EVRS(n,s,b,o); SAVE_4EVRS(n+4,s,b,o) |
161 | #define REST_4EVRS(n,s,base) REST_2EVRS(n,s,base); REST_2EVRS(n+2,s,base) | 161 | #define SAVE_16EVRS(n,s,b,o) SAVE_8EVRS(n,s,b,o); SAVE_8EVRS(n+8,s,b,o) |
162 | #define REST_8EVRS(n,s,base) REST_4EVRS(n,s,base); REST_4EVRS(n+4,s,base) | 162 | #define SAVE_32EVRS(n,s,b,o) SAVE_16EVRS(n,s,b,o); SAVE_16EVRS(n+16,s,b,o) |
163 | #define REST_16EVRS(n,s,base) REST_8EVRS(n,s,base); REST_8EVRS(n+8,s,base) | 163 | #define REST_EVR(n,s,b,o) lwz s,o+4*(n)(b); evmergelo n,s,n |
164 | #define REST_32EVRS(n,s,base) REST_16EVRS(n,s,base); REST_16EVRS(n+16,s,base) | 164 | #define REST_2EVRS(n,s,b,o) REST_EVR(n,s,b,o); REST_EVR(n+1,s,b,o) |
165 | #define REST_4EVRS(n,s,b,o) REST_2EVRS(n,s,b,o); REST_2EVRS(n+2,s,b,o) | ||
166 | #define REST_8EVRS(n,s,b,o) REST_4EVRS(n,s,b,o); REST_4EVRS(n+4,s,b,o) | ||
167 | #define REST_16EVRS(n,s,b,o) REST_8EVRS(n,s,b,o); REST_8EVRS(n+8,s,b,o) | ||
168 | #define REST_32EVRS(n,s,b,o) REST_16EVRS(n,s,b,o); REST_16EVRS(n+16,s,b,o) | ||
165 | 169 | ||
166 | /* Macros to adjust thread priority for hardware multithreading */ | 170 | /* Macros to adjust thread priority for hardware multithreading */ |
167 | #define HMT_VERY_LOW or 31,31,31 # very low priority | 171 | #define HMT_VERY_LOW or 31,31,31 # very low priority |
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index aede4f87b682..fe37dd0dfd17 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S | |||
@@ -656,7 +656,7 @@ load_up_spe: | |||
656 | cmpi 0,r4,0 | 656 | cmpi 0,r4,0 |
657 | beq 1f | 657 | beq 1f |
658 | addi r4,r4,THREAD /* want THREAD of last_task_used_spe */ | 658 | addi r4,r4,THREAD /* want THREAD of last_task_used_spe */ |
659 | SAVE_32EVRS(0,r10,r4) | 659 | SAVE_32EVRS(0,r10,r4,THREAD_EVR0) |
660 | evxor evr10, evr10, evr10 /* clear out evr10 */ | 660 | evxor evr10, evr10, evr10 /* clear out evr10 */ |
661 | evmwumiaa evr10, evr10, evr10 /* evr10 <- ACC = 0 * 0 + ACC */ | 661 | evmwumiaa evr10, evr10, evr10 /* evr10 <- ACC = 0 * 0 + ACC */ |
662 | li r5,THREAD_ACC | 662 | li r5,THREAD_ACC |
@@ -676,7 +676,7 @@ load_up_spe: | |||
676 | stw r4,THREAD_USED_SPE(r5) | 676 | stw r4,THREAD_USED_SPE(r5) |
677 | evlddx evr4,r10,r5 | 677 | evlddx evr4,r10,r5 |
678 | evmra evr4,evr4 | 678 | evmra evr4,evr4 |
679 | REST_32EVRS(0,r10,r5) | 679 | REST_32EVRS(0,r10,r5,THREAD_EVR0) |
680 | #ifndef CONFIG_SMP | 680 | #ifndef CONFIG_SMP |
681 | subi r4,r5,THREAD | 681 | subi r4,r5,THREAD |
682 | stw r4,last_task_used_spe@l(r3) | 682 | stw r4,last_task_used_spe@l(r3) |
@@ -787,7 +787,7 @@ _GLOBAL(giveup_spe) | |||
787 | addi r3,r3,THREAD /* want THREAD of task */ | 787 | addi r3,r3,THREAD /* want THREAD of task */ |
788 | lwz r5,PT_REGS(r3) | 788 | lwz r5,PT_REGS(r3) |
789 | cmpi 0,r5,0 | 789 | cmpi 0,r5,0 |
790 | SAVE_32EVRS(0, r4, r3) | 790 | SAVE_32EVRS(0, r4, r3, THREAD_EVR0) |
791 | evxor evr6, evr6, evr6 /* clear out evr6 */ | 791 | evxor evr6, evr6, evr6 /* clear out evr6 */ |
792 | evmwumiaa evr6, evr6, evr6 /* evr6 <- ACC = 0 * 0 + ACC */ | 792 | evmwumiaa evr6, evr6, evr6 /* evr6 <- ACC = 0 * 0 + ACC */ |
793 | li r4,THREAD_ACC | 793 | li r4,THREAD_ACC |