On Fri, Dec 23, 2022 at 04:59:51PM +0000, Ben Dooks wrote: > On 23/12/2022 16:38, Ben Dooks wrote: > > I'm getting the following error from modpost: > > > > ERROR: modpost: "zero" [arch/riscv/kvm/kvm.ko] undefined! > > ERROR: modpost: "zero" [drivers/gpu/drm/drm.ko] undefined! > > ERROR: modpost: "zero" [drivers/nvme/host/nvme.ko] undefined! > > ERROR: modpost: "zero" [drivers/i2c/algos/i2c-algo-bit.ko] undefined! > > > > This seems to be coming from arch/riscv/include/asm/jump_label.h > > with the arch_static_branch_jump() assembling some code: > > > > >     40  { > > >     41          asm_volatile_goto( > > >     42                  "       .option > > > push                            \n\t" > > >     43                  "       .option > > > norelax                         \n\t" > > >     44                  "       .option > > > norvc                           \n\t" > > >     45                  "1:     jal             zero, > > > %l[label]         \n\t" > > >     46                  "       .option > > > pop                             \n\t" > > >     47                  "       .pushsection    __jump_table, > > > \"aw\"    \n\t" > > >     48                  "       .align          " RISCV_LGPTR > > > "         \n\t" > > >     49                  "       .long           1b - ., %l[label] - > > > .   \n\t" > > >     50                  "       " RISCV_PTR "   %0 - > > > .                  \n\t" > > >     51                  " > > > .popsection                             \n\t" > > >     52                  :  :  "i"(&((char *)key)[branch]) :  : label); > > >     53 > > >     54          return false; > > >     55  label: > > >     56          return true; > > >     57  } > > > > > > > Changing the jal zero to jal x0 doesn't fix it, it just comes up with > > "x0" being undefined. > > > > gcc version 12.2.0 (Debian 12.2.0-9) > > GNU assembler version 2.39.50 (riscv64-linux-gnu) using BFD version (GNU > > Binutils for Debian) 2.39.50.20221208 Hey Ben, said I'd give it a run yesterday but didnt... gcc version 12.2.0 2ee5e430018 ("Update ChangeLog and version files for release") binutils 2.39 74340608801 (24/12/22) So that's gcc @ the 12.2 tag & binutils at the tip of the 2.39 branch. Kernel is from today too: 72a85e2b0a1e ("Merge tag 'spi-fix-v6.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi") I did my usual defconfig (which builds kvm as a module) and allmodconfig but I see nothing odd out of modpost. Could you share your config perhaps, or point out what I may be overlooking setup wise? > > I suspect this is a gas bug where it means to assemble a J instruction > > to the label without outputting the unused symbol "zero" into the symbol > > table. Is the right thing to fix gas, or can the kernel be changed? > > > > FYI: > > > > tmp.s: > >      1          .text > >      2 > >      3  1: > >      4          jal zero, 1b > > > > > > produces: > > > > 0000000000000000 <.L1^B1>: > >    0:   0000006f                j       0 <.L1^B1> > >                         0: R_RISCV_JAL  .L1^B1 > > > > and > > > > $ riscv64-linux-gnu-nm -a tmp.o > > 0000000000000000 b .bss > > 0000000000000000 d .data > > 0000000000000000 n .riscv.attributes > > 0000000000000000 t .text > >                  U zero > > > > Current fix is to: > > > > > > diff --git a/arch/riscv/include/asm/jump_label.h > > b/arch/riscv/include/asm/jump_label.h > > index 6d58bbb5da46..a4abbacd0b62 100644 > > --- a/arch/riscv/include/asm/jump_label.h > > +++ b/arch/riscv/include/asm/jump_label.h > > @@ -42,7 +42,7 @@ static __always_inline bool > > arch_static_branch_jump(struct static_key * const ke > >                 "       .option push                            \n\t" > >                 "       .option norelax                         \n\t" > >                 "       .option norvc                           \n\t" > > -               "1:     jal             zero, %l[label]         \n\t" > > +               "1:     j               %l[label]               \n\t" > >                 "       .option pop                             \n\t" > >                 "       .pushsection    __jump_table, \"aw\"    \n\t" > >                 "       .align          " RISCV_LGPTR "         \n\t" > > > > > > This fixes modpost, not sure if this should be applied or not. > > > > I just checked riscv64-linux-gnu-nm vmlinux.o and it has > > U zero I checked the output of nm on my allmodconfig kernel and I do not see this symbol. Ditto for my regular defconfig that I use. You mentioned on IRC that you did a rebase on top of Linus' tree, what is in the extra content on top of that? > > > So I guess the linker just ignores this undefined symbol as it is never > actually used for a relocation.