* [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc
@ 2022-08-08 11:48 Sathvika Vasireddy
2022-08-08 11:48 ` [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON() Sathvika Vasireddy
` (15 more replies)
0 siblings, 16 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:48 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
This patchset enables and implements objtool --mcount
option on powerpc. This applies atop powerpc/merge branch.
Christophe Leroy (4):
objtool: Fix SEGFAULT
objtool: Use target file endianness instead of a compiled constant
objtool: Use target file class size instead of a compiled constant
powerpc: Fix objtool unannotated intra-function call warnings on PPC32
Sathvika Vasireddy (12):
powerpc: Replace unreachable() with it's builtin variant in WARN_ON()
powerpc: override __ALIGN() and __ALIGN_STR() macros
powerpc: Fix objtool unannotated intra-function call warnings
powerpc: curb objtool unannotated intra-function call warnings
powerpc: Skip objtool from running on drivers/crypto/vmx/aesp8-ppc.o
powerpc: Skip objtool from running on VDSO files
objtool: Add --mnop as an option to --mcount
objtool: Read special sections with alts only when specific options are selected
objtool: Use macros to define arch specific reloc types
objtool: Add arch specific function arch_ftrace_match()
objtool/powerpc: Enable objtool to be built on ppc
objtool/powerpc: Add --mcount specific implementation
Makefile | 4 +-
arch/powerpc/Kconfig | 2 +
arch/powerpc/include/asm/asm.h | 7 ++
arch/powerpc/include/asm/bug.h | 2 +-
arch/powerpc/include/asm/linkage.h | 4 +
arch/powerpc/kernel/cpu_setup_6xx.S | 26 +++--
arch/powerpc/kernel/cpu_setup_fsl_booke.S | 8 +-
arch/powerpc/kernel/entry_32.S | 8 +-
arch/powerpc/kernel/entry_64.S | 2 +
arch/powerpc/kernel/exceptions-64s.S | 7 +-
arch/powerpc/kernel/head_40x.S | 5 +-
arch/powerpc/kernel/head_64.S | 7 +-
arch/powerpc/kernel/head_8xx.S | 5 +-
arch/powerpc/kernel/head_book3s_32.S | 29 ++++--
arch/powerpc/kernel/head_fsl_booke.S | 5 +-
arch/powerpc/kernel/misc_64.S | 4 +-
arch/powerpc/kernel/swsusp_32.S | 5 +-
arch/powerpc/kernel/vdso/Makefile | 2 +
arch/powerpc/kernel/vector.S | 4 +-
arch/powerpc/kvm/book3s_hv_interrupts.S | 4 +-
arch/powerpc/kvm/book3s_hv_rmhandlers.S | 25 +++--
arch/powerpc/kvm/fpu.S | 17 +++-
arch/powerpc/platforms/52xx/lite5200_sleep.S | 15 ++-
arch/x86/Kconfig | 1 +
drivers/crypto/vmx/Makefile | 2 +
scripts/Makefile.lib | 1 +
tools/objtool/arch/powerpc/Build | 2 +
tools/objtool/arch/powerpc/decode.c | 96 +++++++++++++++++++
.../arch/powerpc/include/arch/cfi_regs.h | 11 +++
tools/objtool/arch/powerpc/include/arch/elf.h | 10 ++
.../arch/powerpc/include/arch/special.h | 21 ++++
tools/objtool/arch/powerpc/special.c | 19 ++++
tools/objtool/arch/x86/decode.c | 8 ++
tools/objtool/arch/x86/include/arch/elf.h | 2 +
.../arch/x86/include/arch/endianness.h | 9 --
tools/objtool/builtin-check.c | 14 +++
tools/objtool/check.c | 51 +++++-----
tools/objtool/elf.c | 8 +-
tools/objtool/include/objtool/arch.h | 2 +
tools/objtool/include/objtool/builtin.h | 1 +
tools/objtool/include/objtool/elf.h | 8 ++
tools/objtool/include/objtool/endianness.h | 32 +++----
tools/objtool/orc_dump.c | 11 ++-
tools/objtool/orc_gen.c | 4 +-
tools/objtool/special.c | 3 +-
45 files changed, 408 insertions(+), 105 deletions(-)
create mode 100644 arch/powerpc/include/asm/asm.h
create mode 100644 tools/objtool/arch/powerpc/Build
create mode 100644 tools/objtool/arch/powerpc/decode.c
create mode 100644 tools/objtool/arch/powerpc/include/arch/cfi_regs.h
create mode 100644 tools/objtool/arch/powerpc/include/arch/elf.h
create mode 100644 tools/objtool/arch/powerpc/include/arch/special.h
create mode 100644 tools/objtool/arch/powerpc/special.c
delete mode 100644 tools/objtool/arch/x86/include/arch/endianness.h
--
2.31.1
^ permalink raw reply [flat|nested] 32+ messages in thread
* [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON()
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
@ 2022-08-08 11:48 ` Sathvika Vasireddy
2022-08-10 8:28 ` Christophe Leroy
2022-08-26 10:18 ` Christophe Leroy
2022-08-08 11:48 ` [PATCH 02/16] powerpc: override __ALIGN() and __ALIGN_STR() macros Sathvika Vasireddy
` (14 subsequent siblings)
15 siblings, 2 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:48 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
objtool is throwing *unannotated intra-function call*
warnings with a few instructions that are marked
unreachable. Replace unreachable() with __builtin_unreachable()
to fix these warnings, as the codegen remains same
with unreachable() and __builtin_unreachable().
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
arch/powerpc/include/asm/bug.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/powerpc/include/asm/bug.h b/arch/powerpc/include/asm/bug.h
index 61a4736355c2..074be1a78c56 100644
--- a/arch/powerpc/include/asm/bug.h
+++ b/arch/powerpc/include/asm/bug.h
@@ -99,7 +99,7 @@
__label__ __label_warn_on; \
\
WARN_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags), __label_warn_on); \
- unreachable(); \
+ __builtin_unreachable(); \
\
__label_warn_on: \
break; \
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 02/16] powerpc: override __ALIGN() and __ALIGN_STR() macros
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
2022-08-08 11:48 ` [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON() Sathvika Vasireddy
@ 2022-08-08 11:48 ` Sathvika Vasireddy
2022-08-10 8:31 ` Christophe Leroy
2022-08-08 11:48 ` [PATCH 03/16] powerpc: Fix objtool unannotated intra-function call warnings Sathvika Vasireddy
` (13 subsequent siblings)
15 siblings, 1 reply; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:48 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
Since we need an alignment of 4 bytes, override
__ALIGN() and __ALIGN_STR() accordingly.
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
arch/powerpc/include/asm/linkage.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/arch/powerpc/include/asm/linkage.h b/arch/powerpc/include/asm/linkage.h
index b71b9582e754..8df88fe61438 100644
--- a/arch/powerpc/include/asm/linkage.h
+++ b/arch/powerpc/include/asm/linkage.h
@@ -2,8 +2,12 @@
#ifndef _ASM_POWERPC_LINKAGE_H
#define _ASM_POWERPC_LINKAGE_H
+#include <linux/stringify.h>
#include <asm/types.h>
+#define __ALIGN .align 2
+#define __ALIGN_STR __stringify(__ALIGN)
+
#ifdef CONFIG_PPC64_ELF_ABI_V1
#define cond_syscall(x) \
asm ("\t.weak " #x "\n\t.set " #x ", sys_ni_syscall\n" \
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 03/16] powerpc: Fix objtool unannotated intra-function call warnings
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
2022-08-08 11:48 ` [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON() Sathvika Vasireddy
2022-08-08 11:48 ` [PATCH 02/16] powerpc: override __ALIGN() and __ALIGN_STR() macros Sathvika Vasireddy
@ 2022-08-08 11:48 ` Sathvika Vasireddy
2022-08-10 8:32 ` Christophe Leroy
2022-08-08 11:48 ` [PATCH 04/16] powerpc: curb " Sathvika Vasireddy
` (12 subsequent siblings)
15 siblings, 1 reply; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:48 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
objtool throws unannotated intra-function call warnings
in the following assembly files.
arch/powerpc/kernel/vector.o: warning: objtool: .text+0x53c: unannotated intra-function call
arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x60: unannotated intra-function call
arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x124: unannotated intra-function call
arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x5d4: unannotated intra-function call
arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x5dc: unannotated intra-function call
arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0xcb8: unannotated intra-function call
arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0xd0c: unannotated intra-function call
arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x1030: unannotated intra-function call
arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x358: unannotated intra-function call
arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x728: unannotated intra-function call
arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x4d94: unannotated intra-function call
arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x4ec4: unannotated intra-function call
arch/powerpc/kvm/book3s_hv_interrupts.o: warning: objtool: .text+0x6c: unannotated intra-function call
arch/powerpc/kernel/misc_64.o: warning: objtool: .text+0x64: unannotated intra-function call
Fix these warnings by annotating those functions with
SYM_FUNC_START_LOCAL() and SYM_FUNC_END() macros.
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
arch/powerpc/kernel/exceptions-64s.S | 7 +++++--
arch/powerpc/kernel/head_64.S | 7 +++++--
arch/powerpc/kernel/misc_64.S | 4 +++-
arch/powerpc/kernel/vector.S | 4 +++-
arch/powerpc/kvm/book3s_hv_interrupts.S | 4 +++-
arch/powerpc/kvm/book3s_hv_rmhandlers.S | 22 +++++++++++++++-------
6 files changed, 34 insertions(+), 14 deletions(-)
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 3d0dc133a9ae..4242c1a20bcd 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -20,6 +20,7 @@
#include <asm/head-64.h>
#include <asm/feature-fixups.h>
#include <asm/kup.h>
+#include <linux/linkage.h>
/*
* Following are fixed section helper macros.
@@ -3075,7 +3076,7 @@ CLOSE_FIXED_SECTION(virt_trampolines);
USE_TEXT_SECTION()
/* MSR[RI] should be clear because this uses SRR[01] */
-enable_machine_check:
+SYM_FUNC_START_LOCAL(enable_machine_check)
mflr r0
bcl 20,31,$+4
0: mflr r3
@@ -3087,9 +3088,10 @@ enable_machine_check:
RFI_TO_KERNEL
1: mtlr r0
blr
+SYM_FUNC_END(enable_machine_check)
/* MSR[RI] should be clear because this uses SRR[01] */
-disable_machine_check:
+SYM_FUNC_START_LOCAL(disable_machine_check)
mflr r0
bcl 20,31,$+4
0: mflr r3
@@ -3102,3 +3104,4 @@ disable_machine_check:
RFI_TO_KERNEL
1: mtlr r0
blr
+SYM_FUNC_END(disable_machine_check)
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
index cf2c08902c05..10e2d43420d0 100644
--- a/arch/powerpc/kernel/head_64.S
+++ b/arch/powerpc/kernel/head_64.S
@@ -18,6 +18,7 @@
* variants.
*/
+#include <linux/linkage.h>
#include <linux/threads.h>
#include <linux/init.h>
#include <asm/reg.h>
@@ -465,7 +466,7 @@ generic_secondary_common_init:
* Assumes we're mapped EA == RA if the MMU is on.
*/
#ifdef CONFIG_PPC_BOOK3S
-__mmu_off:
+SYM_FUNC_START_LOCAL(__mmu_off)
mfmsr r3
andi. r0,r3,MSR_IR|MSR_DR
beqlr
@@ -476,6 +477,7 @@ __mmu_off:
sync
rfid
b . /* prevent speculative execution */
+SYM_FUNC_END(__mmu_off)
#endif
@@ -869,7 +871,7 @@ _GLOBAL(start_secondary_resume)
/*
* This subroutine clobbers r11 and r12
*/
-enable_64b_mode:
+SYM_FUNC_START_LOCAL(enable_64b_mode)
mfmsr r11 /* grab the current MSR */
#ifdef CONFIG_PPC_BOOK3E
oris r11,r11,0x8000 /* CM bit set, we'll set ICM later */
@@ -881,6 +883,7 @@ enable_64b_mode:
isync
#endif
blr
+SYM_FUNC_END(enable_64b_mode)
/*
* This puts the TOC pointer into r2, offset by 0x8000 (as expected
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S
index fd6d8d3a548e..b36fb89ff718 100644
--- a/arch/powerpc/kernel/misc_64.S
+++ b/arch/powerpc/kernel/misc_64.S
@@ -9,6 +9,7 @@
* PPC64 updates by Dave Engebretsen (engebret@us.ibm.com)
*/
+#include <linux/linkage.h>
#include <linux/sys.h>
#include <asm/unistd.h>
#include <asm/errno.h>
@@ -353,7 +354,7 @@ _GLOBAL(kexec_smp_wait)
*
* don't overwrite r3 here, it is live for kexec_wait above.
*/
-real_mode: /* assume normal blr return */
+SYM_FUNC_START_LOCAL(real_mode) /* assume normal blr return */
#ifdef CONFIG_PPC_BOOK3E
/* Create an identity mapping. */
b kexec_create_tlb
@@ -370,6 +371,7 @@ real_mode: /* assume normal blr return */
mtspr SPRN_SRR0,r11
rfid
#endif
+SYM_FUNC_END(real_mode)
/*
* kexec_sequence(newstack, start, image, control, clear_all(),
diff --git a/arch/powerpc/kernel/vector.S b/arch/powerpc/kernel/vector.S
index 5cc24d8cce94..fb96aed2b5c3 100644
--- a/arch/powerpc/kernel/vector.S
+++ b/arch/powerpc/kernel/vector.S
@@ -9,6 +9,7 @@
#include <asm/ptrace.h>
#include <asm/export.h>
#include <asm/asm-compat.h>
+#include <linux/linkage.h>
/*
* Load state from memory into VMX registers including VSCR.
@@ -186,7 +187,7 @@ fphalf:
* Internal routine to enable floating point and set FPSCR to 0.
* Don't call it from C; it doesn't use the normal calling convention.
*/
-fpenable:
+SYM_FUNC_START_LOCAL(fpenable)
#ifdef CONFIG_PPC32
stwu r1,-64(r1)
#else
@@ -203,6 +204,7 @@ fpenable:
mffs fr31
MTFSF_L(fr1)
blr
+SYM_FUNC_END(fpenable)
fpdisable:
mtlr r12
diff --git a/arch/powerpc/kvm/book3s_hv_interrupts.S b/arch/powerpc/kvm/book3s_hv_interrupts.S
index 59d89e4b154a..c0deeea7eef3 100644
--- a/arch/powerpc/kvm/book3s_hv_interrupts.S
+++ b/arch/powerpc/kvm/book3s_hv_interrupts.S
@@ -9,6 +9,7 @@
* Authors: Alexander Graf <agraf@suse.de>
*/
+#include <linux/linkage.h>
#include <asm/ppc_asm.h>
#include <asm/kvm_asm.h>
#include <asm/reg.h>
@@ -107,7 +108,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
/*
* void kvmhv_save_host_pmu(void)
*/
-kvmhv_save_host_pmu:
+SYM_FUNC_START_LOCAL(kvmhv_save_host_pmu)
BEGIN_FTR_SECTION
/* Work around P8 PMAE bug */
li r3, -1
@@ -154,3 +155,4 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
stw r8, HSTATE_PMC5(r13)
stw r9, HSTATE_PMC6(r13)
31: blr
+SYM_FUNC_END(kvmhv_save_host_pmu)
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
index 7ded202bf995..de91118df0c5 100644
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
@@ -29,6 +29,7 @@
#include <asm/asm-compat.h>
#include <asm/feature-fixups.h>
#include <asm/cpuidle.h>
+#include <linux/linkage.h>
/* Values in HSTATE_NAPPING(r13) */
#define NAPPING_CEDE 1
@@ -2358,7 +2359,7 @@ hmi_realmode:
* This routine calls kvmppc_read_intr, a C function, if an external
* interrupt is pending.
*/
-kvmppc_check_wake_reason:
+SYM_FUNC_START_LOCAL(kvmppc_check_wake_reason)
mfspr r6, SPRN_SRR1
BEGIN_FTR_SECTION
rlwinm r6, r6, 45-31, 0xf /* extract wake reason field (P8) */
@@ -2427,6 +2428,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
addi r1, r1, PPC_MIN_STKFRM
mtlr r0
blr
+SYM_FUNC_END(kvmppc_check_wake_reason)
/*
* Save away FP, VMX and VSX registers.
@@ -2434,7 +2436,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
* N.B. r30 and r31 are volatile across this function,
* thus it is not callable from C.
*/
-kvmppc_save_fp:
+SYM_FUNC_START_LOCAL(kvmppc_save_fp)
mflr r30
mr r31,r3
mfmsr r5
@@ -2462,6 +2464,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
stw r6,VCPU_VRSAVE(r31)
mtlr r30
blr
+SYM_FUNC_END(kvmppc_save_fp)
/*
* Load up FP, VMX and VSX registers
@@ -2469,7 +2472,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
* N.B. r30 and r31 are volatile across this function,
* thus it is not callable from C.
*/
-kvmppc_load_fp:
+SYM_FUNC_START_LOCAL(kvmppc_load_fp)
mflr r30
mr r31,r4
mfmsr r9
@@ -2498,6 +2501,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
mtlr r30
mr r4,r31
blr
+SYM_FUNC_END(kvmppc_load_fp)
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
/*
@@ -2746,7 +2750,7 @@ kvmppc_bad_host_intr:
* r9 has a vcpu pointer (in)
* r0 is used as a scratch register
*/
-kvmppc_msr_interrupt:
+SYM_FUNC_START_LOCAL(kvmppc_msr_interrupt)
rldicl r0, r11, 64 - MSR_TS_S_LG, 62
cmpwi r0, 2 /* Check if we are in transactional state.. */
ld r11, VCPU_INTR_MSR(r9)
@@ -2755,13 +2759,14 @@ kvmppc_msr_interrupt:
li r0, 1
1: rldimi r11, r0, MSR_TS_S_LG, 63 - MSR_TS_T_LG
blr
+SYM_FUNC_END(kvmppc_msr_interrupt)
/*
* void kvmhv_load_guest_pmu(struct kvm_vcpu *vcpu)
*
* Load up guest PMU state. R3 points to the vcpu struct.
*/
-kvmhv_load_guest_pmu:
+SYM_FUNC_START_LOCAL(kvmhv_load_guest_pmu)
mr r4, r3
mflr r0
li r3, 1
@@ -2811,13 +2816,14 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
isync
mtlr r0
blr
+SYM_FUNC_END(kvmhv_load_guest_pmu)
/*
* void kvmhv_load_host_pmu(void)
*
* Reload host PMU state saved in the PACA by kvmhv_save_host_pmu.
*/
-kvmhv_load_host_pmu:
+SYM_FUNC_START_LOCAL(kvmhv_load_host_pmu)
mflr r0
lbz r4, PACA_PMCINUSE(r13) /* is the host using the PMU? */
cmpwi r4, 0
@@ -2859,6 +2865,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
isync
mtlr r0
23: blr
+SYM_FUNC_END(kvmhv_load_host_pmu)
/*
* void kvmhv_save_guest_pmu(struct kvm_vcpu *vcpu, bool pmu_in_use)
@@ -2866,7 +2873,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
* Save guest PMU state into the vcpu struct.
* r3 = vcpu, r4 = full save flag (PMU in use flag set in VPA)
*/
-kvmhv_save_guest_pmu:
+SYM_FUNC_START_LOCAL(kvmhv_save_guest_pmu)
mr r9, r3
mr r8, r4
BEGIN_FTR_SECTION
@@ -2942,6 +2949,7 @@ BEGIN_FTR_SECTION
mtspr SPRN_MMCRS, r4
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
22: blr
+SYM_FUNC_END(kvmhv_save_guest_pmu)
/*
* This works around a hardware bug on POWER8E processors, where
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 04/16] powerpc: curb objtool unannotated intra-function call warnings
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (2 preceding siblings ...)
2022-08-08 11:48 ` [PATCH 03/16] powerpc: Fix objtool unannotated intra-function call warnings Sathvika Vasireddy
@ 2022-08-08 11:48 ` Sathvika Vasireddy
2022-08-08 11:48 ` [PATCH 05/16] powerpc: Skip objtool from running on drivers/crypto/vmx/aesp8-ppc.o Sathvika Vasireddy
` (11 subsequent siblings)
15 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:48 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
objtool throws the following unannotated intra-function call
warnings:
arch/powerpc/kernel/entry_64.o: warning: objtool: .text+0x4: unannotated intra-function call
arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0xe64: unannotated intra-function call
arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0xee4: unannotated intra-function call
Fix these warnings by annotating intra-function
call, using ANNOTATE_INTRA_FUNCTION_CALL macro,
to indicate that the branch targets are valid.
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
arch/powerpc/kernel/entry_64.S | 2 ++
arch/powerpc/kvm/book3s_hv_rmhandlers.S | 3 +++
2 files changed, 5 insertions(+)
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index 01ace4c56104..fb444bc64f3f 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -14,6 +14,7 @@
* code, and exception/interrupt return code for PowerPC.
*/
+#include <linux/objtool.h>
#include <linux/errno.h>
#include <linux/err.h>
#include <asm/cache.h>
@@ -73,6 +74,7 @@ flush_branch_caches:
// Flush the link stack
.rept 64
+ ANNOTATE_INTRA_FUNCTION_CALL
bl .+4
.endr
b 1f
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
index de91118df0c5..ea39a0cf591a 100644
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
@@ -30,6 +30,7 @@
#include <asm/feature-fixups.h>
#include <asm/cpuidle.h>
#include <linux/linkage.h>
+#include <linux/objtool.h>
/* Values in HSTATE_NAPPING(r13) */
#define NAPPING_CEDE 1
@@ -1523,12 +1524,14 @@ kvm_flush_link_stack:
/* Flush the link stack. On Power8 it's up to 32 entries in size. */
.rept 32
+ ANNOTATE_INTRA_FUNCTION_CALL
bl .+4
.endr
/* And on Power9 it's up to 64. */
BEGIN_FTR_SECTION
.rept 32
+ ANNOTATE_INTRA_FUNCTION_CALL
bl .+4
.endr
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 05/16] powerpc: Skip objtool from running on drivers/crypto/vmx/aesp8-ppc.o
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (3 preceding siblings ...)
2022-08-08 11:48 ` [PATCH 04/16] powerpc: curb " Sathvika Vasireddy
@ 2022-08-08 11:48 ` Sathvika Vasireddy
2022-08-10 8:34 ` Christophe Leroy
2022-08-08 11:48 ` [PATCH 06/16] powerpc: Fix objtool unannotated intra-function call warnings on PPC32 Sathvika Vasireddy
` (10 subsequent siblings)
15 siblings, 1 reply; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:48 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
With objtool enabled, below warnings are seen when trying to build:
drivers/crypto/vmx/aesp8-ppc.o: warning: objtool: aes_p8_set_encrypt_key+0x44: unannotated intra-function call
drivers/crypto/vmx/aesp8-ppc.o: warning: objtool: .text+0x2448: unannotated intra-function call
drivers/crypto/vmx/aesp8-ppc.o: warning: objtool: .text+0x2d68: unannotated intra-function call
Skip objtool from running on this file, as
there are no calls to _mcount.
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
drivers/crypto/vmx/Makefile | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/crypto/vmx/Makefile b/drivers/crypto/vmx/Makefile
index 2560cfea1dec..7b41f0da6807 100644
--- a/drivers/crypto/vmx/Makefile
+++ b/drivers/crypto/vmx/Makefile
@@ -9,3 +9,5 @@ targets += aesp8-ppc.S ghashp8-ppc.S
$(obj)/aesp8-ppc.S $(obj)/ghashp8-ppc.S: $(obj)/%.S: $(src)/%.pl FORCE
$(call if_changed,perl)
+
+OBJECT_FILES_NON_STANDARD_aesp8-ppc.o := y
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 06/16] powerpc: Fix objtool unannotated intra-function call warnings on PPC32
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (4 preceding siblings ...)
2022-08-08 11:48 ` [PATCH 05/16] powerpc: Skip objtool from running on drivers/crypto/vmx/aesp8-ppc.o Sathvika Vasireddy
@ 2022-08-08 11:48 ` Sathvika Vasireddy
2022-08-09 23:31 ` kernel test robot
2022-08-08 11:48 ` [PATCH 07/16] powerpc: Skip objtool from running on VDSO files Sathvika Vasireddy
` (9 subsequent siblings)
15 siblings, 1 reply; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:48 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
From: Christophe Leroy <christophe.leroy@csgroup.eu>
Fix several annotations in assembly files on PPC32.
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
[Sathvika Vasireddy: Changed subject line from objtool/powerpc: Activate objtool on PPC32
to powerpc: Fix objtool unannotated intra-function call warnings on PPC32, and removed
Kconfig change to enable objtool, as it is part of objtool/powerpc: Enable objtool to be built on ppc patch in this series.]
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
arch/powerpc/kernel/cpu_setup_6xx.S | 26 ++++++++++++------
arch/powerpc/kernel/cpu_setup_fsl_booke.S | 8 ++++--
arch/powerpc/kernel/entry_32.S | 8 ++++--
arch/powerpc/kernel/head_40x.S | 5 +++-
arch/powerpc/kernel/head_8xx.S | 5 +++-
arch/powerpc/kernel/head_book3s_32.S | 29 ++++++++++++++------
arch/powerpc/kernel/head_fsl_booke.S | 5 +++-
arch/powerpc/kernel/swsusp_32.S | 5 +++-
arch/powerpc/kvm/fpu.S | 17 ++++++++----
arch/powerpc/platforms/52xx/lite5200_sleep.S | 15 +++++++---
10 files changed, 89 insertions(+), 34 deletions(-)
diff --git a/arch/powerpc/kernel/cpu_setup_6xx.S b/arch/powerpc/kernel/cpu_setup_6xx.S
index f8b5ff64b604..f29ce3dd6140 100644
--- a/arch/powerpc/kernel/cpu_setup_6xx.S
+++ b/arch/powerpc/kernel/cpu_setup_6xx.S
@@ -4,6 +4,8 @@
* Copyright (C) 2003 Benjamin Herrenschmidt (benh@kernel.crashing.org)
*/
+#include <linux/linkage.h>
+
#include <asm/processor.h>
#include <asm/page.h>
#include <asm/cputable.h>
@@ -81,7 +83,7 @@ _GLOBAL(__setup_cpu_745x)
blr
/* Enable caches for 603's, 604, 750 & 7400 */
-setup_common_caches:
+SYM_FUNC_START_LOCAL(setup_common_caches)
mfspr r11,SPRN_HID0
andi. r0,r11,HID0_DCE
ori r11,r11,HID0_ICE|HID0_DCE
@@ -95,11 +97,12 @@ setup_common_caches:
sync
isync
blr
+SYM_FUNC_END(setup_common_caches)
/* 604, 604e, 604ev, ...
* Enable superscalar execution & branch history table
*/
-setup_604_hid0:
+SYM_FUNC_START_LOCAL(setup_604_hid0)
mfspr r11,SPRN_HID0
ori r11,r11,HID0_SIED|HID0_BHTE
ori r8,r11,HID0_BTCD
@@ -110,6 +113,7 @@ setup_604_hid0:
sync
isync
blr
+SYM_FUNC_END(setup_604_hid0)
/* 7400 <= rev 2.7 and 7410 rev = 1.0 suffer from some
* erratas we work around here.
@@ -125,13 +129,14 @@ setup_604_hid0:
* needed once we have applied workaround #5 (though it's
* not set by Apple's firmware at least).
*/
-setup_7400_workarounds:
+SYM_FUNC_START_LOCAL(setup_7400_workarounds)
mfpvr r3
rlwinm r3,r3,0,20,31
cmpwi 0,r3,0x0207
ble 1f
blr
-setup_7410_workarounds:
+SYM_FUNC_END(setup_7400_workarounds)
+SYM_FUNC_START_LOCAL(setup_7410_workarounds)
mfpvr r3
rlwinm r3,r3,0,20,31
cmpwi 0,r3,0x0100
@@ -151,6 +156,7 @@ setup_7410_workarounds:
sync
isync
blr
+SYM_FUNC_END(setup_7410_workarounds)
/* 740/750/7400/7410
* Enable Store Gathering (SGE), Address Broadcast (ABE),
@@ -158,7 +164,7 @@ setup_7410_workarounds:
* Dynamic Power Management (DPM), Speculative (SPD)
* Clear Instruction cache throttling (ICTC)
*/
-setup_750_7400_hid0:
+SYM_FUNC_START_LOCAL(setup_750_7400_hid0)
mfspr r11,SPRN_HID0
ori r11,r11,HID0_SGE | HID0_ABE | HID0_BHTE | HID0_BTIC
oris r11,r11,HID0_DPM@h
@@ -177,12 +183,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_NO_DPM)
sync
isync
blr
+SYM_FUNC_END(setup_750_7400_hid0)
/* 750cx specific
* Looks like we have to disable NAP feature for some PLL settings...
* (waiting for confirmation)
*/
-setup_750cx:
+SYM_FUNC_START_LOCAL(setup_750cx)
mfspr r10, SPRN_HID1
rlwinm r10,r10,4,28,31
cmpwi cr0,r10,7
@@ -196,11 +203,13 @@ setup_750cx:
andc r6,r6,r7
stw r6,CPU_SPEC_FEATURES(r4)
blr
+SYM_FUNC_END(setup_750cx)
/* 750fx specific
*/
-setup_750fx:
+SYM_FUNC_START_LOCAL(setup_750fx)
blr
+SYM_FUNC_END(setup_750fx)
/* MPC 745x
* Enable Store Gathering (SGE), Branch Folding (FOLD)
@@ -212,7 +221,7 @@ setup_750fx:
* Clear Instruction cache throttling (ICTC)
* Enable L2 HW prefetch
*/
-setup_745x_specifics:
+SYM_FUNC_START_LOCAL(setup_745x_specifics)
/* We check for the presence of an L3 cache setup by
* the firmware. If any, we disable NAP capability as
* it's known to be bogus on rev 2.1 and earlier
@@ -270,6 +279,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_NO_DPM)
sync
isync
blr
+SYM_FUNC_END(setup_745x_specifics)
/*
* Initialize the FPU registers. This is needed to work around an errata
diff --git a/arch/powerpc/kernel/cpu_setup_fsl_booke.S b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
index 4bf33f1b4193..f573a4f3bbe6 100644
--- a/arch/powerpc/kernel/cpu_setup_fsl_booke.S
+++ b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
@@ -8,6 +8,8 @@
* Benjamin Herrenschmidt <benh@kernel.crashing.org>
*/
+#include <linux/linkage.h>
+
#include <asm/page.h>
#include <asm/processor.h>
#include <asm/cputable.h>
@@ -274,7 +276,7 @@ _GLOBAL(flush_dcache_L1)
blr
-has_L2_cache:
+SYM_FUNC_START_LOCAL(has_L2_cache)
/* skip L2 cache on P2040/P2040E as they have no L2 cache */
mfspr r3, SPRN_SVR
/* shift right by 8 bits and clear E bit of SVR */
@@ -290,9 +292,10 @@ has_L2_cache:
1:
li r3, 0
blr
+SYM_FUNC_END(has_L2_cache)
/* flush backside L2 cache */
-flush_backside_L2_cache:
+SYM_FUNC_START_LOCAL(flush_backside_L2_cache)
mflr r10
bl has_L2_cache
mtlr r10
@@ -313,6 +316,7 @@ flush_backside_L2_cache:
bne 1b
2:
blr
+SYM_FUNC_END(flush_backside_L2_cache)
_GLOBAL(cpu_down_flush_e500v2)
mflr r0
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index 1d599df6f169..f47b682d4667 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -18,6 +18,8 @@
#include <linux/err.h>
#include <linux/sys.h>
#include <linux/threads.h>
+#include <linux/linkage.h>
+
#include <asm/reg.h>
#include <asm/page.h>
#include <asm/mmu.h>
@@ -74,17 +76,19 @@ _ASM_NOKPROBE_SYMBOL(prepare_transfer_to_handler)
#endif /* CONFIG_PPC_BOOK3S_32 || CONFIG_E500 */
#if defined(CONFIG_PPC_KUEP) && defined(CONFIG_PPC_BOOK3S_32)
- .globl __kuep_lock
+SYM_FUNC_START(__kuep_lock)
__kuep_lock:
lwz r9, THREAD+THSR0(r2)
update_user_segments_by_4 r9, r10, r11, r12
blr
+SYM_FUNC_END(__kuep_lock)
-__kuep_unlock:
+SYM_FUNC_START_LOCAL(__kuep_unlock)
lwz r9, THREAD+THSR0(r2)
rlwinm r9,r9,0,~SR_NX
update_user_segments_by_4 r9, r10, r11, r12
blr
+SYM_FUNC_END(__kuep_unlock)
.macro kuep_lock
bl __kuep_lock
diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S
index 088f500896c7..9110fe9d6747 100644
--- a/arch/powerpc/kernel/head_40x.S
+++ b/arch/powerpc/kernel/head_40x.S
@@ -28,6 +28,8 @@
#include <linux/init.h>
#include <linux/pgtable.h>
#include <linux/sizes.h>
+#include <linux/linkage.h>
+
#include <asm/processor.h>
#include <asm/page.h>
#include <asm/mmu.h>
@@ -662,7 +664,7 @@ start_here:
* kernel initialization. This maps the first 32 MBytes of memory 1:1
* virtual to physical and more importantly sets the cache mode.
*/
-initial_mmu:
+SYM_FUNC_START_LOCAL(initial_mmu)
tlbia /* Invalidate all TLB entries */
isync
@@ -711,6 +713,7 @@ initial_mmu:
mtspr SPRN_EVPR,r0
blr
+SYM_FUNC_END(initial_mmu)
_GLOBAL(abort)
mfspr r13,SPRN_DBCR0
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
index 0b05f2be66b9..c94ed5a08c93 100644
--- a/arch/powerpc/kernel/head_8xx.S
+++ b/arch/powerpc/kernel/head_8xx.S
@@ -18,6 +18,8 @@
#include <linux/magic.h>
#include <linux/pgtable.h>
#include <linux/sizes.h>
+#include <linux/linkage.h>
+
#include <asm/processor.h>
#include <asm/page.h>
#include <asm/mmu.h>
@@ -625,7 +627,7 @@ start_here:
* 24 Mbytes of data, and the 512k IMMR space. Anything not covered by
* these mappings is mapped by page tables.
*/
-initial_mmu:
+SYM_FUNC_START_LOCAL(initial_mmu)
li r8, 0
mtspr SPRN_MI_CTR, r8 /* remove PINNED ITLB entries */
lis r10, MD_TWAM@h
@@ -686,6 +688,7 @@ initial_mmu:
#endif
mtspr SPRN_DER, r8
blr
+SYM_FUNC_END(initial_mmu)
_GLOBAL(mmu_pin_tlb)
lis r9, (1f - PAGE_OFFSET)@h
diff --git a/arch/powerpc/kernel/head_book3s_32.S b/arch/powerpc/kernel/head_book3s_32.S
index 519b60695167..4af12447dc0b 100644
--- a/arch/powerpc/kernel/head_book3s_32.S
+++ b/arch/powerpc/kernel/head_book3s_32.S
@@ -18,6 +18,8 @@
#include <linux/init.h>
#include <linux/pgtable.h>
+#include <linux/linkage.h>
+
#include <asm/reg.h>
#include <asm/page.h>
#include <asm/mmu.h>
@@ -877,7 +879,7 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_HPTE_TABLE)
* Load stuff into the MMU. Intended to be called with
* IR=0 and DR=0.
*/
-early_hash_table:
+SYM_FUNC_START_LOCAL(early_hash_table)
sync /* Force all PTE updates to finish */
isync
tlbia /* Clear all TLB entries */
@@ -888,8 +890,9 @@ early_hash_table:
ori r6, r6, 3 /* 256kB table */
mtspr SPRN_SDR1, r6
blr
+SYM_FUNC_END(early_hash_table)
-load_up_mmu:
+SYM_FUNC_START_LOCAL(load_up_mmu)
sync /* Force all PTE updates to finish */
isync
tlbia /* Clear all TLB entries */
@@ -918,6 +921,7 @@ BEGIN_MMU_FTR_SECTION
LOAD_BAT(7,r3,r4,r5)
END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS)
blr
+SYM_FUNC_END(load_up_mmu)
_GLOBAL(load_segment_registers)
li r0, NUM_USER_SEGMENTS /* load up user segment register values */
@@ -1028,7 +1032,7 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_HPTE_TABLE)
* this makes sure it's done.
* -- Cort
*/
-clear_bats:
+SYM_FUNC_START_LOCAL(clear_bats)
li r10,0
mtspr SPRN_DBAT0U,r10
@@ -1072,6 +1076,7 @@ BEGIN_MMU_FTR_SECTION
mtspr SPRN_IBAT7L,r10
END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS)
blr
+SYM_FUNC_END(clear_bats)
_GLOBAL(update_bats)
lis r4, 1f@h
@@ -1108,15 +1113,16 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS)
mtspr SPRN_SRR1, r6
rfi
-flush_tlbs:
+SYM_FUNC_START_LOCAL(flush_tlbs)
lis r10, 0x40
1: addic. r10, r10, -0x1000
tlbie r10
bgt 1b
sync
blr
+SYM_FUNC_END(flush_tlbs)
-mmu_off:
+SYM_FUNC_START_LOCAL(mmu_off)
addi r4, r3, __after_mmu_off - _start
mfmsr r3
andi. r0,r3,MSR_DR|MSR_IR /* MMU enabled? */
@@ -1128,9 +1134,10 @@ mmu_off:
mtspr SPRN_SRR1,r3
sync
rfi
+SYM_FUNC_END(mmu_off)
/* We use one BAT to map up to 256M of RAM at _PAGE_OFFSET */
-initial_bats:
+SYM_FUNC_START_LOCAL(initial_bats)
lis r11,PAGE_OFFSET@h
tophys(r8,r11)
#ifdef CONFIG_SMP
@@ -1146,9 +1153,10 @@ initial_bats:
mtspr SPRN_IBAT0U,r11
isync
blr
+SYM_FUNC_END(initial_bats)
#ifdef CONFIG_BOOTX_TEXT
-setup_disp_bat:
+SYM_FUNC_START_LOCAL(setup_disp_bat)
/*
* setup the display bat prepared for us in prom.c
*/
@@ -1164,10 +1172,11 @@ setup_disp_bat:
mtspr SPRN_DBAT3L,r8
mtspr SPRN_DBAT3U,r11
blr
+SYM_FUNC_END(setup_disp_bat)
#endif /* CONFIG_BOOTX_TEXT */
#ifdef CONFIG_PPC_EARLY_DEBUG_CPM
-setup_cpm_bat:
+SYM_FUNC_START_LOCAL(setup_cpm_bat)
lis r8, 0xf000
ori r8, r8, 0x002a
mtspr SPRN_DBAT1L, r8
@@ -1177,10 +1186,11 @@ setup_cpm_bat:
mtspr SPRN_DBAT1U, r11
blr
+SYM_FUNC_END(setup_cpm_bat)
#endif
#ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
-setup_usbgecko_bat:
+SYM_FUNC_START_LOCAL(setup_usbgecko_bat)
/* prepare a BAT for early io */
#if defined(CONFIG_GAMECUBE)
lis r8, 0x0c00
@@ -1199,6 +1209,7 @@ setup_usbgecko_bat:
mtspr SPRN_DBAT1L, r8
mtspr SPRN_DBAT1U, r11
blr
+SYM_FUNC_END(setup_usbgecko_bat)
#endif
.data
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
index f0db4f52bc00..744b096857a1 100644
--- a/arch/powerpc/kernel/head_fsl_booke.S
+++ b/arch/powerpc/kernel/head_fsl_booke.S
@@ -29,6 +29,8 @@
#include <linux/init.h>
#include <linux/threads.h>
#include <linux/pgtable.h>
+#include <linux/linkage.h>
+
#include <asm/processor.h>
#include <asm/page.h>
#include <asm/mmu.h>
@@ -885,7 +887,7 @@ KernelSPE:
* Translate the effec addr in r3 to phys addr. The phys addr will be put
* into r3(higher 32bit) and r4(lower 32bit)
*/
-get_phys_addr:
+SYM_FUNC_START_LOCAL(get_phys_addr)
mfmsr r8
mfspr r9,SPRN_PID
rlwinm r9,r9,16,0x3fff0000 /* turn PID into MAS6[SPID] */
@@ -907,6 +909,7 @@ get_phys_addr:
mfspr r3,SPRN_MAS7
#endif
blr
+SYM_FUNC_END(get_phys_addr)
/*
* Global functions
diff --git a/arch/powerpc/kernel/swsusp_32.S b/arch/powerpc/kernel/swsusp_32.S
index e0cbd63007f2..ffb79326483c 100644
--- a/arch/powerpc/kernel/swsusp_32.S
+++ b/arch/powerpc/kernel/swsusp_32.S
@@ -1,5 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0 */
#include <linux/threads.h>
+#include <linux/linkage.h>
+
#include <asm/processor.h>
#include <asm/page.h>
#include <asm/cputable.h>
@@ -400,7 +402,7 @@ _ASM_NOKPROBE_SYMBOL(swsusp_arch_resume)
/* FIXME:This construct is actually not useful since we don't shut
* down the instruction MMU, we could just flip back MSR-DR on.
*/
-turn_on_mmu:
+SYM_FUNC_START_LOCAL(turn_on_mmu)
mflr r4
mtsrr0 r4
mtsrr1 r3
@@ -408,4 +410,5 @@ turn_on_mmu:
isync
rfi
_ASM_NOKPROBE_SYMBOL(turn_on_mmu)
+SYM_FUNC_END(turn_on_mmu)
diff --git a/arch/powerpc/kvm/fpu.S b/arch/powerpc/kvm/fpu.S
index 315c94946bad..b68e7f26a81f 100644
--- a/arch/powerpc/kvm/fpu.S
+++ b/arch/powerpc/kvm/fpu.S
@@ -6,6 +6,8 @@
*/
#include <linux/pgtable.h>
+#include <linux/linkage.h>
+
#include <asm/reg.h>
#include <asm/page.h>
#include <asm/mmu.h>
@@ -110,18 +112,22 @@ FPS_THREE_IN(fsel)
* R8 = (double*)¶m3 [load_three]
* LR = instruction call function
*/
-fpd_load_three:
+SYM_FUNC_START_LOCAL(fpd_load_three)
lfd 2,0(r8) /* load param3 */
-fpd_load_two:
+SYM_FUNC_START_LOCAL(fpd_load_two)
lfd 1,0(r7) /* load param2 */
-fpd_load_one:
+SYM_FUNC_START_LOCAL(fpd_load_one)
lfd 0,0(r6) /* load param1 */
-fpd_load_none:
+SYM_FUNC_START_LOCAL(fpd_load_none)
lfd 3,0(r3) /* load up fpscr value */
MTFSF_L(3)
lwz r6, 0(r4) /* load cr */
mtcr r6
blr
+SYM_FUNC_END(fpd_load_none)
+SYM_FUNC_END(fpd_load_one)
+SYM_FUNC_END(fpd_load_two)
+SYM_FUNC_END(fpd_load_three)
/*
* End of double instruction processing
@@ -131,13 +137,14 @@ fpd_load_none:
* R5 = (double*)&result
* LR = caller of instruction call function
*/
-fpd_return:
+SYM_FUNC_START_LOCAL(fpd_return)
mfcr r6
stfd 0,0(r5) /* save result */
mffs 0
stfd 0,0(r3) /* save new fpscr value */
stw r6,0(r4) /* save new cr value */
blr
+SYM_FUNC_END(fpd_return)
/*
* Double operation with no input operand
diff --git a/arch/powerpc/platforms/52xx/lite5200_sleep.S b/arch/powerpc/platforms/52xx/lite5200_sleep.S
index afee8b1515a8..0b12647e7b42 100644
--- a/arch/powerpc/platforms/52xx/lite5200_sleep.S
+++ b/arch/powerpc/platforms/52xx/lite5200_sleep.S
@@ -1,4 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0 */
+#include <linux/linkage.h>
+
#include <asm/reg.h>
#include <asm/ppc_asm.h>
#include <asm/processor.h>
@@ -178,7 +180,8 @@ sram_code:
/* local udelay in sram is needed */
- udelay: /* r11 - tb_ticks_per_usec, r12 - usecs, overwrites r13 */
+SYM_FUNC_START_LOCAL(udelay)
+ /* r11 - tb_ticks_per_usec, r12 - usecs, overwrites r13 */
mullw r12, r12, r11
mftb r13 /* start */
add r12, r13, r12 /* end */
@@ -187,6 +190,7 @@ sram_code:
cmp cr0, r13, r12
blt 1b
blr
+SYM_FUNC_END(udelay)
sram_code_end:
@@ -271,7 +275,7 @@ _ASM_NOKPROBE_SYMBOL(lite5200_wakeup)
SAVE_SR(n+2, addr+2); \
SAVE_SR(n+3, addr+3);
-save_regs:
+SYM_FUNC_START_LOCAL(save_regs)
stw r0, 0(r4)
stw r1, 0x4(r4)
stw r2, 0x8(r4)
@@ -317,6 +321,7 @@ save_regs:
SAVE_SPRN(TBRU, 0x5b)
blr
+SYM_FUNC_END(save_regs)
/* restore registers */
@@ -336,7 +341,7 @@ save_regs:
LOAD_SR(n+2, addr+2); \
LOAD_SR(n+3, addr+3);
-restore_regs:
+SYM_FUNC_START_LOCAL(restore_regs)
lis r4, registers@h
ori r4, r4, registers@l
@@ -393,6 +398,7 @@ restore_regs:
blr
_ASM_NOKPROBE_SYMBOL(restore_regs)
+SYM_FUNC_END(restore_regs)
@@ -403,7 +409,7 @@ _ASM_NOKPROBE_SYMBOL(restore_regs)
* Flush data cache
* Do this by just reading lots of stuff into the cache.
*/
-flush_data_cache:
+SYM_FUNC_START_LOCAL(flush_data_cache)
lis r3,CONFIG_KERNEL_START@h
ori r3,r3,CONFIG_KERNEL_START@l
li r4,NUM_CACHE_LINES
@@ -413,3 +419,4 @@ flush_data_cache:
addi r3,r3,L1_CACHE_BYTES /* Next line, please */
bdnz 1b
blr
+SYM_FUNC_END(flush_data_cache)
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 07/16] powerpc: Skip objtool from running on VDSO files
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (5 preceding siblings ...)
2022-08-08 11:48 ` [PATCH 06/16] powerpc: Fix objtool unannotated intra-function call warnings on PPC32 Sathvika Vasireddy
@ 2022-08-08 11:48 ` Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 08/16] objtool: Fix SEGFAULT Sathvika Vasireddy
` (8 subsequent siblings)
15 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:48 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
Do not run objtool on VDSO files, by using
OBJECT_FILES_NON_STANDARD
Suggested-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
arch/powerpc/kernel/vdso/Makefile | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/powerpc/kernel/vdso/Makefile b/arch/powerpc/kernel/vdso/Makefile
index 096b0bf1335f..a49a0d6a1c53 100644
--- a/arch/powerpc/kernel/vdso/Makefile
+++ b/arch/powerpc/kernel/vdso/Makefile
@@ -102,3 +102,5 @@ quiet_cmd_vdso64ld_and_check = VDSO64L $@
cmd_vdso64ld_and_check = $(VDSOCC) $(c_flags) $(CC64FLAGS) -o $@ -Wl,-T$(filter %.lds,$^) $(filter %.o,$^) ; $(cmd_vdso_check)
quiet_cmd_vdso64as = VDSO64A $@
cmd_vdso64as = $(VDSOCC) $(a_flags) $(CC64FLAGS) $(AS64FLAGS) -c -o $@ $<
+
+OBJECT_FILES_NON_STANDARD := y
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 08/16] objtool: Fix SEGFAULT
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (6 preceding siblings ...)
2022-08-08 11:48 ` [PATCH 07/16] powerpc: Skip objtool from running on VDSO files Sathvika Vasireddy
@ 2022-08-08 11:49 ` Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 09/16] objtool: Use target file endianness instead of a compiled constant Sathvika Vasireddy
` (7 subsequent siblings)
15 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:49 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
From: Christophe Leroy <christophe.leroy@csgroup.eu>
find_insn() will return NULL in case of failure. Check insn in order
to avoid a kernel Oops for NULL pointer dereference.
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
tools/objtool/check.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 0cec74da7ffe..0ef805843d4f 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -205,7 +205,7 @@ static bool __dead_end_function(struct objtool_file *file, struct symbol *func,
return false;
insn = find_insn(file, func->sec, func->offset);
- if (!insn->func)
+ if (!insn || !insn->func)
return false;
func_for_each_insn(file, func, insn) {
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 09/16] objtool: Use target file endianness instead of a compiled constant
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (7 preceding siblings ...)
2022-08-08 11:49 ` [PATCH 08/16] objtool: Fix SEGFAULT Sathvika Vasireddy
@ 2022-08-08 11:49 ` Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 10/16] objtool: Use target file class size " Sathvika Vasireddy
` (6 subsequent siblings)
15 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:49 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
From: Christophe Leroy <christophe.leroy@csgroup.eu>
Some architectures like powerpc support both endianness, it's
therefore not possible to fix the endianness via arch/endianness.h
because there is no easy way to get the target endianness at
build time.
Use the endianness recorded in the file objtool is working on.
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
.../arch/x86/include/arch/endianness.h | 9 ------
tools/objtool/check.c | 2 +-
tools/objtool/include/objtool/endianness.h | 32 +++++++++----------
tools/objtool/orc_dump.c | 11 +++++--
tools/objtool/orc_gen.c | 4 +--
tools/objtool/special.c | 3 +-
6 files changed, 30 insertions(+), 31 deletions(-)
delete mode 100644 tools/objtool/arch/x86/include/arch/endianness.h
diff --git a/tools/objtool/arch/x86/include/arch/endianness.h b/tools/objtool/arch/x86/include/arch/endianness.h
deleted file mode 100644
index 7c362527da20..000000000000
--- a/tools/objtool/arch/x86/include/arch/endianness.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-#ifndef _ARCH_ENDIANNESS_H
-#define _ARCH_ENDIANNESS_H
-
-#include <endian.h>
-
-#define __TARGET_BYTE_ORDER __LITTLE_ENDIAN
-
-#endif /* _ARCH_ENDIANNESS_H */
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 0ef805843d4f..45fbc80ea7f9 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -2075,7 +2075,7 @@ static int read_unwind_hints(struct objtool_file *file)
return -1;
}
- cfi.cfa.offset = bswap_if_needed(hint->sp_offset);
+ cfi.cfa.offset = bswap_if_needed(file->elf, hint->sp_offset);
cfi.type = hint->type;
cfi.end = hint->end;
diff --git a/tools/objtool/include/objtool/endianness.h b/tools/objtool/include/objtool/endianness.h
index 10241341eff3..4d2aa9b0fe2f 100644
--- a/tools/objtool/include/objtool/endianness.h
+++ b/tools/objtool/include/objtool/endianness.h
@@ -2,33 +2,33 @@
#ifndef _OBJTOOL_ENDIANNESS_H
#define _OBJTOOL_ENDIANNESS_H
-#include <arch/endianness.h>
#include <linux/kernel.h>
#include <endian.h>
-
-#ifndef __TARGET_BYTE_ORDER
-#error undefined arch __TARGET_BYTE_ORDER
-#endif
-
-#if __BYTE_ORDER != __TARGET_BYTE_ORDER
-#define __NEED_BSWAP 1
-#else
-#define __NEED_BSWAP 0
-#endif
+#include <objtool/elf.h>
/*
- * Does a byte swap if target endianness doesn't match the host, i.e. cross
+ * Does a byte swap if target file endianness doesn't match the host, i.e. cross
* compilation for little endian on big endian and vice versa.
* To be used for multi-byte values conversion, which are read from / about
* to be written to a target native endianness ELF file.
*/
-#define bswap_if_needed(val) \
+static inline bool need_bswap(struct elf *elf)
+{
+ return (__BYTE_ORDER == __LITTLE_ENDIAN) ^
+ (elf->ehdr.e_ident[EI_DATA] == ELFDATA2LSB);
+}
+
+#define bswap_if_needed(elf, val) \
({ \
__typeof__(val) __ret; \
+ bool __need_bswap = need_bswap(elf); \
switch (sizeof(val)) { \
- case 8: __ret = __NEED_BSWAP ? bswap_64(val) : (val); break; \
- case 4: __ret = __NEED_BSWAP ? bswap_32(val) : (val); break; \
- case 2: __ret = __NEED_BSWAP ? bswap_16(val) : (val); break; \
+ case 8: \
+ __ret = __need_bswap ? bswap_64(val) : (val); break; \
+ case 4: \
+ __ret = __need_bswap ? bswap_32(val) : (val); break; \
+ case 2: \
+ __ret = __need_bswap ? bswap_16(val) : (val); break; \
default: \
BUILD_BUG(); break; \
} \
diff --git a/tools/objtool/orc_dump.c b/tools/objtool/orc_dump.c
index f5a8508c42d6..4f1211fec82c 100644
--- a/tools/objtool/orc_dump.c
+++ b/tools/objtool/orc_dump.c
@@ -76,6 +76,7 @@ int orc_dump(const char *_objname)
GElf_Rela rela;
GElf_Sym sym;
Elf_Data *data, *symtab = NULL, *rela_orc_ip = NULL;
+ struct elf dummy_elf = {};
objname = _objname;
@@ -94,6 +95,12 @@ int orc_dump(const char *_objname)
return -1;
}
+ if (!elf64_getehdr(elf)) {
+ WARN_ELF("elf64_getehdr");
+ return -1;
+ }
+ memcpy(&dummy_elf.ehdr, elf64_getehdr(elf), sizeof(dummy_elf.ehdr));
+
if (elf_getshdrnum(elf, &nr_sections)) {
WARN_ELF("elf_getshdrnum");
return -1;
@@ -198,11 +205,11 @@ int orc_dump(const char *_objname)
printf(" sp:");
- print_reg(orc[i].sp_reg, bswap_if_needed(orc[i].sp_offset));
+ print_reg(orc[i].sp_reg, bswap_if_needed(&dummy_elf, orc[i].sp_offset));
printf(" bp:");
- print_reg(orc[i].bp_reg, bswap_if_needed(orc[i].bp_offset));
+ print_reg(orc[i].bp_reg, bswap_if_needed(&dummy_elf, orc[i].bp_offset));
printf(" type:%s end:%d\n",
orc_type_name(orc[i].type), orc[i].end);
diff --git a/tools/objtool/orc_gen.c b/tools/objtool/orc_gen.c
index dd3c64af9db2..1f22b7ebae58 100644
--- a/tools/objtool/orc_gen.c
+++ b/tools/objtool/orc_gen.c
@@ -97,8 +97,8 @@ static int write_orc_entry(struct elf *elf, struct section *orc_sec,
/* populate ORC data */
orc = (struct orc_entry *)orc_sec->data->d_buf + idx;
memcpy(orc, o, sizeof(*orc));
- orc->sp_offset = bswap_if_needed(orc->sp_offset);
- orc->bp_offset = bswap_if_needed(orc->bp_offset);
+ orc->sp_offset = bswap_if_needed(elf, orc->sp_offset);
+ orc->bp_offset = bswap_if_needed(elf, orc->bp_offset);
/* populate reloc for ip */
if (elf_add_reloc_to_insn(elf, ip_sec, idx * sizeof(int), R_X86_64_PC32,
diff --git a/tools/objtool/special.c b/tools/objtool/special.c
index e2223dd91c37..9c8d827f69af 100644
--- a/tools/objtool/special.c
+++ b/tools/objtool/special.c
@@ -87,7 +87,8 @@ static int get_alt_entry(struct elf *elf, struct special_entry *entry,
if (entry->feature) {
unsigned short feature;
- feature = bswap_if_needed(*(unsigned short *)(sec->data->d_buf +
+ feature = bswap_if_needed(elf,
+ *(unsigned short *)(sec->data->d_buf +
offset +
entry->feature));
arch_handle_alternative(feature, alt);
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 10/16] objtool: Use target file class size instead of a compiled constant
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (8 preceding siblings ...)
2022-08-08 11:49 ` [PATCH 09/16] objtool: Use target file endianness instead of a compiled constant Sathvika Vasireddy
@ 2022-08-08 11:49 ` Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 11/16] objtool: Add --mnop as an option to --mcount Sathvika Vasireddy
` (5 subsequent siblings)
15 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:49 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
From: Christophe Leroy <christophe.leroy@csgroup.eu>
In order to allow using objtool on cross-built kernels,
determine size of long from elf data instead of using
sizeof(long) at build time.
For the time being this covers only mcount.
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
tools/objtool/check.c | 16 +++++++++-------
tools/objtool/elf.c | 8 ++++++--
tools/objtool/include/objtool/elf.h | 8 ++++++++
3 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 45fbc80ea7f9..503a7961b9be 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -851,9 +851,9 @@ static int create_ibt_endbr_seal_sections(struct objtool_file *file)
static int create_mcount_loc_sections(struct objtool_file *file)
{
struct section *sec;
- unsigned long *loc;
struct instruction *insn;
int idx;
+ int addrsize = elf_class_addrsize(file->elf);
sec = find_section_by_name(file->elf, "__mcount_loc");
if (sec) {
@@ -869,23 +869,25 @@ static int create_mcount_loc_sections(struct objtool_file *file)
list_for_each_entry(insn, &file->mcount_loc_list, call_node)
idx++;
- sec = elf_create_section(file->elf, "__mcount_loc", 0, sizeof(unsigned long), idx);
+ sec = elf_create_section(file->elf, "__mcount_loc", 0, addrsize, idx);
if (!sec)
return -1;
+ sec->sh.sh_addralign = addrsize;
+
idx = 0;
list_for_each_entry(insn, &file->mcount_loc_list, call_node) {
+ void *loc;
- loc = (unsigned long *)sec->data->d_buf + idx;
- memset(loc, 0, sizeof(unsigned long));
+ loc = sec->data->d_buf + idx;
+ memset(loc, 0, addrsize);
- if (elf_add_reloc_to_insn(file->elf, sec,
- idx * sizeof(unsigned long),
+ if (elf_add_reloc_to_insn(file->elf, sec, idx,
R_X86_64_64,
insn->sec, insn->offset))
return -1;
- idx++;
+ idx += addrsize;
}
return 0;
diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
index c25e957c1e52..40c6d53b081f 100644
--- a/tools/objtool/elf.c
+++ b/tools/objtool/elf.c
@@ -1124,6 +1124,7 @@ static struct section *elf_create_rela_reloc_section(struct elf *elf, struct sec
{
char *relocname;
struct section *sec;
+ int addrsize = elf_class_addrsize(elf);
relocname = malloc(strlen(base->name) + strlen(".rela") + 1);
if (!relocname) {
@@ -1133,7 +1134,10 @@ static struct section *elf_create_rela_reloc_section(struct elf *elf, struct sec
strcpy(relocname, ".rela");
strcat(relocname, base->name);
- sec = elf_create_section(elf, relocname, 0, sizeof(GElf_Rela), 0);
+ if (addrsize == sizeof(u32))
+ sec = elf_create_section(elf, relocname, 0, sizeof(Elf32_Rela), 0);
+ else
+ sec = elf_create_section(elf, relocname, 0, sizeof(GElf_Rela), 0);
free(relocname);
if (!sec)
return NULL;
@@ -1142,7 +1146,7 @@ static struct section *elf_create_rela_reloc_section(struct elf *elf, struct sec
sec->base = base;
sec->sh.sh_type = SHT_RELA;
- sec->sh.sh_addralign = 8;
+ sec->sh.sh_addralign = addrsize;
sec->sh.sh_link = find_section_by_name(elf, ".symtab")->idx;
sec->sh.sh_info = base->idx;
sec->sh.sh_flags = SHF_INFO_LINK;
diff --git a/tools/objtool/include/objtool/elf.h b/tools/objtool/include/objtool/elf.h
index 16f4067b82ae..78b3aa2e546d 100644
--- a/tools/objtool/include/objtool/elf.h
+++ b/tools/objtool/include/objtool/elf.h
@@ -142,6 +142,14 @@ static inline bool has_multiple_files(struct elf *elf)
return elf->num_files > 1;
}
+static inline int elf_class_addrsize(struct elf *elf)
+{
+ if (elf->ehdr.e_ident[EI_CLASS] == ELFCLASS32)
+ return sizeof(u32);
+ else
+ return sizeof(u64);
+}
+
struct elf *elf_open_read(const char *name, int flags);
struct section *elf_create_section(struct elf *elf, const char *name, unsigned int sh_flags, size_t entsize, int nr);
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 11/16] objtool: Add --mnop as an option to --mcount
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (9 preceding siblings ...)
2022-08-08 11:49 ` [PATCH 10/16] objtool: Use target file class size " Sathvika Vasireddy
@ 2022-08-08 11:49 ` Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 12/16] objtool: Read special sections with alts only when specific options are selected Sathvika Vasireddy
` (4 subsequent siblings)
15 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:49 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
Architectures can select HAVE_NOP_MCOUNT if they choose
to nop out mcount call sites. If that config option is
selected, then --mnop is passed as an option to objtool,
along with --mcount.
Also, make sure that --mnop can be passed as an option
to objtool only when --mcount is passed.
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
Makefile | 4 +++-
arch/x86/Kconfig | 1 +
scripts/Makefile.lib | 1 +
tools/objtool/builtin-check.c | 14 ++++++++++++++
tools/objtool/check.c | 19 ++++++++++---------
tools/objtool/include/objtool/builtin.h | 1 +
6 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/Makefile b/Makefile
index dc6295f91263..c8f19c4bbc87 100644
--- a/Makefile
+++ b/Makefile
@@ -856,7 +856,9 @@ ifdef CONFIG_FTRACE_MCOUNT_USE_CC
endif
endif
ifdef CONFIG_FTRACE_MCOUNT_USE_OBJTOOL
- CC_FLAGS_USING += -DCC_USING_NOP_MCOUNT
+ ifdef CONFIG_HAVE_NOP_MCOUNT
+ CC_FLAGS_USING += -DCC_USING_NOP_MCOUNT
+ endif
endif
ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
ifdef CONFIG_HAVE_C_RECORDMCOUNT
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index f9920f1341c8..a8dd138df637 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -189,6 +189,7 @@ config X86
select HAVE_CONTEXT_TRACKING_USER_OFFSTACK if HAVE_CONTEXT_TRACKING_USER
select HAVE_C_RECORDMCOUNT
select HAVE_OBJTOOL_MCOUNT if HAVE_OBJTOOL
+ select HAVE_NOP_MCOUNT if HAVE_OBJTOOL_MCOUNT
select HAVE_BUILDTIME_MCOUNT_SORT
select HAVE_DEBUG_KMEMLEAK
select HAVE_DMA_CONTIGUOUS
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 3fb6a99e78c4..0610078e057a 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -234,6 +234,7 @@ objtool_args = \
$(if $(CONFIG_HAVE_NOINSTR_HACK), --hacks=noinstr) \
$(if $(CONFIG_X86_KERNEL_IBT), --ibt) \
$(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \
+ $(if $(CONFIG_HAVE_NOP_MCOUNT), --mnop) \
$(if $(CONFIG_UNWINDER_ORC), --orc) \
$(if $(CONFIG_RETPOLINE), --retpoline) \
$(if $(CONFIG_RETHUNK), --rethunk) \
diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c
index 24fbe803a0d3..9bd347d3c244 100644
--- a/tools/objtool/builtin-check.c
+++ b/tools/objtool/builtin-check.c
@@ -82,6 +82,7 @@ const struct option check_options[] = {
OPT_BOOLEAN(0, "dry-run", &opts.dryrun, "don't write modifications"),
OPT_BOOLEAN(0, "link", &opts.link, "object is a linked object"),
OPT_BOOLEAN(0, "module", &opts.module, "object is part of a kernel module"),
+ OPT_BOOLEAN(0, "mnop", &opts.mnop, "nop out mcount call sites"),
OPT_BOOLEAN(0, "no-unreachable", &opts.no_unreachable, "skip 'unreachable instruction' warnings"),
OPT_BOOLEAN(0, "sec-address", &opts.sec_address, "print section addresses in warnings"),
OPT_BOOLEAN(0, "stats", &opts.stats, "print statistics"),
@@ -150,6 +151,16 @@ static bool opts_valid(void)
return false;
}
+static bool mnop_opts_valid(void)
+{
+ if (opts.mnop && !opts.mcount) {
+ ERROR("--mnop requires --mcount");
+ return false;
+ }
+
+ return true;
+}
+
static bool link_opts_valid(struct objtool_file *file)
{
if (opts.link)
@@ -198,6 +209,9 @@ int objtool_run(int argc, const char **argv)
if (!file)
return 1;
+ if (!mnop_opts_valid())
+ return 1;
+
if (!link_opts_valid(file))
return 1;
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 503a7961b9be..1216a0fceaba 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -1231,17 +1231,18 @@ static void annotate_call_site(struct objtool_file *file,
if (opts.mcount && sym->fentry) {
if (sibling)
WARN_FUNC("Tail call to __fentry__ !?!?", insn->sec, insn->offset);
+ if (opts.mnop) {
+ if (reloc) {
+ reloc->type = R_NONE;
+ elf_write_reloc(file->elf, reloc);
+ }
- if (reloc) {
- reloc->type = R_NONE;
- elf_write_reloc(file->elf, reloc);
- }
-
- elf_write_insn(file->elf, insn->sec,
- insn->offset, insn->len,
- arch_nop_insn(insn->len));
+ elf_write_insn(file->elf, insn->sec,
+ insn->offset, insn->len,
+ arch_nop_insn(insn->len));
- insn->type = INSN_NOP;
+ insn->type = INSN_NOP;
+ }
list_add_tail(&insn->call_node, &file->mcount_loc_list);
return;
diff --git a/tools/objtool/include/objtool/builtin.h b/tools/objtool/include/objtool/builtin.h
index 42a52f1a0add..0785707c5a92 100644
--- a/tools/objtool/include/objtool/builtin.h
+++ b/tools/objtool/include/objtool/builtin.h
@@ -31,6 +31,7 @@ struct opts {
bool backup;
bool dryrun;
bool link;
+ bool mnop;
bool module;
bool no_unreachable;
bool sec_address;
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 12/16] objtool: Read special sections with alts only when specific options are selected
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (10 preceding siblings ...)
2022-08-08 11:49 ` [PATCH 11/16] objtool: Add --mnop as an option to --mcount Sathvika Vasireddy
@ 2022-08-08 11:49 ` Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 13/16] objtool: Use macros to define arch specific reloc types Sathvika Vasireddy
` (3 subsequent siblings)
15 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:49 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
This patch reads special sections which have alternate
instructions, only when stackval or orc or uaccess or
noinstr options are passed to objtool.
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
tools/objtool/check.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 1216a0fceaba..36f367da4752 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -2370,9 +2370,11 @@ static int decode_sections(struct objtool_file *file)
* Must be before add_jump_destinations(), which depends on 'func'
* being set for alternatives, to enable proper sibling call detection.
*/
- ret = add_special_section_alts(file);
- if (ret)
- return ret;
+ if (opts.stackval || opts.orc || opts.uaccess || opts.noinstr) {
+ ret = add_special_section_alts(file);
+ if (ret)
+ return ret;
+ }
ret = add_jump_destinations(file);
if (ret)
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 13/16] objtool: Use macros to define arch specific reloc types
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (11 preceding siblings ...)
2022-08-08 11:49 ` [PATCH 12/16] objtool: Read special sections with alts only when specific options are selected Sathvika Vasireddy
@ 2022-08-08 11:49 ` Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 14/16] objtool: Add arch specific function arch_ftrace_match() Sathvika Vasireddy
` (2 subsequent siblings)
15 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:49 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
Make relocation types architecture specific.
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
tools/objtool/arch/x86/include/arch/elf.h | 2 ++
tools/objtool/check.c | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/objtool/arch/x86/include/arch/elf.h b/tools/objtool/arch/x86/include/arch/elf.h
index 69cc4264b28a..ac14987cf687 100644
--- a/tools/objtool/arch/x86/include/arch/elf.h
+++ b/tools/objtool/arch/x86/include/arch/elf.h
@@ -2,5 +2,7 @@
#define _OBJTOOL_ARCH_ELF
#define R_NONE R_X86_64_NONE
+#define R_ABS64 R_X86_64_64
+#define R_ABS32 R_X86_64_32
#endif /* _OBJTOOL_ARCH_ELF */
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 36f367da4752..2f1da8dbfce9 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -883,7 +883,7 @@ static int create_mcount_loc_sections(struct objtool_file *file)
memset(loc, 0, addrsize);
if (elf_add_reloc_to_insn(file->elf, sec, idx,
- R_X86_64_64,
+ addrsize == sizeof(u64) ? R_ABS64 : R_ABS32,
insn->sec, insn->offset))
return -1;
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 14/16] objtool: Add arch specific function arch_ftrace_match()
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (12 preceding siblings ...)
2022-08-08 11:49 ` [PATCH 13/16] objtool: Use macros to define arch specific reloc types Sathvika Vasireddy
@ 2022-08-08 11:49 ` Sathvika Vasireddy
2022-08-12 10:58 ` kernel test robot
2022-08-13 13:48 ` kernel test robot
2022-08-08 11:49 ` [PATCH 15/16] objtool/powerpc: Enable objtool to be built on ppc Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 16/16] objtool/powerpc: Add --mcount specific implementation Sathvika Vasireddy
15 siblings, 2 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:49 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
Add architecture specific function to look for
relocation records pointing to arch specific
symbols.
Suggested-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
tools/objtool/arch/x86/decode.c | 8 ++++++++
tools/objtool/check.c | 2 +-
tools/objtool/include/objtool/arch.h | 2 ++
3 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decode.c
index c260006106be..0e91eb1d6386 100644
--- a/tools/objtool/arch/x86/decode.c
+++ b/tools/objtool/arch/x86/decode.c
@@ -23,6 +23,14 @@
#include <objtool/builtin.h>
#include <arch/elf.h>
+bool arch_ftrace_match(char *name)
+{
+ if (!strcmp(func->name, "__fentry__"))
+ return true;
+
+ return false;
+}
+
static int is_x86_64(const struct elf *elf)
{
switch (elf->ehdr.e_machine) {
diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 2f1da8dbfce9..dda163c1e5a3 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -2294,7 +2294,7 @@ static int classify_symbols(struct objtool_file *file)
if (arch_is_rethunk(func))
func->return_thunk = true;
- if (!strcmp(func->name, "__fentry__"))
+ if (arch_ftrace_match(func->name))
func->fentry = true;
if (is_profiling_func(func->name))
diff --git a/tools/objtool/include/objtool/arch.h b/tools/objtool/include/objtool/arch.h
index beb2f3aa94ff..2ba4b9897285 100644
--- a/tools/objtool/include/objtool/arch.h
+++ b/tools/objtool/include/objtool/arch.h
@@ -69,6 +69,8 @@ struct stack_op {
struct instruction;
+bool arch_ftrace_match(char *name);
+
void arch_initial_func_cfi_state(struct cfi_init_state *state);
int arch_decode_instruction(struct objtool_file *file, const struct section *sec,
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 15/16] objtool/powerpc: Enable objtool to be built on ppc
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (13 preceding siblings ...)
2022-08-08 11:49 ` [PATCH 14/16] objtool: Add arch specific function arch_ftrace_match() Sathvika Vasireddy
@ 2022-08-08 11:49 ` Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 16/16] objtool/powerpc: Add --mcount specific implementation Sathvika Vasireddy
15 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:49 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
This patch adds [stub] implementations for required
functions, inorder to enable objtool build on powerpc.
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
[Christophe Leroy: powerpc: Add missing asm/asm.h for objtool]
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
---
arch/powerpc/Kconfig | 1 +
arch/powerpc/include/asm/asm.h | 7 ++
tools/objtool/arch/powerpc/Build | 2 +
tools/objtool/arch/powerpc/decode.c | 74 +++++++++++++++++++
.../arch/powerpc/include/arch/cfi_regs.h | 11 +++
tools/objtool/arch/powerpc/include/arch/elf.h | 8 ++
.../arch/powerpc/include/arch/special.h | 21 ++++++
tools/objtool/arch/powerpc/special.c | 19 +++++
8 files changed, 143 insertions(+)
create mode 100644 arch/powerpc/include/asm/asm.h
create mode 100644 tools/objtool/arch/powerpc/Build
create mode 100644 tools/objtool/arch/powerpc/decode.c
create mode 100644 tools/objtool/arch/powerpc/include/arch/cfi_regs.h
create mode 100644 tools/objtool/arch/powerpc/include/arch/elf.h
create mode 100644 tools/objtool/arch/powerpc/include/arch/special.h
create mode 100644 tools/objtool/arch/powerpc/special.c
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 4c466acdc70d..dc05cd23c233 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -237,6 +237,7 @@ config PPC
select HAVE_MOD_ARCH_SPECIFIC
select HAVE_NMI if PERF_EVENTS || (PPC64 && PPC_BOOK3S)
select HAVE_OPTPROBES
+ select HAVE_OBJTOOL if PPC32 || MPROFILE_KERNEL
select HAVE_PERF_EVENTS
select HAVE_PERF_EVENTS_NMI if PPC64
select HAVE_PERF_REGS
diff --git a/arch/powerpc/include/asm/asm.h b/arch/powerpc/include/asm/asm.h
new file mode 100644
index 000000000000..86f46b604e9a
--- /dev/null
+++ b/arch/powerpc/include/asm/asm.h
@@ -0,0 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _ASM_POWERPC_ASM_H
+#define _ASM_POWERPC_ASM_H
+
+#define _ASM_PTR " .long "
+
+#endif /* _ASM_POWERPC_ASM_H */
diff --git a/tools/objtool/arch/powerpc/Build b/tools/objtool/arch/powerpc/Build
new file mode 100644
index 000000000000..d24d5636a5b8
--- /dev/null
+++ b/tools/objtool/arch/powerpc/Build
@@ -0,0 +1,2 @@
+objtool-y += decode.o
+objtool-y += special.o
diff --git a/tools/objtool/arch/powerpc/decode.c b/tools/objtool/arch/powerpc/decode.c
new file mode 100644
index 000000000000..8b6a14680da7
--- /dev/null
+++ b/tools/objtool/arch/powerpc/decode.c
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <objtool/check.h>
+#include <objtool/elf.h>
+#include <objtool/arch.h>
+#include <objtool/warn.h>
+#include <objtool/builtin.h>
+#include <objtool/endianness.h>
+
+unsigned long arch_dest_reloc_offset(int addend)
+{
+ return addend;
+}
+
+bool arch_callee_saved_reg(unsigned char reg)
+{
+ return false;
+}
+
+int arch_decode_hint_reg(u8 sp_reg, int *base)
+{
+ exit(-1);
+}
+
+const char *arch_nop_insn(int len)
+{
+ exit(-1);
+}
+
+const char *arch_ret_insn(int len)
+{
+ exit(-1);
+}
+
+int arch_decode_instruction(struct objtool_file *file, const struct section *sec,
+ unsigned long offset, unsigned int maxlen,
+ unsigned int *len, enum insn_type *type,
+ unsigned long *immediate,
+ struct list_head *ops_list)
+{
+ u32 insn;
+
+ *immediate = 0;
+ insn = bswap_if_needed(file->elf, *(u32 *)(sec->data->d_buf + offset));
+ *len = 4;
+ *type = INSN_OTHER;
+
+ return 0;
+}
+
+unsigned long arch_jump_destination(struct instruction *insn)
+{
+ return insn->offset + insn->immediate;
+}
+
+void arch_initial_func_cfi_state(struct cfi_init_state *state)
+{
+ int i;
+
+ for (i = 0; i < CFI_NUM_REGS; i++) {
+ state->regs[i].base = CFI_UNDEFINED;
+ state->regs[i].offset = 0;
+ }
+
+ /* initial CFA (call frame address) */
+ state->cfa.base = CFI_SP;
+ state->cfa.offset = 0;
+
+ /* initial LR (return address) */
+ state->regs[CFI_RA].base = CFI_CFA;
+ state->regs[CFI_RA].offset = 0;
+}
diff --git a/tools/objtool/arch/powerpc/include/arch/cfi_regs.h b/tools/objtool/arch/powerpc/include/arch/cfi_regs.h
new file mode 100644
index 000000000000..59638ebeafc8
--- /dev/null
+++ b/tools/objtool/arch/powerpc/include/arch/cfi_regs.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#ifndef _OBJTOOL_CFI_REGS_H
+#define _OBJTOOL_CFI_REGS_H
+
+#define CFI_BP 1
+#define CFI_SP CFI_BP
+#define CFI_RA 32
+#define CFI_NUM_REGS 33
+
+#endif
diff --git a/tools/objtool/arch/powerpc/include/arch/elf.h b/tools/objtool/arch/powerpc/include/arch/elf.h
new file mode 100644
index 000000000000..3c8ebb7d2a6b
--- /dev/null
+++ b/tools/objtool/arch/powerpc/include/arch/elf.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#ifndef _OBJTOOL_ARCH_ELF
+#define _OBJTOOL_ARCH_ELF
+
+#define R_NONE R_PPC_NONE
+
+#endif /* _OBJTOOL_ARCH_ELF */
diff --git a/tools/objtool/arch/powerpc/include/arch/special.h b/tools/objtool/arch/powerpc/include/arch/special.h
new file mode 100644
index 000000000000..ffef9ada7133
--- /dev/null
+++ b/tools/objtool/arch/powerpc/include/arch/special.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+#ifndef _PPC_ARCH_SPECIAL_H
+#define _PPC_ARCH_SPECIAL_H
+
+#define EX_ENTRY_SIZE 8
+#define EX_ORIG_OFFSET 0
+#define EX_NEW_OFFSET 4
+
+#define JUMP_ENTRY_SIZE 16
+#define JUMP_ORIG_OFFSET 0
+#define JUMP_NEW_OFFSET 4
+#define JUMP_KEY_OFFSET 8
+
+#define ALT_ENTRY_SIZE 12
+#define ALT_ORIG_OFFSET 0
+#define ALT_NEW_OFFSET 4
+#define ALT_FEATURE_OFFSET 8
+#define ALT_ORIG_LEN_OFFSET 10
+#define ALT_NEW_LEN_OFFSET 11
+
+#endif /* _PPC_ARCH_SPECIAL_H */
diff --git a/tools/objtool/arch/powerpc/special.c b/tools/objtool/arch/powerpc/special.c
new file mode 100644
index 000000000000..d33868147196
--- /dev/null
+++ b/tools/objtool/arch/powerpc/special.c
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <string.h>
+#include <stdlib.h>
+#include <objtool/special.h>
+#include <objtool/builtin.h>
+
+
+bool arch_support_alt_relocation(struct special_alt *special_alt,
+ struct instruction *insn,
+ struct reloc *reloc)
+{
+ exit(-1);
+}
+
+struct reloc *arch_find_switch_table(struct objtool_file *file,
+ struct instruction *insn)
+{
+ exit(-1);
+}
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* [PATCH 16/16] objtool/powerpc: Add --mcount specific implementation
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
` (14 preceding siblings ...)
2022-08-08 11:49 ` [PATCH 15/16] objtool/powerpc: Enable objtool to be built on ppc Sathvika Vasireddy
@ 2022-08-08 11:49 ` Sathvika Vasireddy
15 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-08 11:49 UTC (permalink / raw)
To: linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
This patch enables objtool --mcount on powerpc, and
adds implementation specific to powerpc.
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
---
arch/powerpc/Kconfig | 1 +
tools/objtool/arch/powerpc/decode.c | 22 +++++++++++++++++++
tools/objtool/arch/powerpc/include/arch/elf.h | 2 ++
3 files changed, 25 insertions(+)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index dc05cd23c233..6be2e68fa9eb 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -238,6 +238,7 @@ config PPC
select HAVE_NMI if PERF_EVENTS || (PPC64 && PPC_BOOK3S)
select HAVE_OPTPROBES
select HAVE_OBJTOOL if PPC32 || MPROFILE_KERNEL
+ select HAVE_OBJTOOL_MCOUNT if HAVE_OBJTOOL
select HAVE_PERF_EVENTS
select HAVE_PERF_EVENTS_NMI if PPC64
select HAVE_PERF_REGS
diff --git a/tools/objtool/arch/powerpc/decode.c b/tools/objtool/arch/powerpc/decode.c
index 8b6a14680da7..b71c265ed503 100644
--- a/tools/objtool/arch/powerpc/decode.c
+++ b/tools/objtool/arch/powerpc/decode.c
@@ -9,6 +9,14 @@
#include <objtool/builtin.h>
#include <objtool/endianness.h>
+bool arch_ftrace_match(char *name)
+{
+ if (!strcmp(name, "_mcount"))
+ return true;
+
+ return false;
+}
+
unsigned long arch_dest_reloc_offset(int addend)
{
return addend;
@@ -41,12 +49,26 @@ int arch_decode_instruction(struct objtool_file *file, const struct section *sec
struct list_head *ops_list)
{
u32 insn;
+ unsigned int opcode;
*immediate = 0;
insn = bswap_if_needed(file->elf, *(u32 *)(sec->data->d_buf + offset));
*len = 4;
*type = INSN_OTHER;
+ opcode = insn >> 26;
+
+ switch (opcode) {
+ case 18: /* bl */
+ if ((insn & 3) == 1) {
+ *type = INSN_CALL;
+ *immediate = insn & 0x3fffffc;
+ if (*immediate & 0x2000000)
+ *immediate -= 0x4000000;
+ }
+ break;
+ }
+
return 0;
}
diff --git a/tools/objtool/arch/powerpc/include/arch/elf.h b/tools/objtool/arch/powerpc/include/arch/elf.h
index 3c8ebb7d2a6b..73f9ae172fe5 100644
--- a/tools/objtool/arch/powerpc/include/arch/elf.h
+++ b/tools/objtool/arch/powerpc/include/arch/elf.h
@@ -4,5 +4,7 @@
#define _OBJTOOL_ARCH_ELF
#define R_NONE R_PPC_NONE
+#define R_ABS64 R_PPC64_ADDR64
+#define R_ABS32 R_PPC_ADDR32
#endif /* _OBJTOOL_ARCH_ELF */
--
2.31.1
^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [PATCH 06/16] powerpc: Fix objtool unannotated intra-function call warnings on PPC32
2022-08-08 11:48 ` [PATCH 06/16] powerpc: Fix objtool unannotated intra-function call warnings on PPC32 Sathvika Vasireddy
@ 2022-08-09 23:31 ` kernel test robot
0 siblings, 0 replies; 32+ messages in thread
From: kernel test robot @ 2022-08-09 23:31 UTC (permalink / raw)
To: Sathvika Vasireddy, linuxppc-dev
Cc: llvm, kbuild-all, jpoimboe, peterz, linux-kernel, aik, mpe,
mingo, christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
Hi Sathvika,
I love your patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v5.19 next-20220809]
[cannot apply to powerpc/next powerpc/topic/ppc-kvm masahiroy-kbuild/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Sathvika-Vasireddy/objtool-Enable-and-implement-mcount-option-on-powerpc/20220808-200702
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 4e23eeebb2e57f5a28b36221aa776b5a1122dde5
config: powerpc-randconfig-r024-20220808 (https://download.01.org/0day-ci/archive/20220810/202208100751.LiiKZjrx-lkp@intel.com/config)
compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 5f1c7e2cc5a3c07cbc2412e851a7283c1841f520)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install powerpc cross compiling tool for clang build
# apt-get install binutils-powerpc-linux-gnu
# https://github.com/intel-lab-lkp/linux/commit/bcefd9c9f24358413a1b210aa591c8758f58b3a9
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Sathvika-Vasireddy/objtool-Enable-and-implement-mcount-option-on-powerpc/20220808-200702
git checkout bcefd9c9f24358413a1b210aa591c8758f58b3a9
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=powerpc SHELL=/bin/bash arch/powerpc/
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
>> <unknown>:0: error: symbol '__kuep_lock' is already defined
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON()
2022-08-08 11:48 ` [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON() Sathvika Vasireddy
@ 2022-08-10 8:28 ` Christophe Leroy
2022-08-18 10:46 ` Naveen N. Rao
2022-08-26 10:18 ` Christophe Leroy
1 sibling, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2022-08-10 8:28 UTC (permalink / raw)
To: Sathvika Vasireddy, linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo, rostedt, mbenes,
npiggin, chenzhongjin, linux-arm-kernel, naveen.n.rao
Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
> objtool is throwing *unannotated intra-function call*
> warnings with a few instructions that are marked
> unreachable. Replace unreachable() with __builtin_unreachable()
> to fix these warnings, as the codegen remains same
> with unreachable() and __builtin_unreachable().
I think it is necessary to explain why using unreachable() is not
necessary for powerpc, or even why using unreachable() is wrong.
Allthough we are getting rid of the problem here by replacing
unreachable() by __builtin_unreachable(), it might still be a problem in
core parts of kernel which still use unreachable.
So maybe it would be better to leave that as is, and instead modify
annotate_unreachable() so that only architectures requiring it
absolutely get it. For instance by defining and using a new config item,
for instance CONFIG_OBJTOOL_NEEDS_ANNOTATE_UNREACHABLE
>
> Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
> ---
> arch/powerpc/include/asm/bug.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/include/asm/bug.h b/arch/powerpc/include/asm/bug.h
> index 61a4736355c2..074be1a78c56 100644
> --- a/arch/powerpc/include/asm/bug.h
> +++ b/arch/powerpc/include/asm/bug.h
> @@ -99,7 +99,7 @@
> __label__ __label_warn_on; \
> \
> WARN_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags), __label_warn_on); \
> - unreachable(); \
> + __builtin_unreachable(); \
> \
> __label_warn_on: \
> break; \
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 02/16] powerpc: override __ALIGN() and __ALIGN_STR() macros
2022-08-08 11:48 ` [PATCH 02/16] powerpc: override __ALIGN() and __ALIGN_STR() macros Sathvika Vasireddy
@ 2022-08-10 8:31 ` Christophe Leroy
2022-08-18 10:46 ` Sathvika Vasireddy
0 siblings, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2022-08-10 8:31 UTC (permalink / raw)
To: Sathvika Vasireddy, linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo, rostedt, mbenes,
npiggin, chenzhongjin, linux-arm-kernel, naveen.n.rao
Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
> Since we need an alignment of 4 bytes, override
> __ALIGN() and __ALIGN_STR() accordingly.
Why/When do we now need an alignment of 4 bytes ? Please explain the
reason in the commit message.
>
> Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
> ---
> arch/powerpc/include/asm/linkage.h | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/arch/powerpc/include/asm/linkage.h b/arch/powerpc/include/asm/linkage.h
> index b71b9582e754..8df88fe61438 100644
> --- a/arch/powerpc/include/asm/linkage.h
> +++ b/arch/powerpc/include/asm/linkage.h
> @@ -2,8 +2,12 @@
> #ifndef _ASM_POWERPC_LINKAGE_H
> #define _ASM_POWERPC_LINKAGE_H
>
> +#include <linux/stringify.h>
> #include <asm/types.h>
>
> +#define __ALIGN .align 2
> +#define __ALIGN_STR __stringify(__ALIGN)
Why do you need to use __stringify ?
ARM64 does:
#define __ALIGN .align 2
#define __ALIGN_STR ".align 2"
> +
> #ifdef CONFIG_PPC64_ELF_ABI_V1
> #define cond_syscall(x) \
> asm ("\t.weak " #x "\n\t.set " #x ", sys_ni_syscall\n" \
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 03/16] powerpc: Fix objtool unannotated intra-function call warnings
2022-08-08 11:48 ` [PATCH 03/16] powerpc: Fix objtool unannotated intra-function call warnings Sathvika Vasireddy
@ 2022-08-10 8:32 ` Christophe Leroy
2022-08-18 10:55 ` Sathvika Vasireddy
0 siblings, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2022-08-10 8:32 UTC (permalink / raw)
To: Sathvika Vasireddy, linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo, rostedt, mbenes,
npiggin, chenzhongjin, linux-arm-kernel, naveen.n.rao
Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
> objtool throws unannotated intra-function call warnings
> in the following assembly files.
>
> arch/powerpc/kernel/vector.o: warning: objtool: .text+0x53c: unannotated intra-function call
>
> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x60: unannotated intra-function call
> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x124: unannotated intra-function call
> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x5d4: unannotated intra-function call
> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x5dc: unannotated intra-function call
> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0xcb8: unannotated intra-function call
> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0xd0c: unannotated intra-function call
> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x1030: unannotated intra-function call
>
> arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x358: unannotated intra-function call
> arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x728: unannotated intra-function call
> arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x4d94: unannotated intra-function call
> arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x4ec4: unannotated intra-function call
>
> arch/powerpc/kvm/book3s_hv_interrupts.o: warning: objtool: .text+0x6c: unannotated intra-function call
> arch/powerpc/kernel/misc_64.o: warning: objtool: .text+0x64: unannotated intra-function call
>
Before explaining how you fix it, can you explain why we get it ?
> Fix these warnings by annotating those functions with
> SYM_FUNC_START_LOCAL() and SYM_FUNC_END() macros.
>
> Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
> ---
> arch/powerpc/kernel/exceptions-64s.S | 7 +++++--
> arch/powerpc/kernel/head_64.S | 7 +++++--
> arch/powerpc/kernel/misc_64.S | 4 +++-
> arch/powerpc/kernel/vector.S | 4 +++-
> arch/powerpc/kvm/book3s_hv_interrupts.S | 4 +++-
> arch/powerpc/kvm/book3s_hv_rmhandlers.S | 22 +++++++++++++++-------
> 6 files changed, 34 insertions(+), 14 deletions(-)
>
> diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
> index 3d0dc133a9ae..4242c1a20bcd 100644
> --- a/arch/powerpc/kernel/exceptions-64s.S
> +++ b/arch/powerpc/kernel/exceptions-64s.S
> @@ -20,6 +20,7 @@
> #include <asm/head-64.h>
> #include <asm/feature-fixups.h>
> #include <asm/kup.h>
> +#include <linux/linkage.h>
>
> /*
> * Following are fixed section helper macros.
> @@ -3075,7 +3076,7 @@ CLOSE_FIXED_SECTION(virt_trampolines);
> USE_TEXT_SECTION()
>
> /* MSR[RI] should be clear because this uses SRR[01] */
> -enable_machine_check:
> +SYM_FUNC_START_LOCAL(enable_machine_check)
> mflr r0
> bcl 20,31,$+4
> 0: mflr r3
> @@ -3087,9 +3088,10 @@ enable_machine_check:
> RFI_TO_KERNEL
> 1: mtlr r0
> blr
> +SYM_FUNC_END(enable_machine_check)
>
> /* MSR[RI] should be clear because this uses SRR[01] */
> -disable_machine_check:
> +SYM_FUNC_START_LOCAL(disable_machine_check)
> mflr r0
> bcl 20,31,$+4
> 0: mflr r3
> @@ -3102,3 +3104,4 @@ disable_machine_check:
> RFI_TO_KERNEL
> 1: mtlr r0
> blr
> +SYM_FUNC_END(disable_machine_check)
> diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
> index cf2c08902c05..10e2d43420d0 100644
> --- a/arch/powerpc/kernel/head_64.S
> +++ b/arch/powerpc/kernel/head_64.S
> @@ -18,6 +18,7 @@
> * variants.
> */
>
> +#include <linux/linkage.h>
> #include <linux/threads.h>
> #include <linux/init.h>
> #include <asm/reg.h>
> @@ -465,7 +466,7 @@ generic_secondary_common_init:
> * Assumes we're mapped EA == RA if the MMU is on.
> */
> #ifdef CONFIG_PPC_BOOK3S
> -__mmu_off:
> +SYM_FUNC_START_LOCAL(__mmu_off)
> mfmsr r3
> andi. r0,r3,MSR_IR|MSR_DR
> beqlr
> @@ -476,6 +477,7 @@ __mmu_off:
> sync
> rfid
> b . /* prevent speculative execution */
> +SYM_FUNC_END(__mmu_off)
> #endif
>
>
> @@ -869,7 +871,7 @@ _GLOBAL(start_secondary_resume)
> /*
> * This subroutine clobbers r11 and r12
> */
> -enable_64b_mode:
> +SYM_FUNC_START_LOCAL(enable_64b_mode)
> mfmsr r11 /* grab the current MSR */
> #ifdef CONFIG_PPC_BOOK3E
> oris r11,r11,0x8000 /* CM bit set, we'll set ICM later */
> @@ -881,6 +883,7 @@ enable_64b_mode:
> isync
> #endif
> blr
> +SYM_FUNC_END(enable_64b_mode)
>
> /*
> * This puts the TOC pointer into r2, offset by 0x8000 (as expected
> diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S
> index fd6d8d3a548e..b36fb89ff718 100644
> --- a/arch/powerpc/kernel/misc_64.S
> +++ b/arch/powerpc/kernel/misc_64.S
> @@ -9,6 +9,7 @@
> * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com)
> */
>
> +#include <linux/linkage.h>
> #include <linux/sys.h>
> #include <asm/unistd.h>
> #include <asm/errno.h>
> @@ -353,7 +354,7 @@ _GLOBAL(kexec_smp_wait)
> *
> * don't overwrite r3 here, it is live for kexec_wait above.
> */
> -real_mode: /* assume normal blr return */
> +SYM_FUNC_START_LOCAL(real_mode) /* assume normal blr return */
> #ifdef CONFIG_PPC_BOOK3E
> /* Create an identity mapping. */
> b kexec_create_tlb
> @@ -370,6 +371,7 @@ real_mode: /* assume normal blr return */
> mtspr SPRN_SRR0,r11
> rfid
> #endif
> +SYM_FUNC_END(real_mode)
>
> /*
> * kexec_sequence(newstack, start, image, control, clear_all(),
> diff --git a/arch/powerpc/kernel/vector.S b/arch/powerpc/kernel/vector.S
> index 5cc24d8cce94..fb96aed2b5c3 100644
> --- a/arch/powerpc/kernel/vector.S
> +++ b/arch/powerpc/kernel/vector.S
> @@ -9,6 +9,7 @@
> #include <asm/ptrace.h>
> #include <asm/export.h>
> #include <asm/asm-compat.h>
> +#include <linux/linkage.h>
>
> /*
> * Load state from memory into VMX registers including VSCR.
> @@ -186,7 +187,7 @@ fphalf:
> * Internal routine to enable floating point and set FPSCR to 0.
> * Don't call it from C; it doesn't use the normal calling convention.
> */
> -fpenable:
> +SYM_FUNC_START_LOCAL(fpenable)
> #ifdef CONFIG_PPC32
> stwu r1,-64(r1)
> #else
> @@ -203,6 +204,7 @@ fpenable:
> mffs fr31
> MTFSF_L(fr1)
> blr
> +SYM_FUNC_END(fpenable)
>
> fpdisable:
> mtlr r12
> diff --git a/arch/powerpc/kvm/book3s_hv_interrupts.S b/arch/powerpc/kvm/book3s_hv_interrupts.S
> index 59d89e4b154a..c0deeea7eef3 100644
> --- a/arch/powerpc/kvm/book3s_hv_interrupts.S
> +++ b/arch/powerpc/kvm/book3s_hv_interrupts.S
> @@ -9,6 +9,7 @@
> * Authors: Alexander Graf <agraf@suse.de>
> */
>
> +#include <linux/linkage.h>
> #include <asm/ppc_asm.h>
> #include <asm/kvm_asm.h>
> #include <asm/reg.h>
> @@ -107,7 +108,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
> /*
> * void kvmhv_save_host_pmu(void)
> */
> -kvmhv_save_host_pmu:
> +SYM_FUNC_START_LOCAL(kvmhv_save_host_pmu)
> BEGIN_FTR_SECTION
> /* Work around P8 PMAE bug */
> li r3, -1
> @@ -154,3 +155,4 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
> stw r8, HSTATE_PMC5(r13)
> stw r9, HSTATE_PMC6(r13)
> 31: blr
> +SYM_FUNC_END(kvmhv_save_host_pmu)
> diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> index 7ded202bf995..de91118df0c5 100644
> --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
> @@ -29,6 +29,7 @@
> #include <asm/asm-compat.h>
> #include <asm/feature-fixups.h>
> #include <asm/cpuidle.h>
> +#include <linux/linkage.h>
>
> /* Values in HSTATE_NAPPING(r13) */
> #define NAPPING_CEDE 1
> @@ -2358,7 +2359,7 @@ hmi_realmode:
> * This routine calls kvmppc_read_intr, a C function, if an external
> * interrupt is pending.
> */
> -kvmppc_check_wake_reason:
> +SYM_FUNC_START_LOCAL(kvmppc_check_wake_reason)
> mfspr r6, SPRN_SRR1
> BEGIN_FTR_SECTION
> rlwinm r6, r6, 45-31, 0xf /* extract wake reason field (P8) */
> @@ -2427,6 +2428,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
> addi r1, r1, PPC_MIN_STKFRM
> mtlr r0
> blr
> +SYM_FUNC_END(kvmppc_check_wake_reason)
>
> /*
> * Save away FP, VMX and VSX registers.
> @@ -2434,7 +2436,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
> * N.B. r30 and r31 are volatile across this function,
> * thus it is not callable from C.
> */
> -kvmppc_save_fp:
> +SYM_FUNC_START_LOCAL(kvmppc_save_fp)
> mflr r30
> mr r31,r3
> mfmsr r5
> @@ -2462,6 +2464,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
> stw r6,VCPU_VRSAVE(r31)
> mtlr r30
> blr
> +SYM_FUNC_END(kvmppc_save_fp)
>
> /*
> * Load up FP, VMX and VSX registers
> @@ -2469,7 +2472,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
> * N.B. r30 and r31 are volatile across this function,
> * thus it is not callable from C.
> */
> -kvmppc_load_fp:
> +SYM_FUNC_START_LOCAL(kvmppc_load_fp)
> mflr r30
> mr r31,r4
> mfmsr r9
> @@ -2498,6 +2501,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
> mtlr r30
> mr r4,r31
> blr
> +SYM_FUNC_END(kvmppc_load_fp)
>
> #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
> /*
> @@ -2746,7 +2750,7 @@ kvmppc_bad_host_intr:
> * r9 has a vcpu pointer (in)
> * r0 is used as a scratch register
> */
> -kvmppc_msr_interrupt:
> +SYM_FUNC_START_LOCAL(kvmppc_msr_interrupt)
> rldicl r0, r11, 64 - MSR_TS_S_LG, 62
> cmpwi r0, 2 /* Check if we are in transactional state.. */
> ld r11, VCPU_INTR_MSR(r9)
> @@ -2755,13 +2759,14 @@ kvmppc_msr_interrupt:
> li r0, 1
> 1: rldimi r11, r0, MSR_TS_S_LG, 63 - MSR_TS_T_LG
> blr
> +SYM_FUNC_END(kvmppc_msr_interrupt)
>
> /*
> * void kvmhv_load_guest_pmu(struct kvm_vcpu *vcpu)
> *
> * Load up guest PMU state. R3 points to the vcpu struct.
> */
> -kvmhv_load_guest_pmu:
> +SYM_FUNC_START_LOCAL(kvmhv_load_guest_pmu)
> mr r4, r3
> mflr r0
> li r3, 1
> @@ -2811,13 +2816,14 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
> isync
> mtlr r0
> blr
> +SYM_FUNC_END(kvmhv_load_guest_pmu)
>
> /*
> * void kvmhv_load_host_pmu(void)
> *
> * Reload host PMU state saved in the PACA by kvmhv_save_host_pmu.
> */
> -kvmhv_load_host_pmu:
> +SYM_FUNC_START_LOCAL(kvmhv_load_host_pmu)
> mflr r0
> lbz r4, PACA_PMCINUSE(r13) /* is the host using the PMU? */
> cmpwi r4, 0
> @@ -2859,6 +2865,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
> isync
> mtlr r0
> 23: blr
> +SYM_FUNC_END(kvmhv_load_host_pmu)
>
> /*
> * void kvmhv_save_guest_pmu(struct kvm_vcpu *vcpu, bool pmu_in_use)
> @@ -2866,7 +2873,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
> * Save guest PMU state into the vcpu struct.
> * r3 = vcpu, r4 = full save flag (PMU in use flag set in VPA)
> */
> -kvmhv_save_guest_pmu:
> +SYM_FUNC_START_LOCAL(kvmhv_save_guest_pmu)
> mr r9, r3
> mr r8, r4
> BEGIN_FTR_SECTION
> @@ -2942,6 +2949,7 @@ BEGIN_FTR_SECTION
> mtspr SPRN_MMCRS, r4
> END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
> 22: blr
> +SYM_FUNC_END(kvmhv_save_guest_pmu)
>
> /*
> * This works around a hardware bug on POWER8E processors, where
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 05/16] powerpc: Skip objtool from running on drivers/crypto/vmx/aesp8-ppc.o
2022-08-08 11:48 ` [PATCH 05/16] powerpc: Skip objtool from running on drivers/crypto/vmx/aesp8-ppc.o Sathvika Vasireddy
@ 2022-08-10 8:34 ` Christophe Leroy
2022-08-18 11:12 ` Sathvika Vasireddy
0 siblings, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2022-08-10 8:34 UTC (permalink / raw)
To: Sathvika Vasireddy, linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo, rostedt, mbenes,
npiggin, chenzhongjin, linux-arm-kernel, naveen.n.rao
Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
> With objtool enabled, below warnings are seen when trying to build:
>
> drivers/crypto/vmx/aesp8-ppc.o: warning: objtool: aes_p8_set_encrypt_key+0x44: unannotated intra-function call
>
> drivers/crypto/vmx/aesp8-ppc.o: warning: objtool: .text+0x2448: unannotated intra-function call
>
> drivers/crypto/vmx/aesp8-ppc.o: warning: objtool: .text+0x2d68: unannotated intra-function call
>
> Skip objtool from running on this file, as
> there are no calls to _mcount.
Why not fix it the same way as for other files ? Please explain.
>
> Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
> ---
> drivers/crypto/vmx/Makefile | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/drivers/crypto/vmx/Makefile b/drivers/crypto/vmx/Makefile
> index 2560cfea1dec..7b41f0da6807 100644
> --- a/drivers/crypto/vmx/Makefile
> +++ b/drivers/crypto/vmx/Makefile
> @@ -9,3 +9,5 @@ targets += aesp8-ppc.S ghashp8-ppc.S
>
> $(obj)/aesp8-ppc.S $(obj)/ghashp8-ppc.S: $(obj)/%.S: $(src)/%.pl FORCE
> $(call if_changed,perl)
> +
> +OBJECT_FILES_NON_STANDARD_aesp8-ppc.o := y
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 14/16] objtool: Add arch specific function arch_ftrace_match()
2022-08-08 11:49 ` [PATCH 14/16] objtool: Add arch specific function arch_ftrace_match() Sathvika Vasireddy
@ 2022-08-12 10:58 ` kernel test robot
2022-08-13 13:48 ` kernel test robot
1 sibling, 0 replies; 32+ messages in thread
From: kernel test robot @ 2022-08-12 10:58 UTC (permalink / raw)
To: Sathvika Vasireddy, linuxppc-dev
Cc: kbuild-all, jpoimboe, peterz, linux-kernel, aik, mpe, mingo,
christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
Hi Sathvika,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v5.19 next-20220812]
[cannot apply to powerpc/next powerpc/topic/ppc-kvm masahiroy-kbuild/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Sathvika-Vasireddy/objtool-Enable-and-implement-mcount-option-on-powerpc/20220808-200702
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 4e23eeebb2e57f5a28b36221aa776b5a1122dde5
config: x86_64-defconfig (https://download.01.org/0day-ci/archive/20220812/202208121847.XuEAqabf-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.3.0-3) 11.3.0
reproduce (this is a W=1 build):
# https://github.com/intel-lab-lkp/linux/commit/2b03c8be7104e834933d2f5928e69828190e935c
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Sathvika-Vasireddy/objtool-Enable-and-implement-mcount-option-on-powerpc/20220808-200702
git checkout 2b03c8be7104e834933d2f5928e69828190e935c
# save the config file
mkdir build_dir && cp config build_dir/.config
make W=1 O=build_dir ARCH=x86_64 prepare
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
arch/x86/decode.c: In function 'arch_ftrace_match':
>> arch/x86/decode.c:28:21: error: 'func' undeclared (first use in this function)
28 | if (!strcmp(func->name, "__fentry__"))
| ^~~~
arch/x86/decode.c:28:21: note: each undeclared identifier is reported only once for each function it appears in
make[5]: *** [tools/build/Makefile.build:96: tools/objtool/arch/x86/decode.o] Error 1
make[4]: *** [tools/build/Makefile.build:139: arch/x86] Error 2
make[4]: *** Waiting for unfinished jobs....
make[3]: *** [Makefile:54: tools/objtool/objtool-in.o] Error 2
make[2]: *** [Makefile:73: objtool] Error 2
make[1]: *** [Makefile:1347: tools/objtool] Error 2
make[1]: Target 'prepare' not remade because of errors.
make: *** [Makefile:219: __sub-make] Error 2
make: Target 'prepare' not remade because of errors.
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 14/16] objtool: Add arch specific function arch_ftrace_match()
2022-08-08 11:49 ` [PATCH 14/16] objtool: Add arch specific function arch_ftrace_match() Sathvika Vasireddy
2022-08-12 10:58 ` kernel test robot
@ 2022-08-13 13:48 ` kernel test robot
1 sibling, 0 replies; 32+ messages in thread
From: kernel test robot @ 2022-08-13 13:48 UTC (permalink / raw)
To: Sathvika Vasireddy, linuxppc-dev
Cc: llvm, kbuild-all, jpoimboe, peterz, linux-kernel, aik, mpe,
mingo, christophe.leroy, rostedt, mbenes, npiggin, chenzhongjin,
linux-arm-kernel, naveen.n.rao, sv
Hi Sathvika,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v5.19 next-20220812]
[cannot apply to powerpc/next powerpc/topic/ppc-kvm masahiroy-kbuild/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Sathvika-Vasireddy/objtool-Enable-and-implement-mcount-option-on-powerpc/20220808-200702
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 4e23eeebb2e57f5a28b36221aa776b5a1122dde5
config: x86_64-randconfig-a005 (https://download.01.org/0day-ci/archive/20220813/202208132139.WhghhLpC-lkp@intel.com/config)
compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 5f1c7e2cc5a3c07cbc2412e851a7283c1841f520)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/2b03c8be7104e834933d2f5928e69828190e935c
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Sathvika-Vasireddy/objtool-Enable-and-implement-mcount-option-on-powerpc/20220808-200702
git checkout 2b03c8be7104e834933d2f5928e69828190e935c
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 prepare
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
error: write on a pipe with no reader
error: write on a pipe with no reader
error: write on a pipe with no reader
>> arch/x86/decode.c:28:14: error: use of undeclared identifier 'func'
if (!strcmp(func->name, "__fentry__"))
^
1 error generated.
make[5]: *** [tools/build/Makefile.build:96: tools/objtool/arch/x86/decode.o] Error 1
make[4]: *** [tools/build/Makefile.build:139: arch/x86] Error 2
make[4]: *** Waiting for unfinished jobs....
make[3]: *** [Makefile:54: tools/objtool/objtool-in.o] Error 2
make[2]: *** [Makefile:73: objtool] Error 2
make[1]: *** [Makefile:1347: tools/objtool] Error 2
make[1]: Target 'prepare' not remade because of errors.
make: *** [Makefile:219: __sub-make] Error 2
make: Target 'prepare' not remade because of errors.
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON()
2022-08-10 8:28 ` Christophe Leroy
@ 2022-08-18 10:46 ` Naveen N. Rao
2022-08-18 11:06 ` Christophe Leroy
0 siblings, 1 reply; 32+ messages in thread
From: Naveen N. Rao @ 2022-08-18 10:46 UTC (permalink / raw)
To: Christophe Leroy, linuxppc-dev, Sathvika Vasireddy
Cc: aik, chenzhongjin, jpoimboe, linux-arm-kernel, linux-kernel,
mbenes, mingo, mpe, npiggin, peterz, rostedt
Christophe Leroy wrote:
>
>
> Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
>> objtool is throwing *unannotated intra-function call*
>> warnings with a few instructions that are marked
>> unreachable. Replace unreachable() with __builtin_unreachable()
>> to fix these warnings, as the codegen remains same
>> with unreachable() and __builtin_unreachable().
>
> I think it is necessary to explain why using unreachable() is not
> necessary for powerpc, or even why using unreachable() is wrong.
>
> Allthough we are getting rid of the problem here by replacing
> unreachable() by __builtin_unreachable(), it might still be a problem in
> core parts of kernel which still use unreachable.
I did a kernel build with this series applied, with a variant of
ppc64le_defconfig. I then did another build with the same config, but
with the below hunk to disable objtool:
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 6be2e68fa9eb64..4c466acdc70d4c 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -237,8 +237,6 @@ config PPC
select HAVE_MOD_ARCH_SPECIFIC
select HAVE_NMI if PERF_EVENTS || (PPC64 && PPC_BOOK3S)
select HAVE_OPTPROBES
- select HAVE_OBJTOOL if PPC32 || MPROFILE_KERNEL
- select HAVE_OBJTOOL_MCOUNT if HAVE_OBJTOOL
select HAVE_PERF_EVENTS
select HAVE_PERF_EVENTS_NMI if PPC64
select HAVE_PERF_REGS
This has the effect of disabling annotations for unreachable().
When I compared the resulting object files, I did not see changes in
codegen relating to the annotation, like we do with using unreachable()
in __WARN_FLAGS().
More specifically, arch/powerpc/kvm/book3s.o:kvmppc_h_logical_ci_load()
uses BUG(), and the generated code remains the same with/without the
unreachable() annotation.
This suggests that the bad codegen we are seeing with the annotation in
unreachable() is limited to its use in __WARN_FLAGS(), which I suspect
is due to an interaction with the use of asm_volatile_goto() for
WARN_ENTRY().
If I revert this patch (patch 01/16), gcc seems to add a label 8 bytes
before _some_ function in this object file, which happens to hold a
relocation against .TOC., and emits a bl to that symbol. Otherwise, gcc
either emits no new instruction for the annotation, or a 'nop' in some
cases.
If I add a 'nop' between WARN_ENTRY() and unreachable() in
__WARN_FLAGS(), or convert WARN_ENTRY to BUG_ENTRY thereby removing use
of asm_volatile_goto(), the problem goes away and no bl is emitted:
diff --git a/arch/powerpc/include/asm/bug.h b/arch/powerpc/include/asm/bug.h
index 61a4736355c244..88e0027c20ba5c 100644
--- a/arch/powerpc/include/asm/bug.h
+++ b/arch/powerpc/include/asm/bug.h
@@ -99,6 +99,7 @@
__label__ __label_warn_on; \
\
WARN_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags), __label_warn_on); \
+ __asm__ __volatile__("nop"); \
unreachable(); \
\
__label_warn_on:
In summary, I think the annotation itself is fine and we are only seeing
an issue with its usage after WARN_ENTRY() due to use of
asm_volatile_goto. Other uses of unreachable() don't seem to exhibit
this problem.
As such, I think this patch is appropriate for this series, though I
think we should capture some of this information in the changelog.
Note also that if and when we start utlizing the annotation, if we
classify twui as INSN_BUG, this change will continue to be appropriate.
- Naveen
^ permalink raw reply related [flat|nested] 32+ messages in thread
* Re: [PATCH 02/16] powerpc: override __ALIGN() and __ALIGN_STR() macros
2022-08-10 8:31 ` Christophe Leroy
@ 2022-08-18 10:46 ` Sathvika Vasireddy
0 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-18 10:46 UTC (permalink / raw)
To: Christophe Leroy, linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo, rostedt, mbenes,
npiggin, chenzhongjin, linux-arm-kernel, naveen.n.rao,
Sathvika Vasireddy
Hi Christophe,
On 10/08/22 14:01, Christophe Leroy wrote:
>
> Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
>> Since we need an alignment of 4 bytes, override
>> __ALIGN() and __ALIGN_STR() accordingly.
> Why/When do we now need an alignment of 4 bytes ? Please explain the
> reason in the commit message.
Powerpc instructions must be word-aligned. Currently, there is an
alignment of 16 bytes (by default),
and it is much more than what is required for powerpc (4 bytes).
The default expansion of these macros are:
#define __ALIGN .align 4,0x90
#define __ALIGN_STR ".align 4,0x90"
Since Powerpc Linux does not require a 16 byte alignment, override
_ALIGN() and __ALIGN_STR() macros
to use required 4 byte alignment.
Sure, I'll explain the reason in commit message.
>
>> Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
>> ---
>> arch/powerpc/include/asm/linkage.h | 4 ++++
>> 1 file changed, 4 insertions(+)
>>
>> diff --git a/arch/powerpc/include/asm/linkage.h b/arch/powerpc/include/asm/linkage.h
>> index b71b9582e754..8df88fe61438 100644
>> --- a/arch/powerpc/include/asm/linkage.h
>> +++ b/arch/powerpc/include/asm/linkage.h
>> @@ -2,8 +2,12 @@
>> #ifndef _ASM_POWERPC_LINKAGE_H
>> #define _ASM_POWERPC_LINKAGE_H
>>
>> +#include <linux/stringify.h>
>> #include <asm/types.h>
>>
>> +#define __ALIGN .align 2
>> +#define __ALIGN_STR __stringify(__ALIGN)
> Why do you need to use __stringify ?
>
> ARM64 does:
>
> #define __ALIGN .align 2
> #define __ALIGN_STR ".align 2"
We could use either __stringify() or quotes, both do the same thing.
While arm64 does ".align 2",
x86 does:
#define __ALIGN .p2align 4, 0x90
#define __ALIGN_STR __stringify(__ALIGN)
>
>
>
>
>> +
>> #ifdef CONFIG_PPC64_ELF_ABI_V1
>> #define cond_syscall(x) \
>> asm ("\t.weak " #x "\n\t.set " #x ", sys_ni_syscall\n" \
Thanks for reviewing!
- Sathvika
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 03/16] powerpc: Fix objtool unannotated intra-function call warnings
2022-08-10 8:32 ` Christophe Leroy
@ 2022-08-18 10:55 ` Sathvika Vasireddy
0 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-18 10:55 UTC (permalink / raw)
To: Christophe Leroy, Sathvika Vasireddy, linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo, rostedt, mbenes,
npiggin, chenzhongjin, linux-arm-kernel, naveen.n.rao
On 10/08/22 14:02, Christophe Leroy wrote:
>
> Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
>> objtool throws unannotated intra-function call warnings
>> in the following assembly files.
>>
>> arch/powerpc/kernel/vector.o: warning: objtool: .text+0x53c: unannotated intra-function call
>>
>> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x60: unannotated intra-function call
>> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x124: unannotated intra-function call
>> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x5d4: unannotated intra-function call
>> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x5dc: unannotated intra-function call
>> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0xcb8: unannotated intra-function call
>> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0xd0c: unannotated intra-function call
>> arch/powerpc/kvm/book3s_hv_rmhandlers.o: warning: objtool: .text+0x1030: unannotated intra-function call
>>
>> arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x358: unannotated intra-function call
>> arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x728: unannotated intra-function call
>> arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x4d94: unannotated intra-function call
>> arch/powerpc/kernel/head_64.o: warning: objtool: .text+0x4ec4: unannotated intra-function call
>>
>> arch/powerpc/kvm/book3s_hv_interrupts.o: warning: objtool: .text+0x6c: unannotated intra-function call
>> arch/powerpc/kernel/misc_64.o: warning: objtool: .text+0x64: unannotated intra-function call
>>
> Before explaining how you fix it, can you explain why we get it ?
Sure.
objtool does not add STT_NOTYPE symbols with size 0 to the rbtree, which
is why find_call_destination()
function is not able to find the destination symbol for 'bl'
instruction. For such symbols, objtool is throwing
unannotated intra-function call warnings in assembly files. Fix these
warnings by adding
SYM_FUNC_START_LOCAL() and SYM_FUNC_END() annotations to those symbols
to be able to set symbol
type to STT_FUNC and set size of these symbols accordingly.
I'll add this explanation to the commit message.
Thanks for reviewing.
- Sathvika
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON()
2022-08-18 10:46 ` Naveen N. Rao
@ 2022-08-18 11:06 ` Christophe Leroy
2022-08-18 12:25 ` Naveen N. Rao
0 siblings, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2022-08-18 11:06 UTC (permalink / raw)
To: Naveen N. Rao, linuxppc-dev, Sathvika Vasireddy
Cc: aik, chenzhongjin, jpoimboe, linux-arm-kernel, linux-kernel,
mbenes, mingo, mpe, npiggin, peterz, rostedt
Le 18/08/2022 à 12:46, Naveen N. Rao a écrit :
> Christophe Leroy wrote:
>>
>>
>> Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
>>> objtool is throwing *unannotated intra-function call*
>>> warnings with a few instructions that are marked
>>> unreachable. Replace unreachable() with __builtin_unreachable()
>>> to fix these warnings, as the codegen remains same
>>> with unreachable() and __builtin_unreachable().
>>
>> I think it is necessary to explain why using unreachable() is not
>> necessary for powerpc, or even why using unreachable() is wrong.
>>
>> Allthough we are getting rid of the problem here by replacing
>> unreachable() by __builtin_unreachable(), it might still be a problem
>> in core parts of kernel which still use unreachable.
>
> I did a kernel build with this series applied, with a variant of
> ppc64le_defconfig. I then did another build with the same config, but
> with the below hunk to disable objtool:
>
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index 6be2e68fa9eb64..4c466acdc70d4c 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -237,8 +237,6 @@ config PPC
> select HAVE_MOD_ARCH_SPECIFIC
> select HAVE_NMI if PERF_EVENTS || (PPC64
> && PPC_BOOK3S)
> select HAVE_OPTPROBES
> - select HAVE_OBJTOOL if PPC32 || MPROFILE_KERNEL
> - select HAVE_OBJTOOL_MCOUNT if HAVE_OBJTOOL
> select HAVE_PERF_EVENTS
> select HAVE_PERF_EVENTS_NMI if PPC64
> select HAVE_PERF_REGS
>
> This has the effect of disabling annotations for unreachable().
>
> When I compared the resulting object files, I did not see changes in
> codegen relating to the annotation, like we do with using unreachable()
> in __WARN_FLAGS().
>
> More specifically, arch/powerpc/kvm/book3s.o:kvmppc_h_logical_ci_load()
> uses BUG(), and the generated code remains the same with/without the
> unreachable() annotation.
>
> This suggests that the bad codegen we are seeing with the annotation in
> unreachable() is limited to its use in __WARN_FLAGS(), which I suspect
> is due to an interaction with the use of asm_volatile_goto() for
> WARN_ENTRY().
>
> If I revert this patch (patch 01/16), gcc seems to add a label 8 bytes
> before _some_ function in this object file, which happens to hold a
> relocation against .TOC., and emits a bl to that symbol. Otherwise, gcc
> either emits no new instruction for the annotation, or a 'nop' in some
> cases.
>
> If I add a 'nop' between WARN_ENTRY() and unreachable() in
> __WARN_FLAGS(), or convert WARN_ENTRY to BUG_ENTRY thereby removing use
> of asm_volatile_goto(), the problem goes away and no bl is emitted:
>
> diff --git a/arch/powerpc/include/asm/bug.h
> b/arch/powerpc/include/asm/bug.h
> index 61a4736355c244..88e0027c20ba5c 100644
> --- a/arch/powerpc/include/asm/bug.h
> +++ b/arch/powerpc/include/asm/bug.h
> @@ -99,6 +99,7 @@
> __label__ __label_warn_on; \
> \
> WARN_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags),
> __label_warn_on); \
> + __asm__ __volatile__("nop"); \
> unreachable(); \
> \
> __label_warn_on:
>
>
> In summary, I think the annotation itself is fine and we are only seeing
> an issue with its usage after WARN_ENTRY() due to use of
> asm_volatile_goto. Other uses of unreachable() don't seem to exhibit
> this problem.
>
> As such, I think this patch is appropriate for this series, though I
> think we should capture some of this information in the changelog.
>
> Note also that if and when we start utlizing the annotation, if we
> classify twui as INSN_BUG, this change will continue to be appropriate.
>
INSN_TRAP instead of INSN_BUG ?
Christophe
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 05/16] powerpc: Skip objtool from running on drivers/crypto/vmx/aesp8-ppc.o
2022-08-10 8:34 ` Christophe Leroy
@ 2022-08-18 11:12 ` Sathvika Vasireddy
0 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-18 11:12 UTC (permalink / raw)
To: Christophe Leroy, linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo, rostedt, mbenes,
npiggin, chenzhongjin, linux-arm-kernel, naveen.n.rao,
Sathvika Vasireddy
On 10/08/22 14:04, Christophe Leroy wrote:
>
> Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
>> With objtool enabled, below warnings are seen when trying to build:
>>
>> drivers/crypto/vmx/aesp8-ppc.o: warning: objtool: aes_p8_set_encrypt_key+0x44: unannotated intra-function call
>>
>> drivers/crypto/vmx/aesp8-ppc.o: warning: objtool: .text+0x2448: unannotated intra-function call
>>
>> drivers/crypto/vmx/aesp8-ppc.o: warning: objtool: .text+0x2d68: unannotated intra-function call
>>
>> Skip objtool from running on this file, as
>> there are no calls to _mcount.
> Why not fix it the same way as for other files ? Please explain.
For two main reasons:
1. Since this file comes from OpenSSL, and since it is a perl file which
generates a .S file, it may not
be the best choice to make too many code changes to such files,
unless absolutely necessary.
2. Second reason is that, at least as far as the objtool --mcount
functionality is concerned, we do not
have to run objtool on that file because that file does not have
any calls to _mcount.
>
>> Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
>> ---
>> drivers/crypto/vmx/Makefile | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/drivers/crypto/vmx/Makefile b/drivers/crypto/vmx/Makefile
>> index 2560cfea1dec..7b41f0da6807 100644
>> --- a/drivers/crypto/vmx/Makefile
>> +++ b/drivers/crypto/vmx/Makefile
>> @@ -9,3 +9,5 @@ targets += aesp8-ppc.S ghashp8-ppc.S
>>
>> $(obj)/aesp8-ppc.S $(obj)/ghashp8-ppc.S: $(obj)/%.S: $(src)/%.pl FORCE
>> $(call if_changed,perl)
>> +
>> +OBJECT_FILES_NON_STANDARD_aesp8-ppc.o := y
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON()
2022-08-18 11:06 ` Christophe Leroy
@ 2022-08-18 12:25 ` Naveen N. Rao
0 siblings, 0 replies; 32+ messages in thread
From: Naveen N. Rao @ 2022-08-18 12:25 UTC (permalink / raw)
To: Christophe Leroy, linuxppc-dev, Sathvika Vasireddy
Cc: aik, chenzhongjin, jpoimboe, linux-arm-kernel, linux-kernel,
mbenes, mingo, mpe, npiggin, peterz, rostedt
Christophe Leroy wrote:
>
>
> Le 18/08/2022 à 12:46, Naveen N. Rao a écrit :
>> Christophe Leroy wrote:
>>>
>>>
>>> Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
>>>> objtool is throwing *unannotated intra-function call*
>>>> warnings with a few instructions that are marked
>>>> unreachable. Replace unreachable() with __builtin_unreachable()
>>>> to fix these warnings, as the codegen remains same
>>>> with unreachable() and __builtin_unreachable().
>>>
>>> I think it is necessary to explain why using unreachable() is not
>>> necessary for powerpc, or even why using unreachable() is wrong.
>>>
>>> Allthough we are getting rid of the problem here by replacing
>>> unreachable() by __builtin_unreachable(), it might still be a problem
>>> in core parts of kernel which still use unreachable.
>>
>> I did a kernel build with this series applied, with a variant of
>> ppc64le_defconfig. I then did another build with the same config, but
>> with the below hunk to disable objtool:
>>
>> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
>> index 6be2e68fa9eb64..4c466acdc70d4c 100644
>> --- a/arch/powerpc/Kconfig
>> +++ b/arch/powerpc/Kconfig
>> @@ -237,8 +237,6 @@ config PPC
>> select HAVE_MOD_ARCH_SPECIFIC
>> select HAVE_NMI if PERF_EVENTS || (PPC64
>> && PPC_BOOK3S)
>> select HAVE_OPTPROBES
>> - select HAVE_OBJTOOL if PPC32 || MPROFILE_KERNEL
>> - select HAVE_OBJTOOL_MCOUNT if HAVE_OBJTOOL
>> select HAVE_PERF_EVENTS
>> select HAVE_PERF_EVENTS_NMI if PPC64
>> select HAVE_PERF_REGS
>>
>> This has the effect of disabling annotations for unreachable().
>>
>> When I compared the resulting object files, I did not see changes in
>> codegen relating to the annotation, like we do with using unreachable()
>> in __WARN_FLAGS().
>>
>> More specifically, arch/powerpc/kvm/book3s.o:kvmppc_h_logical_ci_load()
>> uses BUG(), and the generated code remains the same with/without the
>> unreachable() annotation.
>>
>> This suggests that the bad codegen we are seeing with the annotation in
>> unreachable() is limited to its use in __WARN_FLAGS(), which I suspect
>> is due to an interaction with the use of asm_volatile_goto() for
>> WARN_ENTRY().
>>
>> If I revert this patch (patch 01/16), gcc seems to add a label 8 bytes
>> before _some_ function in this object file, which happens to hold a
>> relocation against .TOC., and emits a bl to that symbol. Otherwise, gcc
>> either emits no new instruction for the annotation, or a 'nop' in some
>> cases.
>>
>> If I add a 'nop' between WARN_ENTRY() and unreachable() in
>> __WARN_FLAGS(), or convert WARN_ENTRY to BUG_ENTRY thereby removing use
>> of asm_volatile_goto(), the problem goes away and no bl is emitted:
>>
>> diff --git a/arch/powerpc/include/asm/bug.h
>> b/arch/powerpc/include/asm/bug.h
>> index 61a4736355c244..88e0027c20ba5c 100644
>> --- a/arch/powerpc/include/asm/bug.h
>> +++ b/arch/powerpc/include/asm/bug.h
>> @@ -99,6 +99,7 @@
>> __label__ __label_warn_on; \
>> \
>> WARN_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags),
>> __label_warn_on); \
>> + __asm__ __volatile__("nop"); \
>> unreachable(); \
>> \
>> __label_warn_on:
>>
>>
>> In summary, I think the annotation itself is fine and we are only seeing
>> an issue with its usage after WARN_ENTRY() due to use of
>> asm_volatile_goto. Other uses of unreachable() don't seem to exhibit
>> this problem.
>>
>> As such, I think this patch is appropriate for this series, though I
>> think we should capture some of this information in the changelog.
>>
>> Note also that if and when we start utlizing the annotation, if we
>> classify twui as INSN_BUG, this change will continue to be appropriate.
>>
>
> INSN_TRAP instead of INSN_BUG ?
INSN_BUG, in line with your suggestion here:
http://lkml.kernel.org/r/ff623097-9f18-3914-5eae-bc6e4cd1510f@csgroup.eu
Peter was of the opinion that INSN_TRAP may not be what we want:
http://lkml.kernel.org/r/YsLSU6idNME/BtwH@hirez.programming.kicks-ass.net
If we classify twui as INSN_BUG, then objtool will know to stop control
flow here without the need for an annotation. Parsing extable will
then show that control flow continues with the label subsequently.
- Naveen
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON()
2022-08-08 11:48 ` [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON() Sathvika Vasireddy
2022-08-10 8:28 ` Christophe Leroy
@ 2022-08-26 10:18 ` Christophe Leroy
2022-08-29 5:46 ` Sathvika Vasireddy
1 sibling, 1 reply; 32+ messages in thread
From: Christophe Leroy @ 2022-08-26 10:18 UTC (permalink / raw)
To: Sathvika Vasireddy, linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo, rostedt, mbenes,
npiggin, chenzhongjin, linux-arm-kernel, naveen.n.rao
Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
> objtool is throwing *unannotated intra-function call*
> warnings with a few instructions that are marked
> unreachable. Replace unreachable() with __builtin_unreachable()
> to fix these warnings, as the codegen remains same
> with unreachable() and __builtin_unreachable().
>
> Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
> ---
> arch/powerpc/include/asm/bug.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/include/asm/bug.h b/arch/powerpc/include/asm/bug.h
> index 61a4736355c2..074be1a78c56 100644
> --- a/arch/powerpc/include/asm/bug.h
> +++ b/arch/powerpc/include/asm/bug.h
> @@ -99,7 +99,7 @@
> __label__ __label_warn_on; \
> \
> WARN_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags), __label_warn_on); \
> - unreachable(); \
> + __builtin_unreachable(); \
Should you add barrier_before_unreachable() before
__builtin_unreachable() to avoid stack bombs ?
See commit 173a3efd3edb ("bug.h: work around GCC PR82365 in BUG()")
> \
> __label_warn_on: \
> break; \
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON()
2022-08-26 10:18 ` Christophe Leroy
@ 2022-08-29 5:46 ` Sathvika Vasireddy
0 siblings, 0 replies; 32+ messages in thread
From: Sathvika Vasireddy @ 2022-08-29 5:46 UTC (permalink / raw)
To: Christophe Leroy, Sathvika Vasireddy, linuxppc-dev
Cc: jpoimboe, peterz, linux-kernel, aik, mpe, mingo, rostedt, mbenes,
npiggin, chenzhongjin, linux-arm-kernel, naveen.n.rao
Hi Christophe,
On 26/08/22 15:48, Christophe Leroy wrote:
>
> Le 08/08/2022 à 13:48, Sathvika Vasireddy a écrit :
>> objtool is throwing *unannotated intra-function call*
>> warnings with a few instructions that are marked
>> unreachable. Replace unreachable() with __builtin_unreachable()
>> to fix these warnings, as the codegen remains same
>> with unreachable() and __builtin_unreachable().
>>
>> Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com>
>> ---
>> arch/powerpc/include/asm/bug.h | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/arch/powerpc/include/asm/bug.h b/arch/powerpc/include/asm/bug.h
>> index 61a4736355c2..074be1a78c56 100644
>> --- a/arch/powerpc/include/asm/bug.h
>> +++ b/arch/powerpc/include/asm/bug.h
>> @@ -99,7 +99,7 @@
>> __label__ __label_warn_on; \
>> \
>> WARN_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags), __label_warn_on); \
>> - unreachable(); \
>> + __builtin_unreachable(); \
> Should you add barrier_before_unreachable() before
> __builtin_unreachable() to avoid stack bombs ?
>
> See commit 173a3efd3edb ("bug.h: work around GCC PR82365 in BUG()")
Yes, adding barrier_before_unreachable() before __builtin_unreachable()
works around the build issues reported at
https://lkml.org/lkml/2022/8/25/418.
I'll post a v2 with this change.
Thanks for the suggestion!
- Sathvika
^ permalink raw reply [flat|nested] 32+ messages in thread
end of thread, other threads:[~2022-08-29 5:47 UTC | newest]
Thread overview: 32+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-08 11:48 [PATCH 00/16] objtool: Enable and implement --mcount option on powerpc Sathvika Vasireddy
2022-08-08 11:48 ` [PATCH 01/16] powerpc: Replace unreachable() with it's builtin variant in WARN_ON() Sathvika Vasireddy
2022-08-10 8:28 ` Christophe Leroy
2022-08-18 10:46 ` Naveen N. Rao
2022-08-18 11:06 ` Christophe Leroy
2022-08-18 12:25 ` Naveen N. Rao
2022-08-26 10:18 ` Christophe Leroy
2022-08-29 5:46 ` Sathvika Vasireddy
2022-08-08 11:48 ` [PATCH 02/16] powerpc: override __ALIGN() and __ALIGN_STR() macros Sathvika Vasireddy
2022-08-10 8:31 ` Christophe Leroy
2022-08-18 10:46 ` Sathvika Vasireddy
2022-08-08 11:48 ` [PATCH 03/16] powerpc: Fix objtool unannotated intra-function call warnings Sathvika Vasireddy
2022-08-10 8:32 ` Christophe Leroy
2022-08-18 10:55 ` Sathvika Vasireddy
2022-08-08 11:48 ` [PATCH 04/16] powerpc: curb " Sathvika Vasireddy
2022-08-08 11:48 ` [PATCH 05/16] powerpc: Skip objtool from running on drivers/crypto/vmx/aesp8-ppc.o Sathvika Vasireddy
2022-08-10 8:34 ` Christophe Leroy
2022-08-18 11:12 ` Sathvika Vasireddy
2022-08-08 11:48 ` [PATCH 06/16] powerpc: Fix objtool unannotated intra-function call warnings on PPC32 Sathvika Vasireddy
2022-08-09 23:31 ` kernel test robot
2022-08-08 11:48 ` [PATCH 07/16] powerpc: Skip objtool from running on VDSO files Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 08/16] objtool: Fix SEGFAULT Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 09/16] objtool: Use target file endianness instead of a compiled constant Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 10/16] objtool: Use target file class size " Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 11/16] objtool: Add --mnop as an option to --mcount Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 12/16] objtool: Read special sections with alts only when specific options are selected Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 13/16] objtool: Use macros to define arch specific reloc types Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 14/16] objtool: Add arch specific function arch_ftrace_match() Sathvika Vasireddy
2022-08-12 10:58 ` kernel test robot
2022-08-13 13:48 ` kernel test robot
2022-08-08 11:49 ` [PATCH 15/16] objtool/powerpc: Enable objtool to be built on ppc Sathvika Vasireddy
2022-08-08 11:49 ` [PATCH 16/16] objtool/powerpc: Add --mcount specific implementation Sathvika Vasireddy
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).