2022-09-12 09:10:10

by Sathvika Vasireddy

[permalink] [raw]
Subject: [PATCH v3 00/16] objtool: Enable and implement --mcount option on powerpc

This patchset enables and implements objtool --mcount
option on powerpc. This applies atop powerpc/merge branch.

Changelog:

v3:

* Patch 01/16 - Rework patch subject.
- Rework changelog.
- Add Reviewed-by tag from Christophe Leroy.

* Patch 02/16 - Rework changelog to update details based on feedback
from Nicholas Piggin and Michael Ellerman.
- Use quotes instead of __stringify macro, based on
suggestion from Christophe Leroy.

* Patch 03/16 - Add Reviewed-by tag from Christophe Leroy.
- Based on Christophe's suggestion, keep all <linux/...>
before <asm/...>.
- Rework changelog.

* Patch 04/16 - Add Reviewed-by tag from Christophe Leroy.

* Patch 05/16 - Add Reviewed-by tag from Christophe Leroy.

* Patch 06/16 - No change.

* Patch 07/16 - Add Reviewed-by tag from Christophe Leroy.

* Patch 08/16 - Add Acked-by tag from Peter Zijlstra.

* Patch 09/16 - Add Acked-by tag from Peter Zijlstra.

* Patch 10/16 - Reorder local variable declarations to use reverse
xmas tree format.
- Add Signed-off-by tag from Sathvika Vasireddy indicating
changes done.
- Add Acked-by tag from Peter Zijlstra.

* Patch 11/16 - Update changelog to indicate that powerpc kernel does
not support nop'ed out ftrace locations.
- Add Acked-by tag from Peter Zijlstra.
- Add Reviewed-by tag from Christophe Leroy.

* Patch 12/16 - Per Christophe's comment, rework changelog.

* Patch 13/16 - Add Acked-by tag from Peter Zijlstra.
- Add Reviewed-by tag from Christophe Leroy.

* Patch 14/16 - Simplify arch_ftrace_match() function, based on
Christophe's suggestion.
- Add Reviewed-by tag from Christophe Leroy.

* Patch 15/16 - Include code from Christophe Leroy to use local vars for
type and imm, and to adapt len for prefixed
instructions.

* Patch 16/16 - Based on suggestion from Christophe Leroy, setup
immediate value calculation outside the check for
specific instruction under case 18.
- Set instruction type to INSN_CALL for 'bla'
instruction as well.

v2:

* Change subject of patch 01/16
* As suggested by Christophe Leroy, add barrier_before_unreachable()
before __builtin_unreachable() to work around a gcc problem.
* Fix issues reported by Kernel Test Robot.
* Include suggestions from Christophe Leroy, and change commit
messages for patches 01/16, 02/16, 03/16, 05/16.

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: Fix __WARN_FLAGS() for use with Objtool
powerpc: Override __ALIGN and __ALIGN_STR macros
powerpc: Fix objtool unannotated intra-function call warnings
powerpc: Curb objtool unannotated intra-function 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 | 3 +-
arch/powerpc/include/asm/linkage.h | 3 +
arch/powerpc/kernel/cpu_setup_6xx.S | 26 +++--
arch/powerpc/kernel/cpu_setup_fsl_booke.S | 8 +-
arch/powerpc/kernel/entry_32.S | 9 +-
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 | 101 ++++++++++++++++++
.../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 | 5 +
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 | 53 ++++-----
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, 411 insertions(+), 107 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


2022-09-12 09:13:07

by Sathvika Vasireddy

[permalink] [raw]
Subject: [PATCH v3 09/16] objtool: Use target file endianness instead of a compiled constant

From: Christophe Leroy <[email protected]>

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.

Acked-by: Peter Zijlstra (Intel) <[email protected]>
Signed-off-by: Christophe Leroy <[email protected]>
---
.../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 fe935f19447b..c36e7a020d80 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -2077,7 +2077,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

2022-09-12 09:47:27

by Sathvika Vasireddy

[permalink] [raw]
Subject: [PATCH v3 07/16] powerpc: Skip objtool from running on VDSO files

Do not run objtool on VDSO files, by using OBJECT_FILES_NON_STANDARD.

