Commit 15a3204d authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman

powerpc/64s: Set assembler machine type to POWER4

Rather than override the machine type in .S code (which can hide wrong
or ambiguous code generation for the target), set the type to power4
for all assembly.

This also means we need to be careful not to build power4-only code
when we're not building for Book3S, such as the "power7" versions of
copyuser/page/memcpy.
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
[mpe: Fix Book3E build, don't build the "power7" variants for non-Book3S]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent d50614fa
...@@ -245,6 +245,7 @@ endif ...@@ -245,6 +245,7 @@ endif
cpu-as-$(CONFIG_4xx) += -Wa,-m405 cpu-as-$(CONFIG_4xx) += -Wa,-m405
cpu-as-$(CONFIG_ALTIVEC) += $(call as-option,-Wa$(comma)-maltivec) cpu-as-$(CONFIG_ALTIVEC) += $(call as-option,-Wa$(comma)-maltivec)
cpu-as-$(CONFIG_E200) += -Wa,-me200 cpu-as-$(CONFIG_E200) += -Wa,-me200
cpu-as-$(CONFIG_PPC_BOOK3S_64) += -Wa,-mpower4
KBUILD_AFLAGS += $(cpu-as-y) KBUILD_AFLAGS += $(cpu-as-y)
KBUILD_CFLAGS += $(cpu-as-y) KBUILD_CFLAGS += $(cpu-as-y)
......
...@@ -439,14 +439,11 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601) ...@@ -439,14 +439,11 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)
/* The following stops all load and store data streams associated with stream /* The following stops all load and store data streams associated with stream
* ID (ie. streams created explicitly). The embedded and server mnemonics for * ID (ie. streams created explicitly). The embedded and server mnemonics for
* dcbt are different so we use machine "power4" here explicitly. * dcbt are different so this must only be used for server.
*/ */
#define DCBT_STOP_ALL_STREAM_IDS(scratch) \ #define DCBT_BOOK3S_STOP_ALL_STREAM_IDS(scratch) \
.machine push ; \ lis scratch,0x60000000@h; \
.machine "power4" ; \ dcbt 0,scratch,0b01010
lis scratch,0x60000000@h; \
dcbt 0,scratch,0b01010; \
.machine pop
/* /*
* toreal/fromreal/tophys/tovirt macros. 32-bit BookE makes them * toreal/fromreal/tophys/tovirt macros. 32-bit BookE makes them
......
...@@ -545,7 +545,7 @@ _GLOBAL(_switch) ...@@ -545,7 +545,7 @@ _GLOBAL(_switch)
/* Cancel all explict user streams as they will have no use after context /* Cancel all explict user streams as they will have no use after context
* switch and will stop the HW from creating streams itself * switch and will stop the HW from creating streams itself
*/ */
DCBT_STOP_ALL_STREAM_IDS(r6) DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r6)
#endif #endif
addi r6,r4,-THREAD /* Convert THREAD to 'current' */ addi r6,r4,-THREAD /* Convert THREAD to 'current' */
......
...@@ -687,14 +687,11 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_TYPE_RADIX) ...@@ -687,14 +687,11 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_TYPE_RADIX)
bne cr4,1f /* returning to kernel */ bne cr4,1f /* returning to kernel */
.machine push
.machine "power4"
mtcrf 0x80,r9 mtcrf 0x80,r9
mtcrf 0x08,r9 /* MSR[PR] indication is in cr4 */ mtcrf 0x08,r9 /* MSR[PR] indication is in cr4 */
mtcrf 0x04,r9 /* MSR[RI] indication is in cr5 */ mtcrf 0x04,r9 /* MSR[RI] indication is in cr5 */
mtcrf 0x02,r9 /* I/D indication is in cr6 */ mtcrf 0x02,r9 /* I/D indication is in cr6 */
mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */ mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */
.machine pop
RESTORE_CTR(r9, PACA_EXSLB) RESTORE_CTR(r9, PACA_EXSLB)
RESTORE_PPR_PACA(PACA_EXSLB, r9) RESTORE_PPR_PACA(PACA_EXSLB, r9)
...@@ -707,14 +704,11 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_TYPE_RADIX) ...@@ -707,14 +704,11 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_TYPE_RADIX)
RFI_TO_USER RFI_TO_USER
b . /* prevent speculative execution */ b . /* prevent speculative execution */
1: 1:
.machine push
.machine "power4"
mtcrf 0x80,r9 mtcrf 0x80,r9
mtcrf 0x08,r9 /* MSR[PR] indication is in cr4 */ mtcrf 0x08,r9 /* MSR[PR] indication is in cr4 */
mtcrf 0x04,r9 /* MSR[RI] indication is in cr5 */ mtcrf 0x04,r9 /* MSR[RI] indication is in cr5 */
mtcrf 0x02,r9 /* I/D indication is in cr6 */ mtcrf 0x02,r9 /* I/D indication is in cr6 */
mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */ mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */
.machine pop
RESTORE_CTR(r9, PACA_EXSLB) RESTORE_CTR(r9, PACA_EXSLB)
RESTORE_PPR_PACA(PACA_EXSLB, r9) RESTORE_PPR_PACA(PACA_EXSLB, r9)
...@@ -1524,7 +1518,7 @@ TRAMP_REAL_BEGIN(rfi_flush_fallback) ...@@ -1524,7 +1518,7 @@ TRAMP_REAL_BEGIN(rfi_flush_fallback)
ld r11,PACA_L1D_FLUSH_SIZE(r13) ld r11,PACA_L1D_FLUSH_SIZE(r13)
srdi r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */ srdi r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
mtctr r11 mtctr r11
DCBT_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */ DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */
/* order ld/st prior to dcbt stop all streams with flushing */ /* order ld/st prior to dcbt stop all streams with flushing */
sync sync
...@@ -1564,7 +1558,7 @@ TRAMP_REAL_BEGIN(hrfi_flush_fallback) ...@@ -1564,7 +1558,7 @@ TRAMP_REAL_BEGIN(hrfi_flush_fallback)
ld r11,PACA_L1D_FLUSH_SIZE(r13) ld r11,PACA_L1D_FLUSH_SIZE(r13)
srdi r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */ srdi r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
mtctr r11 mtctr r11
DCBT_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */ DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */
/* order ld/st prior to dcbt stop all streams with flushing */ /* order ld/st prior to dcbt stop all streams with flushing */
sync sync
......
...@@ -22,9 +22,11 @@ ifeq ($(call ld-ifversion, -lt, 225000000, y),y) ...@@ -22,9 +22,11 @@ ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
extra-$(CONFIG_PPC64) += crtsavres.o extra-$(CONFIG_PPC64) += crtsavres.o
endif endif
obj-$(CONFIG_PPC_BOOK3S_64) += copyuser_power7.o copypage_power7.o \
memcpy_power7.o
obj64-y += copypage_64.o copyuser_64.o mem_64.o hweight_64.o \ obj64-y += copypage_64.o copyuser_64.o mem_64.o hweight_64.o \
copyuser_power7.o string_64.o copypage_power7.o memcpy_power7.o \ string_64.o memcpy_64.o memcmp_64.o pmem.o
memcpy_64.o memcmp_64.o pmem.o
obj64-$(CONFIG_SMP) += locks.o obj64-$(CONFIG_SMP) += locks.o
obj64-$(CONFIG_ALTIVEC) += vmx-helper.o obj64-$(CONFIG_ALTIVEC) += vmx-helper.o
......
...@@ -21,7 +21,9 @@ _GLOBAL_TOC(copy_page) ...@@ -21,7 +21,9 @@ _GLOBAL_TOC(copy_page)
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
lis r5,PAGE_SIZE@h lis r5,PAGE_SIZE@h
FTR_SECTION_ELSE FTR_SECTION_ELSE
#ifdef CONFIG_PPC_BOOK3S_64
b copypage_power7 b copypage_power7
#endif
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY) ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY)
ori r5,r5,PAGE_SIZE@l ori r5,r5,PAGE_SIZE@l
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
......
...@@ -42,8 +42,6 @@ _GLOBAL(copypage_power7) ...@@ -42,8 +42,6 @@ _GLOBAL(copypage_power7)
lis r8,0x8000 /* GO=1 */ lis r8,0x8000 /* GO=1 */
clrldi r8,r8,32 clrldi r8,r8,32
.machine push
.machine "power4"
/* setup read stream 0 */ /* setup read stream 0 */
dcbt 0,r4,0b01000 /* addr from */ dcbt 0,r4,0b01000 /* addr from */
dcbt 0,r7,0b01010 /* length and depth from */ dcbt 0,r7,0b01010 /* length and depth from */
...@@ -52,7 +50,6 @@ _GLOBAL(copypage_power7) ...@@ -52,7 +50,6 @@ _GLOBAL(copypage_power7)
dcbtst 0,r10,0b01010 /* length and depth to */ dcbtst 0,r10,0b01010 /* length and depth to */
eieio eieio
dcbt 0,r8,0b01010 /* all streams GO */ dcbt 0,r8,0b01010 /* all streams GO */
.machine pop
#ifdef CONFIG_ALTIVEC #ifdef CONFIG_ALTIVEC
mflr r0 mflr r0
......
...@@ -20,11 +20,13 @@ ...@@ -20,11 +20,13 @@
.align 7 .align 7
_GLOBAL_TOC(__copy_tofrom_user) _GLOBAL_TOC(__copy_tofrom_user)
#ifdef CONFIG_PPC_BOOK3S_64
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
nop nop
FTR_SECTION_ELSE FTR_SECTION_ELSE
b __copy_tofrom_user_power7 b __copy_tofrom_user_power7
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY) ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY)
#endif
_GLOBAL(__copy_tofrom_user_base) _GLOBAL(__copy_tofrom_user_base)
/* first check for a whole page copy on a page boundary */ /* first check for a whole page copy on a page boundary */
cmpldi cr1,r5,16 cmpldi cr1,r5,16
......
...@@ -312,8 +312,6 @@ err1; stb r0,0(r3) ...@@ -312,8 +312,6 @@ err1; stb r0,0(r3)
lis r8,0x8000 /* GO=1 */ lis r8,0x8000 /* GO=1 */
clrldi r8,r8,32 clrldi r8,r8,32
.machine push
.machine "power4"
/* setup read stream 0 */ /* setup read stream 0 */
dcbt 0,r6,0b01000 /* addr from */ dcbt 0,r6,0b01000 /* addr from */
dcbt 0,r7,0b01010 /* length and depth from */ dcbt 0,r7,0b01010 /* length and depth from */
...@@ -322,7 +320,6 @@ err1; stb r0,0(r3) ...@@ -322,7 +320,6 @@ err1; stb r0,0(r3)
dcbtst 0,r10,0b01010 /* length and depth to */ dcbtst 0,r10,0b01010 /* length and depth to */
eieio eieio
dcbt 0,r8,0b01010 /* all streams GO */ dcbt 0,r8,0b01010 /* all streams GO */
.machine pop
beq cr1,.Lunwind_stack_nonvmx_copy beq cr1,.Lunwind_stack_nonvmx_copy
......
...@@ -19,9 +19,11 @@ BEGIN_FTR_SECTION ...@@ -19,9 +19,11 @@ BEGIN_FTR_SECTION
std r3,-STACKFRAMESIZE+STK_REG(R31)(r1) /* save destination pointer for return value */ std r3,-STACKFRAMESIZE+STK_REG(R31)(r1) /* save destination pointer for return value */
#endif #endif
FTR_SECTION_ELSE FTR_SECTION_ELSE
#ifdef CONFIG_PPC_BOOK3S_64
#ifndef SELFTEST #ifndef SELFTEST
b memcpy_power7 b memcpy_power7
#endif #endif
#endif
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY) ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY)
#ifdef __LITTLE_ENDIAN__ #ifdef __LITTLE_ENDIAN__
/* dumb little-endian memcpy that will get replaced at runtime */ /* dumb little-endian memcpy that will get replaced at runtime */
......
...@@ -259,15 +259,12 @@ _GLOBAL(memcpy_power7) ...@@ -259,15 +259,12 @@ _GLOBAL(memcpy_power7)
lis r8,0x8000 /* GO=1 */ lis r8,0x8000 /* GO=1 */
clrldi r8,r8,32 clrldi r8,r8,32
.machine push
.machine "power4"
dcbt 0,r6,0b01000 dcbt 0,r6,0b01000
dcbt 0,r7,0b01010 dcbt 0,r7,0b01010
dcbtst 0,r9,0b01000 dcbtst 0,r9,0b01000
dcbtst 0,r10,0b01010 dcbtst 0,r10,0b01010
eieio eieio
dcbt 0,r8,0b01010 /* GO */ dcbt 0,r8,0b01010 /* GO */
.machine pop
beq cr1,.Lunwind_stack_nonvmx_copy beq cr1,.Lunwind_stack_nonvmx_copy
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment