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: Nicholas Piggin <npiggin@gmail.com> [mpe: Fix Book3E build, don't build the "power7" variants for non-Book3S] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
Родитель
d50614fa45
Коммит
15a3204d24
|
@ -245,6 +245,7 @@ endif
|
|||
cpu-as-$(CONFIG_4xx) += -Wa,-m405
|
||||
cpu-as-$(CONFIG_ALTIVEC) += $(call as-option,-Wa$(comma)-maltivec)
|
||||
cpu-as-$(CONFIG_E200) += -Wa,-me200
|
||||
cpu-as-$(CONFIG_PPC_BOOK3S_64) += -Wa,-mpower4
|
||||
|
||||
KBUILD_AFLAGS += $(cpu-as-y)
|
||||
KBUILD_CFLAGS += $(cpu-as-y)
|
||||
|
|
|
@ -439,14 +439,11 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)
|
|||
|
||||
/* The following stops all load and store data streams associated with stream
|
||||
* 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) \
|
||||
.machine push ; \
|
||||
.machine "power4" ; \
|
||||
lis scratch,0x60000000@h; \
|
||||
dcbt 0,scratch,0b01010; \
|
||||
.machine pop
|
||||
#define DCBT_BOOK3S_STOP_ALL_STREAM_IDS(scratch) \
|
||||
lis scratch,0x60000000@h; \
|
||||
dcbt 0,scratch,0b01010
|
||||
|
||||
/*
|
||||
* toreal/fromreal/tophys/tovirt macros. 32-bit BookE makes them
|
||||
|
|
|
@ -545,7 +545,7 @@ _GLOBAL(_switch)
|
|||
/* Cancel all explict user streams as they will have no use after context
|
||||
* switch and will stop the HW from creating streams itself
|
||||
*/
|
||||
DCBT_STOP_ALL_STREAM_IDS(r6)
|
||||
DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r6)
|
||||
#endif
|
||||
|
||||
addi r6,r4,-THREAD /* Convert THREAD to 'current' */
|
||||
|
|
|
@ -687,14 +687,11 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_TYPE_RADIX)
|
|||
|
||||
bne cr4,1f /* returning to kernel */
|
||||
|
||||
.machine push
|
||||
.machine "power4"
|
||||
mtcrf 0x80,r9
|
||||
mtcrf 0x08,r9 /* MSR[PR] indication is in cr4 */
|
||||
mtcrf 0x04,r9 /* MSR[RI] indication is in cr5 */
|
||||
mtcrf 0x02,r9 /* I/D indication is in cr6 */
|
||||
mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */
|
||||
.machine pop
|
||||
|
||||
RESTORE_CTR(r9, PACA_EXSLB)
|
||||
RESTORE_PPR_PACA(PACA_EXSLB, r9)
|
||||
|
@ -707,14 +704,11 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_TYPE_RADIX)
|
|||
RFI_TO_USER
|
||||
b . /* prevent speculative execution */
|
||||
1:
|
||||
.machine push
|
||||
.machine "power4"
|
||||
mtcrf 0x80,r9
|
||||
mtcrf 0x08,r9 /* MSR[PR] indication is in cr4 */
|
||||
mtcrf 0x04,r9 /* MSR[RI] indication is in cr5 */
|
||||
mtcrf 0x02,r9 /* I/D indication is in cr6 */
|
||||
mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */
|
||||
.machine pop
|
||||
|
||||
RESTORE_CTR(r9, PACA_EXSLB)
|
||||
RESTORE_PPR_PACA(PACA_EXSLB, r9)
|
||||
|
@ -1524,7 +1518,7 @@ TRAMP_REAL_BEGIN(rfi_flush_fallback)
|
|||
ld r11,PACA_L1D_FLUSH_SIZE(r13)
|
||||
srdi r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
|
||||
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 */
|
||||
sync
|
||||
|
@ -1564,7 +1558,7 @@ TRAMP_REAL_BEGIN(hrfi_flush_fallback)
|
|||
ld r11,PACA_L1D_FLUSH_SIZE(r13)
|
||||
srdi r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
|
||||
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 */
|
||||
sync
|
||||
|
|
|
@ -22,9 +22,11 @@ ifeq ($(call ld-ifversion, -lt, 225000000, y),y)
|
|||
extra-$(CONFIG_PPC64) += crtsavres.o
|
||||
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 \
|
||||
copyuser_power7.o string_64.o copypage_power7.o memcpy_power7.o \
|
||||
memcpy_64.o memcmp_64.o pmem.o
|
||||
string_64.o memcpy_64.o memcmp_64.o pmem.o
|
||||
|
||||
obj64-$(CONFIG_SMP) += locks.o
|
||||
obj64-$(CONFIG_ALTIVEC) += vmx-helper.o
|
||||
|
|
|
@ -21,7 +21,9 @@ _GLOBAL_TOC(copy_page)
|
|||
BEGIN_FTR_SECTION
|
||||
lis r5,PAGE_SIZE@h
|
||||
FTR_SECTION_ELSE
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
b copypage_power7
|
||||
#endif
|
||||
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY)
|
||||
ori r5,r5,PAGE_SIZE@l
|
||||
BEGIN_FTR_SECTION
|
||||
|
|
|
@ -42,8 +42,6 @@ _GLOBAL(copypage_power7)
|
|||
lis r8,0x8000 /* GO=1 */
|
||||
clrldi r8,r8,32
|
||||
|
||||
.machine push
|
||||
.machine "power4"
|
||||
/* setup read stream 0 */
|
||||
dcbt 0,r4,0b01000 /* addr from */
|
||||
dcbt 0,r7,0b01010 /* length and depth from */
|
||||
|
@ -52,7 +50,6 @@ _GLOBAL(copypage_power7)
|
|||
dcbtst 0,r10,0b01010 /* length and depth to */
|
||||
eieio
|
||||
dcbt 0,r8,0b01010 /* all streams GO */
|
||||
.machine pop
|
||||
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
mflr r0
|
||||
|
|
|
@ -20,11 +20,13 @@
|
|||
|
||||
.align 7
|
||||
_GLOBAL_TOC(__copy_tofrom_user)
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
BEGIN_FTR_SECTION
|
||||
nop
|
||||
FTR_SECTION_ELSE
|
||||
b __copy_tofrom_user_power7
|
||||
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY)
|
||||
#endif
|
||||
_GLOBAL(__copy_tofrom_user_base)
|
||||
/* first check for a whole page copy on a page boundary */
|
||||
cmpldi cr1,r5,16
|
||||
|
|
|
@ -312,8 +312,6 @@ err1; stb r0,0(r3)
|
|||
lis r8,0x8000 /* GO=1 */
|
||||
clrldi r8,r8,32
|
||||
|
||||
.machine push
|
||||
.machine "power4"
|
||||
/* setup read stream 0 */
|
||||
dcbt 0,r6,0b01000 /* addr from */
|
||||
dcbt 0,r7,0b01010 /* length and depth from */
|
||||
|
@ -322,7 +320,6 @@ err1; stb r0,0(r3)
|
|||
dcbtst 0,r10,0b01010 /* length and depth to */
|
||||
eieio
|
||||
dcbt 0,r8,0b01010 /* all streams GO */
|
||||
.machine pop
|
||||
|
||||
beq cr1,.Lunwind_stack_nonvmx_copy
|
||||
|
||||
|
|
|
@ -19,9 +19,11 @@ BEGIN_FTR_SECTION
|
|||
std r3,-STACKFRAMESIZE+STK_REG(R31)(r1) /* save destination pointer for return value */
|
||||
#endif
|
||||
FTR_SECTION_ELSE
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
#ifndef SELFTEST
|
||||
b memcpy_power7
|
||||
#endif
|
||||
#endif
|
||||
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY)
|
||||
#ifdef __LITTLE_ENDIAN__
|
||||
/* dumb little-endian memcpy that will get replaced at runtime */
|
||||
|
|
|
@ -259,15 +259,12 @@ _GLOBAL(memcpy_power7)
|
|||
lis r8,0x8000 /* GO=1 */
|
||||
clrldi r8,r8,32
|
||||
|
||||
.machine push
|
||||
.machine "power4"
|
||||
dcbt 0,r6,0b01000
|
||||
dcbt 0,r7,0b01010
|
||||
dcbtst 0,r9,0b01000
|
||||
dcbtst 0,r10,0b01010
|
||||
eieio
|
||||
dcbt 0,r8,0b01010 /* GO */
|
||||
.machine pop
|
||||
|
||||
beq cr1,.Lunwind_stack_nonvmx_copy
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче