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
+