[rtems commit] bsps/powerpc: Fix 64-bit issues in assembler files

Sebastian Huber sebh at rtems.org
Fri Jan 25 14:40:25 UTC 2019


Module:    rtems
Branch:    master
Commit:    81aec1814674750f7ac2d59c4d55931251b22986
Changeset: http://git.rtems.org/rtems/commit/?id=81aec1814674750f7ac2d59c4d55931251b22986

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu Jan 24 14:29:03 2019 +0100

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 4d6af38..931fb87 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 87db3cf..1d11301 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 5b095d9..e4d6270 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 e87efff..b559dfb 100644
--- a/bsps/powerpc/shared/start/bsp-start-zero.S
+++ b/bsps/powerpc/shared/start/bsp-start-zero.S
@@ -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
 



More information about the vc mailing list