| From 10983d35f568cad17b2550635eddb3c11606aab9 Mon Sep 17 00:00:00 2001 |
| From: Joel Stanley <joel@jms.id.au> |
| Date: Thu, 22 Jun 2017 13:43:47 +0930 |
| Subject: [PATCH] Convert cmpi to cmpwi to fix build for modern binutils |
| |
| From Linux 80f23935cadb ("powerpc: Convert cmp to cmpd in idle enter sequence"): |
| |
| PowerPC's "cmp" instruction has four operands. Normally people write |
| "cmpw" or "cmpd" for the second cmp operand 0 or 1. But, frequently |
| people forget, and write "cmp" with just three operands. |
| |
| With older binutils this is silently accepted as if this was "cmpw", |
| while often "cmpd" is wanted. With newer binutils GAS will complain |
| about this for 64-bit code. For 32-bit code it still silently assumes |
| "cmpw" is what is meant. |
| |
| In this instance the code comes directly from ISA v2.07, including the |
| cmp, but cmpd is correct. Backport to stable so that new toolchains can |
| build old kernels. |
| |
| This is change is a noop with the existing toolchain. We change from |
| implicitly generating the cmpwi to explicitly stating in for |
| compatibility with newer toolchains. |
| |
| With gcc 4.9.3, binutils 2.25.2: |
| |
| $ cat asm-test.S |
| .text |
| |
| .global test |
| cmpi 0, 8, 1 |
| $ powerpc64-linux-gcc -c asm-test.S |
| $ objdump -d asm-test.o |
| 0000000000000000 <.text>: |
| 2c 08 00 01 cmpwi r8,1 |
| |
| Old compiler, updated instruction: |
| |
| $ cat asm-test.S |
| .text |
| |
| .global test |
| cmpwi 0, 8, 1 |
| $ powerpc64-linux-gcc -c asm-test.S |
| $ objdump -d asm-test.o |
| 0000000000000000 <.text>: |
| 2c 08 00 01 cmpwi r8,1 |
| |
| And then the new toolchain (gcc 6.3.0, binutils 2.28) with the updated |
| asm: |
| |
| $ cat asm-test.S |
| .text |
| |
| .global test |
| cmpwi 0, 8, 1 |
| $ powerpc64-linux-gnu-gcc -c asm-test.S |
| $ objdump -d asm-test.o |
| 0000000000000000 <.text>: |
| 2c 08 00 01 cmpwi r8,1 |
| |
| Change-Id: If981e20a578ec98ede68a31eee2888c27d5c3d10 |
| Signed-off-by: Joel Stanley <joel@jms.id.au> |
| Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/42259 |
| Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> |
| Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> |
| Reviewed-by: STEWART E. SMITH <stewart@linux.vnet.ibm.com> |
| Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> |
| Signed-off-by: Joel Stanley <joel.stanley@au1.ibm.com> |
| --- |
| src/kernel/start.S | 41 +++++++++++++++++++++-------------------- |
| src/runtime/rt_start.S | 7 +++++-- |
| 2 files changed, 26 insertions(+), 22 deletions(-) |
| |
| diff --git a/src/kernel/start.S b/src/kernel/start.S |
| index 190717257a69..9b61720a3ac2 100644 |
| --- a/src/kernel/start.S |
| +++ b/src/kernel/start.S |
| @@ -5,8 +5,9 @@ |
| # |
| # OpenPOWER HostBoot Project |
| # |
| -# Contributors Listed Below - COPYRIGHT 2010,2016 |
| +# Contributors Listed Below - COPYRIGHT 2010,2017 |
| # [+] International Business Machines Corp. |
| +# [+] Joel Stanley |
| # |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| @@ -202,7 +203,7 @@ UNIMPL_INTERRUPT(hype_decrementer, 0x980) |
| ;// |
| .org _start + 0xC00 |
| intvect_system_call_fast: |
| - cmpi cr0, r3, 0x0800 |
| + cmpwi cr0, r3, 0x0800 |
| bge cr0, system_call_fast_path |
| STD_INTERRUPT(system_call, 0xC08) |
| |
| @@ -306,7 +307,7 @@ _other_thread_spinlock: |
| 1: |
| ld r3, 0(r2) |
| ;// Loop until value is 1... |
| - cmpi cr0, r3, 1 |
| + cmpwi cr0, r3, 1 |
| beq _other_thread_spinlock_complete |
| or 1,1,1 ;// Lower thread priority. |
| b 1b |
| @@ -321,12 +322,12 @@ _other_thread_spinlock_complete: |
| extrwi r1, r1, 3, 19 |
| sldi r1, r1, 3 |
| ldx r2, r1, r2 ;// Dereference to get on-node CPUs array. |
| - cmpi cr0, r2, 0 ;// Check for NULL node array. |
| + cmpwi cr0, r2, 0 ;// Check for NULL node array. |
| beq- 1f |
| mfspr r1, PIR ;// Extract on-node CPU id. |
| clrlslwi r1, r1, 22, 3 |
| ldx r3, r1, r2 ;// Load CPU object. |
| - cmpi cr0, r3, 0 ;// Check for NULL CPU object. |
| + cmpwi cr0, r3, 0 ;// Check for NULL CPU object. |
| beq- 1f |
| ld r1, CPU_KERNEL_STACK(r3) ;// Load initial stack. |
| |
| @@ -402,7 +403,7 @@ kernel_save_task: |
| std r31, TASK_GPR_31(r1) ;// Save GPR31 |
| |
| ld r2, TASK_FP_CONTEXT(r1) ;// Load FP Context pointer. |
| - cmpi cr0, r2, 0 |
| + cmpwi cr0, r2, 0 |
| bne- cr0, 1f ;// Jump to FP-save if != NULL. |
| 2: |
| |
| @@ -484,7 +485,7 @@ kernel_dispatch_task: |
| |
| ;// Check if FP enabled, load context. |
| ld r2, TASK_FP_CONTEXT(r1) |
| - cmpi cr0, r2, 0 |
| + cmpwi cr0, r2, 0 |
| bne- 1f |
| 2: |
| ;// Restore GPRs from context. |
| @@ -601,7 +602,7 @@ intvect_system_reset: |
| lis r2, kernel_other_thread_spinlock@h |
| ori r2, r2, kernel_other_thread_spinlock@l |
| ld r2, 0(r2) |
| - cmpi cr0, r2, 0 |
| + cmpwi cr0, r2, 0 |
| beq- _start |
| |
| ;// Get CPU object from thread ID, check for NULL which implies not |
| @@ -612,12 +613,12 @@ intvect_system_reset: |
| extrwi r1, r1, 3, 19 |
| sldi r1, r1, 3 |
| ldx r2, r1, r2 ;// Dereference to get on-node CPUs array. |
| - cmpi cr0, r2, 0 ;// Check for NULL node array. |
| + cmpwi cr0, r2, 0 ;// Check for NULL node array. |
| beq- _start |
| mfspr r1, PIR ;// Extract on-node CPU id. |
| clrlslwi r1, r1, 22, 3 |
| ldx r2, r1, r2 ;// Load CPU object. |
| - cmpi cr0, r2, 0 ;// Check for NULL CPU object. |
| + cmpwi cr0, r2, 0 ;// Check for NULL CPU object. |
| beq- _start |
| |
| ;// Check for inactive CPU. |
| @@ -631,13 +632,13 @@ intvect_system_reset: |
| mfsrr1 r2 |
| extrdi r2, r2, 3, 42 |
| ;// Check for decrementer (bits = 011). |
| - cmpi cr0, r2, 0x3 |
| + cmpwi cr0, r2, 0x3 |
| beq+ intvect_system_reset_decrementer |
| ;// Check for external interrupt (bits = 010). |
| - cmpi cr0, r2, 0x4 |
| + cmpwi cr0, r2, 0x4 |
| beq+ intvect_system_reset_external |
| ;// Check for HMI (bits = 101). |
| - cmpi cr0, r2, 0x5 |
| + cmpwi cr0, r2, 0x5 |
| beq+ 1f ;// Unable to handle HMI, jump to 'unknown reason'. |
| |
| 1: ;// Unknown reason, call as unhandled_exception. |
| @@ -749,14 +750,14 @@ system_call_fast_path: |
| b 1f ;// Jump to exit point. |
| ;// Check if this is HMER write (0x801). |
| 2: |
| - cmpi cr0, r3, 0x801 |
| + cmpwi cr0, r3, 0x801 |
| bne cr0, 3f |
| mtspr HMER, r4 |
| li r3, 0 |
| b 1f ;// Jump to exit point. |
| ;// Check if this is SCRATCH read (0x802). |
| 3: |
| - cmpi cr0, r3, 0x802 |
| + cmpwi cr0, r3, 0x802 |
| bne cr0, 4f |
| ;// Check for being on master processor. |
| mfsprg3 r6 ;// Get task structure. |
| @@ -783,7 +784,7 @@ system_call_fast_path: |
| b intvect_system_call |
| ;// Check if this is SCRATCH write (0x803). |
| 4: |
| - cmpi cr0, r3, 0x803 |
| + cmpwi cr0, r3, 0x803 |
| bne cr0, 5f |
| ;// Check for master processor. |
| mfsprg3 r6 ;// Get task structure. |
| @@ -798,7 +799,7 @@ system_call_fast_path: |
| b 1f ;// Jump to exit point. |
| ;// Check if this is PVR read (0x804). |
| 5: |
| - cmpi cr0, r3, 0x804 |
| + cmpwi cr0, r3, 0x804 |
| bne cr0, 6f |
| mfspr r3, PVR |
| b 1f ;// Jump to exit point. |
| @@ -828,7 +829,7 @@ system_call_fast_path: |
| .global userspace_task_entry |
| userspace_task_entry: |
| ;// Skip stack frame if GPR1 == NULL. |
| - cmpi cr0, r1, 0 |
| + cmpwi cr0, r1, 0 |
| beq- 1f |
| ;// Create frame. |
| ;// NULL back-chain + 48 bytes + quad-word alignment. See ABI. |
| @@ -846,11 +847,11 @@ userspace_task_entry: |
| .global task_end_stub |
| task_end_stub: |
| // Check for a NULL stack pointer and skip TLS cleanup. |
| - cmpi cr0, r1, 0 |
| + cmpwi cr0, r1, 0 |
| beq 1f |
| // Check for a NULL TLS-context and skip TLS cleanup. |
| ld r0, TASK_TLS_CONTEXT(r13) |
| - cmpi cr0, r0, 0 |
| + cmpwi cr0, r0, 0 |
| beq 1f |
| // Save off r3. |
| mr r31, r3 |
| diff --git a/src/runtime/rt_start.S b/src/runtime/rt_start.S |
| index d69184aef29f..ba1a975d729e 100644 |
| --- a/src/runtime/rt_start.S |
| +++ b/src/runtime/rt_start.S |
| @@ -5,7 +5,10 @@ |
| # |
| # OpenPOWER HostBoot Project |
| # |
| -# COPYRIGHT International Business Machines Corp. 2013,2014 |
| +# Contributors Listed Below - COPYRIGHT 2013,2017 |
| +# [+] International Business Machines Corp. |
| +# [+] Joel Stanley |
| +# |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| @@ -47,7 +50,7 @@ _init: |
| |
| ld r8, 0(r10) # Get count of relocations. |
| |
| - cmpi cr0, r8, 0 # Perform relocations (if any). |
| + cmpwi cr0, r8, 0 # Perform relocations (if any). |
| beq 2f |
| mtctr r8 |
| 1: |
| -- |
| 2.13.1 |
| |