Re: [PATCH v4 16/16] objtool/powerpc: Add --mcount specific implementation

2022-10-02 Thread Christophe Leroy


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

2022-10-02 Thread Christophe Leroy


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

2022-10-02 Thread Christophe Leroy


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

2022-10-02 Thread Christophe Leroy


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", , "don't write modifications"),
>   OPT_BOOLEAN(0, "link", , "object is a linked object"),
>   OPT_BOOLEAN(0, "module", , "object is part of a kernel 
> module"),
> + OPT_BOOLEAN(0, "mnop", , "nop out mcount call sites"),
>   OPT_BOOLEAN(0, "no-unreachable", _unreachable, "skip 
> 'unreachable instruction' warnings"),
>   OPT_BOOLEAN(0, "sec-address", _address, "print section 
> addresses in warnings"),
>   OPT_BOOLEAN(0, "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 
> 

Re: [PATCH v2] i2c/pasemi: PASemi I2C controller IRQ enablement

2022-10-02 Thread Christian Zigotzky

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(>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(>irq_completion);
+   reg_write(smbus, REG_IMASK, SMSTA_XEN | SMSTA_MTN);
+   wait_for_completion_timeout(>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(>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, >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(>irq_completion);
+   return 

Re: [PATCH v2] i2c-pasemi: PASemi I2C controller IRQ enablement

2022-10-02 Thread Sven Peter
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

2022-10-02 Thread Arminder Singh
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

2022-10-02 Thread Arminder Singh
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(>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(>irq_completion);
+   reg_write(smbus, REG_IMASK, SMSTA_XEN | SMSTA_MTN);
+   wait_for_completion_timeout(>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(>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, >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(>irq_completion);
+   return IRQ_HANDLED;
+}
diff --git 

Re: [PATCH v2] i2c/pasemi: PASemi I2C controller IRQ enablement

2022-10-02 Thread Sven Peter
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(>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(>irq_completion);
> + reg_write(smbus, REG_IMASK, SMSTA_XEN | SMSTA_MTN);
> + wait_for_completion_timeout(>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;
> +  

Re: [PATCH v2] i2c/pasemi: PASemi I2C controller IRQ enablement

2022-10-02 Thread Wolfram Sang
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

2022-10-02 Thread Sathvika Vasireddy
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

2022-10-02 Thread Sathvika Vasireddy
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 

[PATCH v4 14/16] objtool: Add arch specific function arch_ftrace_match()

2022-10-02 Thread Sathvika Vasireddy
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

2022-10-02 Thread Sathvika Vasireddy
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

2022-10-02 Thread Sathvika Vasireddy
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

2022-10-02 Thread Sathvika Vasireddy
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", , "don't write modifications"),
OPT_BOOLEAN(0, "link", , "object is a linked object"),
OPT_BOOLEAN(0, "module", , "object is part of a kernel 
module"),
+   OPT_BOOLEAN(0, "mnop", , "nop out mcount call sites"),
OPT_BOOLEAN(0, "no-unreachable", _unreachable, "skip 
'unreachable instruction' warnings"),
OPT_BOOLEAN(0, "sec-address", _address, "print section 
addresses in warnings"),
OPT_BOOLEAN(0, "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) {
+   if (reloc) {
+  

[PATCH v4 10/16] objtool: Use target file class size instead of a compiled constant

2022-10-02 Thread Sathvika Vasireddy
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, >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, >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

2022-10-02 Thread Sathvika Vasireddy
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(_elf.ehdr, elf64_getehdr(elf), sizeof(dummy_elf.ehdr));
+
if (elf_getshdrnum(elf, _sections)) {
WARN_ELF("elf_getshdrnum");
 

[PATCH v4 08/16] objtool: Fix SEGFAULT

2022-10-02 Thread Sathvika Vasireddy
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

2022-10-02 Thread Sathvika Vasireddy
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

2022-10-02 Thread Sathvika Vasireddy
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 
 

[PATCH v4 05/16] powerpc: Skip objtool from running on drivers/crypto/vmx/aesp8-ppc.o

2022-10-02 Thread Sathvika Vasireddy
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

2022-10-02 Thread Sathvika Vasireddy
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

2022-10-02 Thread Sathvika Vasireddy
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 

[PATCH v4 02/16] powerpc: Override __ALIGN and __ALIGN_STR macros

2022-10-02 Thread Sathvika Vasireddy
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

2022-10-02 Thread Sathvika Vasireddy
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

2022-10-02 Thread Sathvika Vasireddy
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!

2022-10-02 Thread Sachin Sant
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