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.
This commit is contained in:
Sebastian Huber
2019-01-24 14:29:03 +01:00
parent afd50b3a62
commit 81aec18146
4 changed files with 34 additions and 10 deletions

View File

@@ -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 */

View File

@@ -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)

View File

@@ -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)

View File

@@ -21,7 +21,7 @@
*/
#include <rtems/asm.h>
#include <rtems/powerpc/powerpc.h>
#include <libcpu/powerpc-utility.h>
#include <bspopts.h>
.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