From 81aec1814674750f7ac2d59c4d55931251b22986 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 24 Jan 2019 14:29:03 +0100 Subject: bsps/powerpc: Fix 64-bit issues in assembler files We have to be careful with instructions which operate explicitly on words or doublewords. Update #3082. --- bsps/powerpc/include/libcpu/powerpc-utility.h | 24 ++++++++++++++++++++++++ bsps/powerpc/qoriq/start/start.S | 4 ++-- bsps/powerpc/shared/cpu_asm.S | 8 ++++---- bsps/powerpc/shared/start/bsp-start-zero.S | 8 ++++---- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/bsps/powerpc/include/libcpu/powerpc-utility.h b/bsps/powerpc/include/libcpu/powerpc-utility.h index 4d6af38485..931fb87d7c 100644 --- a/bsps/powerpc/include/libcpu/powerpc-utility.h +++ b/bsps/powerpc/include/libcpu/powerpc-utility.h @@ -974,6 +974,30 @@ void ShowBATS(void); #endif .endm +.macro SHIFT_RIGHT_IMMEDIATE rd, rs, imm +#if defined(__powerpc64__) + srdi \rd, \rs, \imm +#else + srwi \rd, \rs, \imm +#endif +.endm + +.macro COMPARE_LOGICAL cr, ra, rb +#if defined(__powerpc64__) + cmpld \cr, \ra, \rb +#else + cmplw \cr, \ra, \rb +#endif +.endm + +.macro CLEAR_RIGHT_IMMEDIATE rd, rs, imm +#if defined(__powerpc64__) + clrrdi \rd, \rs, \imm +#else + clrrwi \rd, \rs, \imm +#endif +.endm + #define LINKER_SYMBOL(sym) .extern sym #endif /* ASM */ diff --git a/bsps/powerpc/qoriq/start/start.S b/bsps/powerpc/qoriq/start/start.S index 87db3cfff2..1d11301cdf 100644 --- a/bsps/powerpc/qoriq/start/start.S +++ b/bsps/powerpc/qoriq/start/start.S @@ -106,7 +106,7 @@ _start: cmpwi r3, 0 bne .Lnull_area_setup_done LA r3, bsp_section_start_begin - srawi r3, r3, 2 + SHIFT_RIGHT_IMMEDIATE r3, r3, 2 mtctr r3 li r3, -4 LWI r4, 0x44000002 @@ -319,7 +319,7 @@ _start_thread: /* Initialize start stack */ PPC_REG_LOAD r3, PER_CPU_INTERRUPT_STACK_HIGH(CPU_SELF) subi r1, r3, PPC_MINIMUM_STACK_FRAME_SIZE - clrrwi r1, r1, PPC_STACK_ALIGN_POWER + CLEAR_RIGHT_IMMEDIATE r1, r1, PPC_STACK_ALIGN_POWER li r0, 0 PPC_REG_STORE r0, 0(r1) diff --git a/bsps/powerpc/shared/cpu_asm.S b/bsps/powerpc/shared/cpu_asm.S index 5b095d9cea..e4d627016c 100644 --- a/bsps/powerpc/shared/cpu_asm.S +++ b/bsps/powerpc/shared/cpu_asm.S @@ -266,8 +266,8 @@ PROC (_CPU_Context_switch): #endif /* Align to a cache line */ - clrrwi r3, r3, PPC_DEFAULT_CACHE_LINE_POWER - clrrwi r5, r4, PPC_DEFAULT_CACHE_LINE_POWER + CLEAR_RIGHT_IMMEDIATE r3, r3, PPC_DEFAULT_CACHE_LINE_POWER + CLEAR_RIGHT_IMMEDIATE r5, r4, PPC_DEFAULT_CACHE_LINE_POWER DATA_CACHE_ZERO_AND_TOUCH(r10, PPC_CONTEXT_CACHE_LINE_0) @@ -557,7 +557,7 @@ restore_context: PUBLIC_PROC (_CPU_Context_restore) PROC (_CPU_Context_restore): /* Align to a cache line */ - clrrwi r5, r3, PPC_DEFAULT_CACHE_LINE_POWER + CLEAR_RIGHT_IMMEDIATE r5, r3, PPC_DEFAULT_CACHE_LINE_POWER GET_SELF_CPU_CONTROL r12 @@ -586,7 +586,7 @@ PROC (_CPU_Context_restore): /* Calculate the heir context pointer */ sub r7, r4, r7 add r4, r8, r7 - clrrwi r5, r4, PPC_DEFAULT_CACHE_LINE_POWER + CLEAR_RIGHT_IMMEDIATE r5, r4, PPC_DEFAULT_CACHE_LINE_POWER /* Update the executing */ PPC_REG_STORE r8, PER_CPU_OFFSET_EXECUTING(r12) diff --git a/bsps/powerpc/shared/start/bsp-start-zero.S b/bsps/powerpc/shared/start/bsp-start-zero.S index e87efff8c3..b559dfb166 100644 --- a/bsps/powerpc/shared/start/bsp-start-zero.S +++ b/bsps/powerpc/shared/start/bsp-start-zero.S @@ -21,7 +21,7 @@ */ #include -#include +#include #include .globl bsp_start_zero @@ -35,10 +35,10 @@ bsp_start_zero: bsp_start_zero_begin: li r0, 0 subi r11, r3, 1 - clrrwi r11, r11, PPC_CACHE_ALIGN_POWER + CLEAR_RIGHT_IMMEDIATE r11, r11, PPC_CACHE_ALIGN_POWER addi r10, r11, PPC_CACHE_ALIGNMENT subf r11, r3, r10 - cmplw cr7, r11, r4 + COMPARE_LOGICAL cr7, r11, r4 add r9, r3, r4 ble- cr7, head_end_done mr r10, r9 @@ -56,7 +56,7 @@ head_loop_update: bdnz+ head_loop_begin subf r11, r3, r9 - srwi r11, r11, PPC_CACHE_ALIGN_POWER + SHIFT_RIGHT_IMMEDIATE r11, r11, PPC_CACHE_ALIGN_POWER addi r11, r11, 1 mtctr r11 -- cgit v1.2.3