Re: [PATCH v4 16/16] objtool/powerpc: Add --mcount specific implementation
Le 02/10/2022 à 12:42, Sathvika Vasireddy a écrit : > This patch enables objtool --mcount on powerpc, and adds implementation > specific to powerpc. > > Signed-off-by: Sathvika Vasireddy Reviewed-by: Christophe Leroy > --- > arch/powerpc/Kconfig | 1 + > tools/objtool/arch/powerpc/decode.c | 16 > tools/objtool/arch/powerpc/include/arch/elf.h | 2 ++ > 3 files changed, 19 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 dcd0975cad6b..01cade98b49e 100644 > --- a/tools/objtool/arch/powerpc/decode.c > +++ b/tools/objtool/arch/powerpc/decode.c > @@ -9,6 +9,11 @@ > #include > #include > > +int arch_ftrace_match(char *name) > +{ > + return !strcmp(name, "_mcount"); > +} > + > unsigned long arch_dest_reloc_offset(int addend) > { > return addend; > @@ -50,6 +55,17 @@ int arch_decode_instruction(struct objtool_file *file, > const struct section *sec > typ = INSN_OTHER; > imm = 0; > > + switch (opcode) { > + case 18: /* b[l][a] */ > + if ((insn & 3) == 1) /* bl */ > + typ = INSN_CALL; > + > + imm = insn & 0x3fc; > + if (imm & 0x200) > + imm -= 0x400; > + break; > + } > + > if (opcode == 1) > *len = 8; > else > 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 */
Re: [PATCH v4 12/16] objtool: Read special sections with alts only when specific options are selected
Le 02/10/2022 à 12:42, Sathvika Vasireddy a écrit : > Call add_special_section_alts() only when stackval or orc or uaccess or > noinstr options are passed to objtool. > > Signed-off-by: Sathvika Vasireddy Reviewed-by: Christophe Leroy > --- > 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 35827e6c6df9..c6457dac6d58 100644 > --- a/tools/objtool/check.c > +++ b/tools/objtool/check.c > @@ -2372,9 +2372,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)
Re: [PATCH v4 02/16] powerpc: Override __ALIGN and __ALIGN_STR macros
Le 02/10/2022 à 12:42, Sathvika Vasireddy a écrit : > In a subsequent patch, we would want to annotate powerpc assembly functions > with SYM_FUNC_START_LOCAL macro. This macro depends on __ALIGN macro. > > The default expansion of __ALIGN macro is: > #define __ALIGN .align 4,0x90 > > So, override __ALIGN and __ALIGN_STR macros to use the same alignment as > that of the existing _GLOBAL macro. Also, do not pad with 0x90, because > repeated 0x90s are not a nop or trap on powerpc. > > Signed-off-by: Sathvika Vasireddy Reviewed-by: Christophe Leroy > --- > arch/powerpc/include/asm/linkage.h | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/arch/powerpc/include/asm/linkage.h > b/arch/powerpc/include/asm/linkage.h > index b71b9582e754..b88d1d2cf304 100644 > --- a/arch/powerpc/include/asm/linkage.h > +++ b/arch/powerpc/include/asm/linkage.h > @@ -4,6 +4,9 @@ > > #include > > +#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" \
Re: [PATCH v4 11/16] objtool: Add --mnop as an option to --mcount
Le 02/10/2022 à 12:42, Sathvika Vasireddy a écrit : > Some architectures (powerpc) may not support ftrace locations being nop'ed > out at build time. Introduce CONFIG_HAVE_OBJTOOL_NOP_MCOUNT for objtool, as > a means for architectures to enable nop'ing of ftrace locations. Add --mnop > as an option to objtool --mcount, to indicate support for the same. > > Also, make sure that --mnop can be passed as an option to objtool only when > --mcount is passed. > > Signed-off-by: Sathvika Vasireddy Reviewed-by: Christophe Leroy > --- > Makefile| 4 +++- > arch/x86/Kconfig| 1 + > kernel/trace/Kconfig| 7 +++ > scripts/Makefile.lib| 1 + > tools/objtool/builtin-check.c | 14 ++ > tools/objtool/check.c | 19 ++- > tools/objtool/include/objtool/builtin.h | 1 + > 7 files changed, 37 insertions(+), 10 deletions(-) > > diff --git a/Makefile b/Makefile > index a5e9d9388649..b2230ad14748 100644 > --- a/Makefile > +++ b/Makefile > @@ -857,7 +857,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_OBJTOOL_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..2a79a05c4402 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_OBJTOOL_NOP_MCOUNT if HAVE_OBJTOOL_MCOUNT > select HAVE_BUILDTIME_MCOUNT_SORT > select HAVE_DEBUG_KMEMLEAK > select HAVE_DMA_CONTIGUOUS > diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig > index 1052126bdca2..9c696cb24756 100644 > --- a/kernel/trace/Kconfig > +++ b/kernel/trace/Kconfig > @@ -76,6 +76,13 @@ config HAVE_OBJTOOL_MCOUNT > help > Arch supports objtool --mcount > > +config HAVE_OBJTOOL_NOP_MCOUNT > + bool > + help > + Arch supports the objtool options --mcount with --mnop. > + An architecture can select this if it wants to enable nop'ing > + of ftrace locations. > + > config HAVE_C_RECORDMCOUNT > bool > help > diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib > index 3fb6a99e78c4..ce14e3b8577f 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_OBJTOOL_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 738de23cb9e8..35827e6c6df9 100644 > --- a/tools/objtool/check.c > +++ b/tools/objtool/check.c > @@ -1233,
Re: [PATCH v2] i2c/pasemi: PASemi I2C controller IRQ enablement
On 02 October 2022 at 00:25 am, Arminder Singh wrote: Hello, This is v2 of the PASemi I2C controller IRQ enablement patch. This patch adds IRQ support to the PASemi I2C controller driver to increase the performace of I2C transactions on platforms with PASemi I2C controllers. While the patch is primarily intended for Apple silicon platforms, this patch should also help in enabling IRQ support for older PASemi hardware as well should the need arise. This version of the patch has been tested on an M1 Ultra Mac Studio, as well as an M1 MacBook Pro, and userspace launches successfully while using the IRQ path for I2C transactions. Tested-by: Arminder Singh Signed-off-by: Arminder Singh --- Changes from v1: - moved completion setup from pasemi_platform_i2c_probe to pasemi_i2c_common_probe to allow PASemi and Apple platforms to share common completion setup code in case PASemi hardware gets IRQ support added - initialized the status variable in pasemi_smb_waitready when going down the non-IRQ path - removed an unnecessary cast of dev_id in the IRQ handler - fixed alignment of struct member names in i2c-pasemi-core.h (addresses Christophe's feedback in the original submission) - IRQs are now disabled after the wait_for_completion_timeout call instead of inside the IRQ handler (prevents the IRQ from going off after the completion times out) - changed the request_irq call to a devm_request_irq call to obviate the need for a remove function and a free_irq call (thanks to Sven for pointing this out in the original submission) - added a reinit_completion call to pasemi_reset as a failsafe to prevent missed interrupts from causing the completion to never complete (thanks to Arnd Bergmann for pointing this out) - removed the bitmask variable in favor of just using the value directly (it wasn't used anywhere else) v1 linked here: https://lore.kernel.org/linux-i2c/mn2pr01mb535838492432c910f2381f929f...@mn2pr01mb5358.prod.exchangelabs.com/T/#m11b3504c2667517aad7521514c99ca0e07a9381f Thanks for all the feedback on the previous submission, I'm sorry I wasn't able to answer everyone's emails, was just pretty busy, I'll make sure to be more responsive this time around! Also wasn't sure whether the v1 changelog belonged before or after the '---' so I put it after to keep the commit changelog short and concise. (This is just one patch, didn't think it needed a cover letter) drivers/i2c/busses/i2c-pasemi-core.c | 29 drivers/i2c/busses/i2c-pasemi-core.h | 7 +- drivers/i2c/busses/i2c-pasemi-platform.c | 6 + 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/drivers/i2c/busses/i2c-pasemi-core.c b/drivers/i2c/busses/i2c-pasemi-core.c index 9028ffb58cc0..05af8f3575bc 100644 --- a/drivers/i2c/busses/i2c-pasemi-core.c +++ b/drivers/i2c/busses/i2c-pasemi-core.c @@ -21,6 +21,7 @@ #define REG_MTXFIFO 0x00 #define REG_MRXFIFO 0x04 #define REG_SMSTA 0x14 +#define REG_IMASK 0x18 #define REG_CTL 0x1c #define REG_REV 0x28 @@ -66,6 +67,7 @@ static void pasemi_reset(struct pasemi_smbus *smbus) val |= CTL_EN; reg_write(smbus, REG_CTL, val); + reinit_completion(&smbus->irq_completion); } static void pasemi_smb_clear(struct pasemi_smbus *smbus) @@ -81,11 +83,18 @@ static int pasemi_smb_waitready(struct pasemi_smbus *smbus) int timeout = 10; unsigned int status; - status = reg_read(smbus, REG_SMSTA); - - while (!(status & SMSTA_XEN) && timeout--) { - msleep(1); + if (smbus->use_irq) { + reinit_completion(&smbus->irq_completion); + reg_write(smbus, REG_IMASK, SMSTA_XEN | SMSTA_MTN); + wait_for_completion_timeout(&smbus->irq_completion, msecs_to_jiffies(10)); + reg_write(smbus, REG_IMASK, 0); status = reg_read(smbus, REG_SMSTA); + } else { + status = reg_read(smbus, REG_SMSTA); + while (!(status & SMSTA_XEN) && timeout--) { + msleep(1); + status = reg_read(smbus, REG_SMSTA); + } } /* Got NACK? */ @@ -344,10 +353,14 @@ int pasemi_i2c_common_probe(struct pasemi_smbus *smbus) /* set up the sysfs linkage to our parent device */ smbus->adapter.dev.parent = smbus->dev; + smbus->use_irq = 0; + init_completion(&smbus->irq_completion); if (smbus->hw_rev != PASEMI_HW_REV_PCI) smbus->hw_rev = reg_read(smbus, REG_REV); + reg_write(smbus, REG_IMASK, 0); + pasemi_reset(smbus); error = devm_i2c_add_adapter(smbus->dev, &smbus->adapter); @@ -356,3 +369,11 @@ int pasemi_i2c_common_probe(struct pasemi_smbus *smbus) return 0; } + +irqreturn_t pasemi_irq_handler(int irq, void *dev_id) +{ + struct pasemi_smbus *smbus = dev_id; + + complete
Re: [PATCH v2] i2c-pasemi: PASemi I2C controller IRQ enablement
Hi, On Sun, Oct 2, 2022, at 16:07, Arminder Singh wrote: > Hi, > >> #define REG_MTXFIFO 0x00 >> #define REG_MRXFIFO 0x04 >> #define REG_SMSTA 0x14 >> +#define REG_IMASK 0x18 > >> This doesn't seem to be aligned correctly, this file seems to use a tab >> to separate the register name and the offset and you used spaces here. > >> @@ -15,7 +16,11 @@ struct pasemi_smbus { >> struct i2c_adapter adapter; >> void __iomem*ioaddr; >> unsigned int clk_div; >> -int hw_rev; >> +int hw_rev; >> +int use_irq; >> +struct completionirq_completion; > >> This doesn't seem to be aligned correctly and the hw_rev line >> doesn't have to be changed. > > I'm sorry for the alignment issues in the patch, I genuinely didn't notice > them as from the perspective of my primary editor (Visual Studio Code) > the entries were aligned. I just saw them when opening the files in > nano. No worries, it's just a small nit and quickly fixed after all! :) > > Does fixing the alignment issues and the commit description justify a v3 > of the patch or should the minor fixes go out as a "resend"? Just not sure > in this particular case as the fixes seem to be very minor ones. I'd send a v3. I've only used resend when e.g. my previous mail provider messed up and silently converted all my outgoing mails to HTML. Best, Sven
Re: [PATCH v2] i2c-pasemi: PASemi I2C controller IRQ enablement
Hi, > #define REG_MTXFIFO 0x00 > #define REG_MRXFIFO 0x04 > #define REG_SMSTA0x14 > +#define REG_IMASK 0x18 > This doesn't seem to be aligned correctly, this file seems to use a tab > to separate the register name and the offset and you used spaces here. > @@ -15,7 +16,11 @@ struct pasemi_smbus { > struct i2c_adapter adapter; > void __iomem*ioaddr; > unsigned int clk_div; > - int hw_rev; > + int hw_rev; > + int use_irq; > + struct completionirq_completion; > This doesn't seem to be aligned correctly and the hw_rev line > doesn't have to be changed. I'm sorry for the alignment issues in the patch, I genuinely didn't notice them as from the perspective of my primary editor (Visual Studio Code) the entries were aligned. I just saw them when opening the files in nano. Does fixing the alignment issues and the commit description justify a v3 of the patch or should the minor fixes go out as a "resend"? Just not sure in this particular case as the fixes seem to be very minor ones. Thanks, Arminder
[PATCH v2] i2c/pasemi: PASemi I2C controller IRQ enablement
Hello, This is v2 of the PASemi I2C controller IRQ enablement patch. This patch adds IRQ support to the PASemi I2C controller driver to increase the performace of I2C transactions on platforms with PASemi I2C controllers. While the patch is primarily intended for Apple silicon platforms, this patch should also help in enabling IRQ support for older PASemi hardware as well should the need arise. This version of the patch has been tested on an M1 Ultra Mac Studio, as well as an M1 MacBook Pro, and userspace launches successfully while using the IRQ path for I2C transactions. Tested-by: Arminder Singh Signed-off-by: Arminder Singh --- Changes from v1: - moved completion setup from pasemi_platform_i2c_probe to pasemi_i2c_common_probe to allow PASemi and Apple platforms to share common completion setup code in case PASemi hardware gets IRQ support added - initialized the status variable in pasemi_smb_waitready when going down the non-IRQ path - removed an unnecessary cast of dev_id in the IRQ handler - fixed alignment of struct member names in i2c-pasemi-core.h (addresses Christophe's feedback in the original submission) - IRQs are now disabled after the wait_for_completion_timeout call instead of inside the IRQ handler (prevents the IRQ from going off after the completion times out) - changed the request_irq call to a devm_request_irq call to obviate the need for a remove function and a free_irq call (thanks to Sven for pointing this out in the original submission) - added a reinit_completion call to pasemi_reset as a failsafe to prevent missed interrupts from causing the completion to never complete (thanks to Arnd Bergmann for pointing this out) - removed the bitmask variable in favor of just using the value directly (it wasn't used anywhere else) v1 linked here: https://lore.kernel.org/linux-i2c/mn2pr01mb535838492432c910f2381f929f...@mn2pr01mb5358.prod.exchangelabs.com/T/#m11b3504c2667517aad7521514c99ca0e07a9381f Thanks for all the feedback on the previous submission, I'm sorry I wasn't able to answer everyone's emails, was just pretty busy, I'll make sure to be more responsive this time around! Also wasn't sure whether the v1 changelog belonged before or after the '---' so I put it after to keep the commit changelog short and concise. (This is just one patch, didn't think it needed a cover letter) drivers/i2c/busses/i2c-pasemi-core.c | 29 drivers/i2c/busses/i2c-pasemi-core.h | 7 +- drivers/i2c/busses/i2c-pasemi-platform.c | 6 + 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/drivers/i2c/busses/i2c-pasemi-core.c b/drivers/i2c/busses/i2c-pasemi-core.c index 9028ffb58cc0..05af8f3575bc 100644 --- a/drivers/i2c/busses/i2c-pasemi-core.c +++ b/drivers/i2c/busses/i2c-pasemi-core.c @@ -21,6 +21,7 @@ #define REG_MTXFIFO0x00 #define REG_MRXFIFO0x04 #define REG_SMSTA 0x14 +#define REG_IMASK 0x18 #define REG_CTL0x1c #define REG_REV0x28 @@ -66,6 +67,7 @@ static void pasemi_reset(struct pasemi_smbus *smbus) val |= CTL_EN; reg_write(smbus, REG_CTL, val); + reinit_completion(&smbus->irq_completion); } static void pasemi_smb_clear(struct pasemi_smbus *smbus) @@ -81,11 +83,18 @@ static int pasemi_smb_waitready(struct pasemi_smbus *smbus) int timeout = 10; unsigned int status; - status = reg_read(smbus, REG_SMSTA); - - while (!(status & SMSTA_XEN) && timeout--) { - msleep(1); + if (smbus->use_irq) { + reinit_completion(&smbus->irq_completion); + reg_write(smbus, REG_IMASK, SMSTA_XEN | SMSTA_MTN); + wait_for_completion_timeout(&smbus->irq_completion, msecs_to_jiffies(10)); + reg_write(smbus, REG_IMASK, 0); status = reg_read(smbus, REG_SMSTA); + } else { + status = reg_read(smbus, REG_SMSTA); + while (!(status & SMSTA_XEN) && timeout--) { + msleep(1); + status = reg_read(smbus, REG_SMSTA); + } } /* Got NACK? */ @@ -344,10 +353,14 @@ int pasemi_i2c_common_probe(struct pasemi_smbus *smbus) /* set up the sysfs linkage to our parent device */ smbus->adapter.dev.parent = smbus->dev; + smbus->use_irq = 0; + init_completion(&smbus->irq_completion); if (smbus->hw_rev != PASEMI_HW_REV_PCI) smbus->hw_rev = reg_read(smbus, REG_REV); + reg_write(smbus, REG_IMASK, 0); + pasemi_reset(smbus); error = devm_i2c_add_adapter(smbus->dev, &smbus->adapter); @@ -356,3 +369,11 @@ int pasemi_i2c_common_probe(struct pasemi_smbus *smbus) return 0; } + +irqreturn_t pasemi_irq_handler(int irq, void *dev_id) +{ + struct pasemi_smbus *smbus = dev_id; + + complete(&smbus->irq_completion); + return IRQ_HANDLED; +}
Re: [PATCH v2] i2c/pasemi: PASemi I2C controller IRQ enablement
Hi, Looks almost good to me, just a few minor things: On Sun, Oct 2, 2022, at 00:25, Arminder Singh wrote: > Hello, > > This is v2 of the PASemi I2C controller IRQ enablement patch. This shouldn't be inside the commit description. > > This patch adds IRQ support to the PASemi I2C controller driver to > increase the performace of I2C transactions on platforms with PASemi I2C > controllers. While the patch is primarily intended for Apple silicon > platforms, this patch should also help in enabling IRQ support for > older PASemi hardware as well should the need arise. This is probably the only paragraph that should be the entire commit description. > > This version of the patch has been tested on an M1 Ultra Mac Studio, > as well as an M1 MacBook Pro, and userspace launches successfully > while using the IRQ path for I2C transactions. > > Tested-by: Arminder Singh I think it's usually implied that you tested your own patches ;) > Signed-off-by: Arminder Singh > --- > Changes from v1: > - moved completion setup from pasemi_platform_i2c_probe to >pasemi_i2c_common_probe to allow PASemi and Apple platforms to share >common completion setup code in case PASemi hardware gets IRQ support >added > - initialized the status variable in pasemi_smb_waitready when going down >the non-IRQ path > - removed an unnecessary cast of dev_id in the IRQ handler > - fixed alignment of struct member names in i2c-pasemi-core.h >(addresses Christophe's feedback in the original submission) > - IRQs are now disabled after the wait_for_completion_timeout call >instead of inside the IRQ handler >(prevents the IRQ from going off after the completion times out) > - changed the request_irq call to a devm_request_irq call to obviate >the need for a remove function and a free_irq call >(thanks to Sven for pointing this out in the original submission) > - added a reinit_completion call to pasemi_reset >as a failsafe to prevent missed interrupts from causing the completion >to never complete (thanks to Arnd Bergmann for pointing this out) > - removed the bitmask variable in favor of just using the value >directly (it wasn't used anywhere else) > > v1 linked here: > https://lore.kernel.org/linux-i2c/mn2pr01mb535838492432c910f2381f929f...@mn2pr01mb5358.prod.exchangelabs.com/T/#m11b3504c2667517aad7521514c99ca0e07a9381f > > Thanks for all the feedback on the previous submission, I'm sorry > I wasn't able to answer everyone's emails, was just pretty busy, I'll > make sure to be more responsive this time around! Also wasn't sure whether > the v1 changelog belonged before or after the '---' so I put it after > to keep the commit changelog short and concise. > (This is just one patch, didn't think it needed a cover letter) > > drivers/i2c/busses/i2c-pasemi-core.c | 29 > drivers/i2c/busses/i2c-pasemi-core.h | 7 +- > drivers/i2c/busses/i2c-pasemi-platform.c | 6 + > 3 files changed, 37 insertions(+), 5 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-pasemi-core.c > b/drivers/i2c/busses/i2c-pasemi-core.c > index 9028ffb58cc0..05af8f3575bc 100644 > --- a/drivers/i2c/busses/i2c-pasemi-core.c > +++ b/drivers/i2c/busses/i2c-pasemi-core.c > @@ -21,6 +21,7 @@ > #define REG_MTXFIFO 0x00 > #define REG_MRXFIFO 0x04 > #define REG_SMSTA0x14 > +#define REG_IMASK 0x18 This doesn't seem to be aligned correctly, this file seems to use a tab to separate the register name and the offset and you used spaces here. > #define REG_CTL 0x1c > #define REG_REV 0x28 > > @@ -66,6 +67,7 @@ static void pasemi_reset(struct pasemi_smbus *smbus) > val |= CTL_EN; > > reg_write(smbus, REG_CTL, val); > + reinit_completion(&smbus->irq_completion); > } > > static void pasemi_smb_clear(struct pasemi_smbus *smbus) > @@ -81,11 +83,18 @@ static int pasemi_smb_waitready(struct pasemi_smbus > *smbus) > int timeout = 10; > unsigned int status; > > - status = reg_read(smbus, REG_SMSTA); > - > - while (!(status & SMSTA_XEN) && timeout--) { > - msleep(1); > + if (smbus->use_irq) { > + reinit_completion(&smbus->irq_completion); > + reg_write(smbus, REG_IMASK, SMSTA_XEN | SMSTA_MTN); > + wait_for_completion_timeout(&smbus->irq_completion, > msecs_to_jiffies(10)); > + reg_write(smbus, REG_IMASK, 0); > status = reg_read(smbus, REG_SMSTA); > + } else { > + status = reg_read(smbus, REG_SMSTA); > + while (!(status & SMSTA_XEN) && timeout--) { > + msleep(1); > + status = reg_read(smbus, REG_SMSTA); > + } > } > > /* Got NACK? */ > @@ -344,10 +353,14 @@ int pasemi_i2c_common_probe(struct pasemi_smbus *smbus) > > /* set up the sysfs linkage to our parent device */ > smbus->adapter.dev.parent = smbus->dev; > + smbu
Re: [PATCH v2] i2c/pasemi: PASemi I2C controller IRQ enablement
Hi, some comments from me. Thanks for the patch and review! > > This version of the patch has been tested on an M1 Ultra Mac Studio, > > as well as an M1 MacBook Pro, and userspace launches successfully > > while using the IRQ path for I2C transactions. > > > > Tested-by: Arminder Singh > > I think it's usually implied that you tested your own patches ;) Yes, the tag is superfluous. The paragraph before is nice, though, to learn which testing has been applied. > > make sure to be more responsive this time around! Also wasn't sure whether > > the v1 changelog belonged before or after the '---' so I put it after > > to keep the commit changelog short and concise. > > (This is just one patch, didn't think it needed a cover letter) Both assumptions are correct. Happy hacking, Wolfram signature.asc Description: PGP signature
[PATCH v4 16/16] objtool/powerpc: Add --mcount specific implementation
This patch enables objtool --mcount on powerpc, and adds implementation specific to powerpc. Signed-off-by: Sathvika Vasireddy --- arch/powerpc/Kconfig | 1 + tools/objtool/arch/powerpc/decode.c | 16 tools/objtool/arch/powerpc/include/arch/elf.h | 2 ++ 3 files changed, 19 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 dcd0975cad6b..01cade98b49e 100644 --- a/tools/objtool/arch/powerpc/decode.c +++ b/tools/objtool/arch/powerpc/decode.c @@ -9,6 +9,11 @@ #include #include +int arch_ftrace_match(char *name) +{ + return !strcmp(name, "_mcount"); +} + unsigned long arch_dest_reloc_offset(int addend) { return addend; @@ -50,6 +55,17 @@ int arch_decode_instruction(struct objtool_file *file, const struct section *sec typ = INSN_OTHER; imm = 0; + switch (opcode) { + case 18: /* b[l][a] */ + if ((insn & 3) == 1) /* bl */ + typ = INSN_CALL; + + imm = insn & 0x3fc; + if (imm & 0x200) + imm -= 0x400; + break; + } + if (opcode == 1) *len = 8; else 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
[PATCH v4 15/16] objtool/powerpc: Enable objtool to be built on ppc
This patch adds [stub] implementations for required functions, inorder to enable objtool build on powerpc. Signed-off-by: Sathvika Vasireddy [Christophe Leroy: powerpc: Add missing asm/asm.h for objtool, Use local variables for type and imm in arch_decode_instruction(), Adapt len for prefixed instructions.] Signed-off-by: Christophe Leroy --- arch/powerpc/Kconfig | 1 + arch/powerpc/include/asm/asm.h| 7 ++ tools/objtool/arch/powerpc/Build | 2 + tools/objtool/arch/powerpc/decode.c | 85 +++ .../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, 154 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 ..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 ..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 ..dcd0975cad6b --- /dev/null +++ b/tools/objtool/arch/powerpc/decode.c @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include +#include +#include +#include +#include +#include +#include +#include + +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) +{ + unsigned int opcode; + enum insn_type typ; + unsigned long imm; + u32 insn; + + insn = bswap_if_needed(file->elf, *(u32 *)(sec->data->d_buf + offset)); + opcode = insn >> 26; + typ = INSN_OTHER; + imm = 0; + + if (opcode == 1) + *len = 8; + else + *len = 4; + + *type = typ; + *immediate = imm; + + 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 ..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/includ
[PATCH v4 14/16] objtool: Add arch specific function arch_ftrace_match()
Add architecture specific function to look for relocation records pointing to architecture specific symbols. Suggested-by: Christophe Leroy Reviewed-by: Christophe Leroy Signed-off-by: Sathvika Vasireddy --- tools/objtool/arch/x86/decode.c | 5 + tools/objtool/check.c| 2 +- tools/objtool/include/objtool/arch.h | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decode.c index c260006106be..28263e231c58 100644 --- a/tools/objtool/arch/x86/decode.c +++ b/tools/objtool/arch/x86/decode.c @@ -23,6 +23,11 @@ #include #include +int arch_ftrace_match(char *name) +{ + return !strcmp(name, "__fentry__"); +} + 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 35bcd4f90acd..856ea80b1cfc 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -2296,7 +2296,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..5149330f400f 100644 --- a/tools/objtool/include/objtool/arch.h +++ b/tools/objtool/include/objtool/arch.h @@ -69,6 +69,8 @@ struct stack_op { struct instruction; +int 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
[PATCH v4 13/16] objtool: Use macros to define arch specific reloc types
Make relocation types architecture specific. Acked-by: Peter Zijlstra (Intel) Reviewed-by: Christophe Leroy Signed-off-by: Sathvika Vasireddy --- 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 c6457dac6d58..35bcd4f90acd 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -885,7 +885,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
[PATCH v4 12/16] objtool: Read special sections with alts only when specific options are selected
Call add_special_section_alts() only when stackval or orc or uaccess or noinstr options are passed to objtool. Signed-off-by: Sathvika Vasireddy --- 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 35827e6c6df9..c6457dac6d58 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -2372,9 +2372,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
[PATCH v4 11/16] objtool: Add --mnop as an option to --mcount
Some architectures (powerpc) may not support ftrace locations being nop'ed out at build time. Introduce CONFIG_HAVE_OBJTOOL_NOP_MCOUNT for objtool, as a means for architectures to enable nop'ing of ftrace locations. Add --mnop as an option to objtool --mcount, to indicate support for the same. Also, make sure that --mnop can be passed as an option to objtool only when --mcount is passed. Signed-off-by: Sathvika Vasireddy --- Makefile| 4 +++- arch/x86/Kconfig| 1 + kernel/trace/Kconfig| 7 +++ scripts/Makefile.lib| 1 + tools/objtool/builtin-check.c | 14 ++ tools/objtool/check.c | 19 ++- tools/objtool/include/objtool/builtin.h | 1 + 7 files changed, 37 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index a5e9d9388649..b2230ad14748 100644 --- a/Makefile +++ b/Makefile @@ -857,7 +857,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_OBJTOOL_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..2a79a05c4402 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_OBJTOOL_NOP_MCOUNT if HAVE_OBJTOOL_MCOUNT select HAVE_BUILDTIME_MCOUNT_SORT select HAVE_DEBUG_KMEMLEAK select HAVE_DMA_CONTIGUOUS diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig index 1052126bdca2..9c696cb24756 100644 --- a/kernel/trace/Kconfig +++ b/kernel/trace/Kconfig @@ -76,6 +76,13 @@ config HAVE_OBJTOOL_MCOUNT help Arch supports objtool --mcount +config HAVE_OBJTOOL_NOP_MCOUNT + bool + help + Arch supports the objtool options --mcount with --mnop. + An architecture can select this if it wants to enable nop'ing + of ftrace locations. + config HAVE_C_RECORDMCOUNT bool help diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 3fb6a99e78c4..ce14e3b8577f 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_OBJTOOL_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 738de23cb9e8..35827e6c6df9 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -1233,17 +1233,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
[PATCH v4 10/16] objtool: Use target file class size instead of a compiled constant
From: Christophe Leroy 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. Acked-by: Peter Zijlstra (Intel) Signed-off-by: Christophe Leroy [Sathvika Vasireddy: Rename variable "size" to "addrsize" and function "elf_class_size()" to "elf_class_addrsize()", and modify create_mcount_loc_sections() function to follow reverse christmas tree format to order local variable declarations.] Signed-off-by: Sathvika Vasireddy --- tools/objtool/check.c | 18 ++ tools/objtool/elf.c | 8 ++-- tools/objtool/include/objtool/elf.h | 8 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/tools/objtool/check.c b/tools/objtool/check.c index c36e7a020d80..738de23cb9e8 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -852,9 +852,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; + int addrsize = elf_class_addrsize(file->elf); struct instruction *insn; + struct section *sec; int idx; sec = find_section_by_name(file->elf, "__mcount_loc"); @@ -871,23 +871,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
[PATCH v4 09/16] objtool: Use target file endianness instead of a compiled constant
From: Christophe Leroy 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) Signed-off-by: Christophe Leroy --- .../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.. --- 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 - -#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 #include #include - -#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 /* - * 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_getshd
[PATCH v4 08/16] objtool: Fix SEGFAULT
From: Christophe Leroy find_insn() will return NULL in case of failure. Check insn in order to avoid a kernel Oops for NULL pointer dereference. Acked-by: Peter Zijlstra (Intel) Signed-off-by: Christophe Leroy --- 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 e55fdf952a3a..fe935f19447b 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -207,7 +207,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
[PATCH v4 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 Reviewed-by: Christophe Leroy Signed-off-by: Sathvika Vasireddy --- 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 a2e7b0ce5b19..6a977b0d8ffc 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,$^) -z noexecstack ; $(cmd_vdso_check) quiet_cmd_vdso64as = VDSO64A $@ cmd_vdso64as = $(VDSOCC) $(a_flags) $(CC64FLAGS) $(AS64FLAGS) -c -o $@ $< + +OBJECT_FILES_NON_STANDARD := y -- 2.31.1
[PATCH v4 06/16] powerpc: Fix objtool unannotated intra-function call warnings on PPC32
From: Christophe Leroy Fix several annotations in assembly files on PPC32. Signed-off-by: Christophe Leroy [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 a part of "objtool/powerpc: Enable objtool to be built on ppc" patch in this series.] Signed-off-by: Sathvika Vasireddy --- 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/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(+), 35 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 (b...@kernel.crashing.org) */ +#include + #include #include #include @@ -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 orisr11,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: andcr6,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 */ +#include + #include #include #inc
[PATCH v4 05/16] powerpc: Skip objtool from running on drivers/crypto/vmx/aesp8-ppc.o
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 drivers/crypto/vmx/aesp8-ppc.o file for the following reasons: - 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. - As far as the objtool --mcount functionality is concerned, we do not have to run objtool on this file because there are no calls to _mcount. Reviewed-by: Christophe Leroy Signed-off-by: Sathvika Vasireddy --- 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
[PATCH v4 04/16] powerpc: Curb objtool unannotated intra-function warnings
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 calls, using ANNOTATE_INTRA_FUNCTION_CALL macro, to indicate that the branch targets are valid. Reviewed-by: Christophe Leroy Signed-off-by: Sathvika Vasireddy --- 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 #include #include #include @@ -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 bc187bb216ac..20212eb30764 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S @@ -11,6 +11,7 @@ */ #include +#include #include #include #include @@ -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
[PATCH v4 03/16] powerpc: Fix objtool unannotated intra-function call warnings
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 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 annotating those symbols with SYM_FUNC_START_LOCAL and SYM_FUNC_END macros, inorder to set symbol type to STT_FUNC and symbol size accordingly. Reviewed-by: Christophe Leroy Signed-off-by: Sathvika Vasireddy --- 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..56a31424c8b0 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -13,6 +13,7 @@ * */ +#include #include #include #include @@ -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) mflrr0 bcl 20,31,$+4 0: mflrr3 @@ -3087,9 +3088,10 @@ enable_machine_check: RFI_TO_KERNEL 1: mtlrr0 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) mflrr0 bcl 20,31,$+4 0: mflrr3 @@ -3102,3 +3104,4 @@ disable_machine_check: RFI_TO_KERNEL 1: mtlrr0 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 #include #include #include @@ -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 orisr11,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 (engeb...@us.ibm.com) */ +#include #include #include #include @@ -353,7 +354,7 @@ _GLOBAL(kexec_smp_wait) * * don't overwrite r3 here, it is li
[PATCH v4 02/16] powerpc: Override __ALIGN and __ALIGN_STR macros
In a subsequent patch, we would want to annotate powerpc assembly functions with SYM_FUNC_START_LOCAL macro. This macro depends on __ALIGN macro. The default expansion of __ALIGN macro is: #define __ALIGN .align 4,0x90 So, override __ALIGN and __ALIGN_STR macros to use the same alignment as that of the existing _GLOBAL macro. Also, do not pad with 0x90, because repeated 0x90s are not a nop or trap on powerpc. Signed-off-by: Sathvika Vasireddy --- arch/powerpc/include/asm/linkage.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/powerpc/include/asm/linkage.h b/arch/powerpc/include/asm/linkage.h index b71b9582e754..b88d1d2cf304 100644 --- a/arch/powerpc/include/asm/linkage.h +++ b/arch/powerpc/include/asm/linkage.h @@ -4,6 +4,9 @@ #include +#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" \ -- 2.31.1
[PATCH v4 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: v4: * Patch 11/16 - Introduce a new config option CONFIG_HAVE_OBJTOOL_NOP_MCOUNT as a means for architectures to enable nop'ing ftrace locations. - Remove Acked-by tag from Peter Zijlstra (Intel), and Reviewed-by tag from Christophe Leroy. [This is done because I reworked the patch to add a new config option to objtool. Please let me know if you want me to retain the tags. Thanks!] * Patch 16/16 - Rework the patch to handle only 'bl' instruction decoding. 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 before . - 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 ++
[PATCH v4 01/16] powerpc: Fix __WARN_FLAGS() for use with Objtool
Commit 1e688dd2a3d675 ("powerpc/bug: Provide better flexibility to WARN_ON/__WARN_FLAGS() with asm goto") updated __WARN_FLAGS() to use asm goto, and added a call to 'unreachable()' after the asm goto for optimal code generation. With CONFIG_OBJTOOL enabled, 'annotate_unreachable()' statement in 'unreachable()' tries to note down the location of the subsequent instruction in a separate elf section to aid code flow analysis. However, on powerpc, this results in gcc emitting a call to a symbol of size 0. This results in objtool complaining of "unannotated intra-function call" since the target symbol is not a valid function call destination. Objtool wants this annotation for code flow analysis, which we are not yet enabling on powerpc. As such, expand the call to 'unreachable()' in __WARN_FLAGS() without annotate_unreachable(): barrier_before_unreachable(); __builtin_unreachable(); This still results in optimal code generation for __WARN_FLAGS(), while getting rid of the objtool warning. We still need barrier_before_unreachable() to work around gcc bugs 82365 and 106751: - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82365 - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106751 Reviewed-by: Christophe Leroy Signed-off-by: Sathvika Vasireddy --- arch/powerpc/include/asm/bug.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/include/asm/bug.h b/arch/powerpc/include/asm/bug.h index 61a4736355c2..ef42adb44aa3 100644 --- a/arch/powerpc/include/asm/bug.h +++ b/arch/powerpc/include/asm/bug.h @@ -99,7 +99,8 @@ __label__ __label_warn_on; \ \ WARN_ENTRY("twi 31, 0, 0", BUGFLAG_WARNING | (flags), __label_warn_on); \ - unreachable(); \ + barrier_before_unreachable(); \ + __builtin_unreachable();\ \ __label_warn_on: \ break; \ -- 2.31.1
[6.0.0-rc7-next-20220930] kernel BUG at arch/powerpc/kernel/exceptions-64s.S:2831!
With recent versions of linux-next I am observing kernel crashes on Power server. I saw this crash once just after boot. I also saw similar crash while compiling a Kernel or during a git clone of kernel source. Seem to occur at random times. [ 175.165592] [ cut here ] [ 175.165618] kernel BUG at arch/powerpc/kernel/exceptions-64s.S:2831! [ 175.165637] Oops: Exception in kernel mode, sig: 5 [#1] [ 175.165647] LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA pSeries [ 175.165657] Modules linked in: dm_mod(E) nft_fib_inet(E) nft_fib_ipv4(E) nft_fib_ipv6(E) nft_fib(E) nft_reject_inet(E) nf_reject_ipv4(E) nf_reject_ipv6(E) nft_reject(E) nft_ct(E) nft_chain_nat(E) nf_nat(E) nf_conntrack(E) nf_defrag_ipv6(E) nf_defrag_ipv4(E) bonding(E) rfkill(E) tls(E) ip_set(E) nf_tables(E) libcrc32c(E) nfnetlink(E) sunrpc(E) pseries_rng(E) vmx_crypto(E) ext4(E) mbcache(E) jbd2(E) sd_mod(E) t10_pi(E) crc64_rocksoft(E) crc64(E) sg(E) ibmvscsi(E) scsi_transport_srp(E) ibmveth(E) ipmi_devintf(E) ipmi_msghandler(E) fuse(E) [ 175.165805] CPU: 6 PID: 11059 Comm: sed Tainted: GE 6.0.0-rc7-next-20220930 #1 [ 175.165820] Hardware name: IBM,8375-42A POWER9 (raw) 0x4e0202 0xf05 of:IBM,FW950.50 (VL950_105) hv:phyp pSeries [ 175.165832] NIP: c000be38 LR: c001cdfc CTR: c0008ed0 [ 175.165844] REGS: c0002840b5b0 TRAP: 0700 Tainted: GE (6.0.0-rc7-next-20220930) [ 175.165856] MSR: 80021031 CR: 44828844 XER: [ 175.165881] CFAR: c0008f74 IRQMASK: 1 [ 175.165881] GPR00: c001df08 c0002840b850 c135e800 02802000 [ 175.165881] GPR04: c3717e80 0166 c2a3aa80 [ 175.165881] GPR08: 8280b033 0005 0004 c001c864 [ 175.165881] GPR12: 8280b033 c0001ec58b00 c0002840bbd8 [ 175.165881] GPR16: c2988b70 0009 61c8864680b583eb 0002 [ 175.165881] GPR20: c2aa3e00 c0002840bac8 0001 c00201eb9f40 [ 175.165881] GPR24: c00201eba420 c3718ca0 00063a4a c2160db0 [ 175.165881] GPR28: c2160db0 c00201eb9600 80004280f033 c00201eb9600 [ 175.166058] NIP [c000be38] masked_interrupt+0xc/0xe4 [ 175.166076] LR [c001cdfc] giveup_all+0x6c/0x130 [ 175.166088] Call Trace: [ 175.166094] [c0002840b850] [c0002840b8e0] 0xc0002840b8e0 (unreliable) [ 175.166113] [c0002840b880] [c001df08] __switch_to+0x108/0x4b0 [ 175.166131] [c0002840b8e0] [c0ed07c0] __schedule+0x2b0/0x9e0 [ 175.166147] [c0002840b9b0] [c0ed0f68] schedule+0x78/0x140 [ 175.166163] [c0002840ba20] [c0ed169c] io_schedule+0x2c/0x50 [ 175.166182] [c0002840ba50] [c0419fb4] filemap_fault+0xc74/0x1240 [ 175.166199] [c0002840bb70] [c047a484] __do_fault+0x64/0x240 [ 175.166215] [c0002840bbb0] [c047e598] __handle_mm_fault+0x1078/0x16f0 [ 175.166232] [c0002840bcb0] [c047ed38] handle_mm_fault+0x128/0x320 [ 175.166247] [c0002840bd00] [c0092054] ___do_page_fault+0x2f4/0xb50 [ 175.166265] [c0002840bdb0] [c0092ac0] hash__do_page_fault+0x30/0x70 [ 175.166281] [c0002840bde0] [c009b918] do_hash_fault+0x278/0x470 [ 175.166304] [c0002840be10] [c0008ce8] instruction_access_common_virt+0x198/0x1a0 [ 175.166325] Instruction dump: [ 175.166337] e96a0110 e96a0198 e96a0220 e96a02a8 e96a0330 e96a03b8 394a0400 4200ffdc [ 175.166368] 4e800020 912d00b4 892d0933 71290025 <0b09> 892d0933 7d295378 992d0933 [ 175.166401] ---[ end trace ]--- [ 175.173284] Another instance of this crash: [3.109142] [ cut here ] [3.109151] kernel BUG at arch/powerpc/kernel/exceptions-64s.S:2831! [3.109156] Oops: Exception in kernel mode, sig: 5 [#1] [3.109160] LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=2048 NUMA pSeries [3.109164] Modules linked in: sd_mod(E) t10_pi(E) crc64_rocksoft(E) crc64(E) sg(E) ibmvscsi(E) scsi_transport_srp(E) ibmveth(E) fuse(E) [3.109177] CPU: 14 PID: 600 Comm: fsck.ext4 Tainted: GE 6.0.0-rc7-next-20220930 #1 [3.109182] Hardware name: IBM,9080-HEX POWER10 (raw) 0x800200 0xf06 of:IBM,FW1030.00 (NH1030_026) hv:phyp pSeries [3.109187] NIP: c000be38 LR: c001d5e8 CTR: c0008ed0 [3.109191] REGS: c000210b3a90 TRAP: 0700 Tainted: GE (6.0.0-rc7-next-20220930) [3.109195] MSR: 80021031 CR: 44042874 XER: 2004 [3.109202] CFAR: c0008f74 IRQMASK: 1 [3.109202] GPR00: c00340b4 c000210b3d30 c135e800 0280 [3.109202] GPR04: c000210b3e80 [3.109202] GPR08: 82809033 000