Suggested-by: Christophe Leroy <[email protected]>
Reviewed-by: Christophe Leroy <[email protected]>
Signed-off-by: Sathvika Vasireddy <[email protected]>
---
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

2022-09-13 16:34:46

by Peter Zijlstra

[permalink] [raw]
Subject: Re: [PATCH v3 00/16] objtool: Enable and implement --mcount option on powerpc

On Mon, Sep 12, 2022 at 01:50:04PM +0530, Sathvika Vasireddy wrote:
> 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

> Sathvika Vasireddy (12):
> 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

> tools/objtool/arch/powerpc/Build | 2 +
> tools/objtool/arch/powerpc/decode.c | 101 ++++++++++++++++++
> .../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 | 5 +
> 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 | 53 ++++-----
> 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 +-

This seems to painlessly merge with the objtool changes I have in
queue.git/call-depth-tracking. After that all I need is the below little
patch to make it to build ppc44x_defconfig + CONFIG_DYNAMIC_FTRACE=y.

So I think these patches can go through the powerpc tree if Michael
wants. Josh you okay with that, or should we do something complicated?

diff --git a/tools/objtool/arch/powerpc/decode.c b/tools/objtool/arch/powerpc/decode.c
index ea2b1968f0ee..8343e2c4cea0 100644
--- a/tools/objtool/arch/powerpc/decode.c
+++ b/tools/objtool/arch/powerpc/decode.c
@@ -24,6 +24,11 @@ bool arch_callee_saved_reg(unsigned char reg)
return false;
}

+bool arch_pc_relative_reloc(struct reloc *reloc)
+{
+ exit(-1);
+}
+
int arch_decode_hint_reg(u8 sp_reg, int *base)
{
exit(-1);

2022-09-14 00:43:33

by Josh Poimboeuf

[permalink] [raw]
Subject: Re: [PATCH v3 00/16] objtool: Enable and implement --mcount option on powerpc

On Tue, Sep 13, 2022 at 04:13:52PM +0200, Peter Zijlstra wrote:
> On Mon, Sep 12, 2022 at 01:50:04PM +0530, Sathvika Vasireddy wrote:
> > 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
>
> > Sathvika Vasireddy (12):
> > 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
>
> > tools/objtool/arch/powerpc/Build | 2 +
> > tools/objtool/arch/powerpc/decode.c | 101 ++++++++++++++++++
> > .../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 | 5 +
> > 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 | 53 ++++-----
> > 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 +-
>
> This seems to painlessly merge with the objtool changes I have in
> queue.git/call-depth-tracking. After that all I need is the below little
> patch to make it to build ppc44x_defconfig + CONFIG_DYNAMIC_FTRACE=y.
>
> So I think these patches can go through the powerpc tree if Michael
> wants. Josh you okay with that, or should we do something complicated?

I'm all for avoiding complicated, but let me try to give it a proper
review first.

--
Josh

2022-09-21 09:14:40

by Sathvika Vasireddy

[permalink] [raw]
Subject: Re: [PATCH v3 00/16] objtool: Enable and implement --mcount option on powerpc

Hi Josh,

On 14/09/22 05:45, Josh Poimboeuf wrote:

> On Tue, Sep 13, 2022 at 04:13:52PM +0200, Peter Zijlstra wrote:
>> On Mon, Sep 12, 2022 at 01:50:04PM +0530, Sathvika Vasireddy wrote:
>>> 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
>>> Sathvika Vasireddy (12):
>>> 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
>>> tools/objtool/arch/powerpc/Build | 2 +
>>> tools/objtool/arch/powerpc/decode.c | 101 ++++++++++++++++++
>>> .../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 | 5 +
>>> 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 | 53 ++++-----
>>> 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 +-
>> This seems to painlessly merge with the objtool changes I have in
>> queue.git/call-depth-tracking. After that all I need is the below little
>> patch to make it to build ppc44x_defconfig + CONFIG_DYNAMIC_FTRACE=y.
>>
>> So I think these patches can go through the powerpc tree if Michael
>> wants. Josh you okay with that, or should we do something complicated?
> I'm all for avoiding complicated, but let me try to give it a proper
> review first.

Did you get a chance to review this patch set?

- Sathvika