Merge pull request #1174 from shenki/hostboot-cmpi-fix
hostboot: Add patches to fix cmpi assembly
diff --git a/openpower/package/hostboot/p8Patches/hostboot-0011-Convert-cmpi-to-cmpwi-to-fix-build-for-modern-binuti.patch b/openpower/package/hostboot/p8Patches/hostboot-0011-Convert-cmpi-to-cmpwi-to-fix-build-for-modern-binuti.patch
new file mode 100644
index 0000000..651200d
--- /dev/null
+++ b/openpower/package/hostboot/p8Patches/hostboot-0011-Convert-cmpi-to-cmpwi-to-fix-build-for-modern-binuti.patch
@@ -0,0 +1,225 @@
+From 3e9a825d1a217ab02a24d14e80cad993a864079e 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: I878ab3596f54c221879945944f2dfbf053427026
+Signed-off-by: Joel Stanley <joel@jms.id.au>
+Signed-off-by: Joel Stanley <joel.stanley@au1.ibm.com>
+---
+ src/kernel/start.S | 34 +++++++++++++++++-----------------
+ src/runtime/rt_start.S | 2 +-
+ 2 files changed, 18 insertions(+), 18 deletions(-)
+
+diff --git a/src/kernel/start.S b/src/kernel/start.S
+index 6474a2ced794..5015b652e407 100644
+--- a/src/kernel/start.S
++++ b/src/kernel/start.S
+@@ -199,7 +199,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)
+
+@@ -292,7 +292,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
+@@ -307,12 +307,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.
+
+@@ -388,7 +388,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:
+
+@@ -470,7 +470,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.
+@@ -587,7 +587,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
+@@ -598,12 +598,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.
+@@ -617,13 +617,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.
+@@ -721,14 +721,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.
+@@ -755,7 +755,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.
+@@ -770,7 +770,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.
+@@ -800,7 +800,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.
+diff --git a/src/runtime/rt_start.S b/src/runtime/rt_start.S
+index d69184aef29f..821e9f956b8e 100644
+--- a/src/runtime/rt_start.S
++++ b/src/runtime/rt_start.S
+@@ -47,7 +47,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
+
diff --git a/openpower/package/hostboot/p9Patches/hostboot-0004-Convert-cmpi-to-cmpwi-to-fix-build-for-modern-binuti.patch b/openpower/package/hostboot/p9Patches/hostboot-0004-Convert-cmpi-to-cmpwi-to-fix-build-for-modern-binuti.patch
new file mode 100644
index 0000000..345ac74
--- /dev/null
+++ b/openpower/package/hostboot/p9Patches/hostboot-0004-Convert-cmpi-to-cmpwi-to-fix-build-for-modern-binuti.patch
@@ -0,0 +1,267 @@
+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
+