linux-modules.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] Fixups before RUST modversions support
@ 2024-12-28 15:45 Masahiro Yamada
  2024-12-28 15:45 ` [PATCH 1/2] module: get symbol crc back to unsigned Masahiro Yamada
  2024-12-28 15:45 ` [PATCH 2/2] modpost: zero-pad CRC values in modversion_info array Masahiro Yamada
  0 siblings, 2 replies; 6+ messages in thread
From: Masahiro Yamada @ 2024-12-28 15:45 UTC (permalink / raw)
  To: linux-kbuild
  Cc: linux-kernel, Luis Chamberlain, Petr Pavlu, Sami Tolvanen,
	Daniel Gomez, linux-modules, Ard Biesheuvel, Matthew Maurer,
	Masahiro Yamada, Nathan Chancellor, Nicolas Schier


 - Fix s32 -> u32
 - Make printf() format consistent

Matthew Maurer is adding more 's32'.

I need to fix the code now.
Otherwise, I would need to fix more places.



Masahiro Yamada (2):
  module: get symbol crc back to unsigned
  modpost: zero-pad CRC values in modversion_info array

 include/linux/module.h   |  4 ++--
 kernel/module/internal.h | 10 +++++-----
 kernel/module/main.c     |  2 +-
 kernel/module/version.c  |  2 +-
 scripts/mod/modpost.c    |  2 +-
 5 files changed, 10 insertions(+), 10 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] module: get symbol crc back to unsigned
  2024-12-28 15:45 [PATCH 0/2] Fixups before RUST modversions support Masahiro Yamada
@ 2024-12-28 15:45 ` Masahiro Yamada
  2024-12-28 16:12   ` Masahiro Yamada
  2024-12-30 14:02   ` Petr Pavlu
  2024-12-28 15:45 ` [PATCH 2/2] modpost: zero-pad CRC values in modversion_info array Masahiro Yamada
  1 sibling, 2 replies; 6+ messages in thread
From: Masahiro Yamada @ 2024-12-28 15:45 UTC (permalink / raw)
  To: linux-kbuild
  Cc: linux-kernel, Luis Chamberlain, Petr Pavlu, Sami Tolvanen,
	Daniel Gomez, linux-modules, Ard Biesheuvel, Matthew Maurer,
	Masahiro Yamada

Commit 71810db27c1c ("modversions: treat symbol CRCs as 32 bit
quantities") changed the CRC fields to s32 because the __kcrctab and
__kcrctab_gpl sections contained relative references to the actual
CRC values stored in the .rodata section when CONFIG_MODULE_REL_CRCS=y.

Commit 7b4537199a4a ("kbuild: link symbol CRCs at final link, removing
CONFIG_MODULE_REL_CRCS") removed this complexity. Now, the __kcrctab
and __kcrctab_gpl sections directly contain the CRC values in all cases.

The genksyms tool outputs unsigned 32-bit CRC values, so u32 is preferred
over s32.

No functional changes are intended.

Regardless of this change, the CRC value is assigned to the u32 variable,
'crcval' before the comparison, as seen in kernel/module/version.c:

    crcval = *crc;

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 include/linux/module.h   |  4 ++--
 kernel/module/internal.h | 10 +++++-----
 kernel/module/main.c     |  2 +-
 kernel/module/version.c  |  2 +-
 4 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/include/linux/module.h b/include/linux/module.h
index 94acbacdcdf1..903ef8fe4c04 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -430,7 +430,7 @@ struct module {
 
 	/* Exported symbols */
 	const struct kernel_symbol *syms;
-	const s32 *crcs;
+	const u32 *crcs;
 	unsigned int num_syms;
 
 #ifdef CONFIG_ARCH_USES_CFI_TRAPS
@@ -448,7 +448,7 @@ struct module {
 	/* GPL-only exported symbols. */
 	unsigned int num_gpl_syms;
 	const struct kernel_symbol *gpl_syms;
-	const s32 *gpl_crcs;
+	const u32 *gpl_crcs;
 	bool using_gplonly_symbols;
 
 #ifdef CONFIG_MODULE_SIG
diff --git a/kernel/module/internal.h b/kernel/module/internal.h
index daef2be83902..f10dc3ea7ff8 100644
--- a/kernel/module/internal.h
+++ b/kernel/module/internal.h
@@ -55,8 +55,8 @@ extern const struct kernel_symbol __start___ksymtab[];
 extern const struct kernel_symbol __stop___ksymtab[];
 extern const struct kernel_symbol __start___ksymtab_gpl[];
 extern const struct kernel_symbol __stop___ksymtab_gpl[];
-extern const s32 __start___kcrctab[];
-extern const s32 __start___kcrctab_gpl[];
+extern const u32 __start___kcrctab[];
+extern const u32 __start___kcrctab_gpl[];
 
 struct load_info {
 	const char *name;
@@ -102,7 +102,7 @@ struct find_symbol_arg {
 
 	/* Output */
 	struct module *owner;
-	const s32 *crc;
+	const u32 *crc;
 	const struct kernel_symbol *sym;
 	enum mod_license license;
 };
@@ -384,7 +384,7 @@ static inline void init_param_lock(struct module *mod) { }
 
 #ifdef CONFIG_MODVERSIONS
 int check_version(const struct load_info *info,
-		  const char *symname, struct module *mod, const s32 *crc);
+		  const char *symname, struct module *mod, const u32 *crc);
 void module_layout(struct module *mod, struct modversion_info *ver, struct kernel_param *kp,
 		   struct kernel_symbol *ks, struct tracepoint * const *tp);
 int check_modstruct_version(const struct load_info *info, struct module *mod);
@@ -393,7 +393,7 @@ int same_magic(const char *amagic, const char *bmagic, bool has_crcs);
 static inline int check_version(const struct load_info *info,
 				const char *symname,
 				struct module *mod,
-				const s32 *crc)
+				const u32 *crc)
 {
 	return 1;
 }
diff --git a/kernel/module/main.c b/kernel/module/main.c
index 5399c182b3cb..e58bff88b8d6 100644
--- a/kernel/module/main.c
+++ b/kernel/module/main.c
@@ -86,7 +86,7 @@ struct mod_tree_root mod_tree __cacheline_aligned = {
 
 struct symsearch {
 	const struct kernel_symbol *start, *stop;
-	const s32 *crcs;
+	const u32 *crcs;
 	enum mod_license license;
 };
 
diff --git a/kernel/module/version.c b/kernel/module/version.c
index 53f43ac5a73e..4e5731d403af 100644
--- a/kernel/module/version.c
+++ b/kernel/module/version.c
@@ -13,7 +13,7 @@
 int check_version(const struct load_info *info,
 		  const char *symname,
 			 struct module *mod,
-			 const s32 *crc)
+			 const u32 *crc)
 {
 	Elf_Shdr *sechdrs = info->sechdrs;
 	unsigned int versindex = info->index.vers;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] modpost: zero-pad CRC values in modversion_info array
  2024-12-28 15:45 [PATCH 0/2] Fixups before RUST modversions support Masahiro Yamada
  2024-12-28 15:45 ` [PATCH 1/2] module: get symbol crc back to unsigned Masahiro Yamada
@ 2024-12-28 15:45 ` Masahiro Yamada
  1 sibling, 0 replies; 6+ messages in thread
From: Masahiro Yamada @ 2024-12-28 15:45 UTC (permalink / raw)
  To: linux-kbuild
  Cc: linux-kernel, Luis Chamberlain, Petr Pavlu, Sami Tolvanen,
	Daniel Gomez, linux-modules, Ard Biesheuvel, Matthew Maurer,
	Masahiro Yamada, Nathan Chancellor, Nicolas Schier

I do not think the '#' flag is useful here because adding the explicit
'0x' is clearer. Add the '0' flag to zero-pad the CRC values.

This change gives better alignment in the generated *.mod.c files.
There is no impact to the compiled modules.

[Before]

  $ grep -A5 modversion_info fs/efivarfs/efivarfs.mod.c
  static const struct modversion_info ____versions[]
  __used __section("__versions") = {
          { 0x907d14d, "blocking_notifier_chain_register" },
          { 0x53d3b64, "simple_inode_init_ts" },
          { 0x65487097, "__x86_indirect_thunk_rax" },
          { 0x122c3a7e, "_printk" },

[After]

  $ grep -A5 modversion_info fs/efivarfs/efivarfs.mod.c
  static const struct modversion_info ____versions[]
  __used __section("__versions") = {
          { 0x0907d14d, "blocking_notifier_chain_register" },
          { 0x053d3b64, "simple_inode_init_ts" },
          { 0x65487097, "__x86_indirect_thunk_rax" },
          { 0x122c3a7e, "_printk" },

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---

 scripts/mod/modpost.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 94ee49207a45..0d7b0bc8796b 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -1832,7 +1832,7 @@ static void add_versions(struct buffer *b, struct module *mod)
 			      s->name, mod->name);
 			break;
 		}
-		buf_printf(b, "\t{ %#8x, \"%s\" },\n",
+		buf_printf(b, "\t{ 0x%08x, \"%s\" },\n",
 			   s->crc, s->name);
 	}
 
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] module: get symbol crc back to unsigned
  2024-12-28 15:45 ` [PATCH 1/2] module: get symbol crc back to unsigned Masahiro Yamada
@ 2024-12-28 16:12   ` Masahiro Yamada
  2024-12-30 14:02   ` Petr Pavlu
  1 sibling, 0 replies; 6+ messages in thread
From: Masahiro Yamada @ 2024-12-28 16:12 UTC (permalink / raw)
  To: linux-kbuild
  Cc: linux-kernel, Luis Chamberlain, Petr Pavlu, Sami Tolvanen,
	Daniel Gomez, linux-modules, Ard Biesheuvel, Matthew Maurer

On Sun, Dec 29, 2024 at 12:46 AM Masahiro Yamada <masahiroy@kernel.org> wrote:
>
> Commit 71810db27c1c ("modversions: treat symbol CRCs as 32 bit
> quantities") changed the CRC fields to s32 because the __kcrctab and
> __kcrctab_gpl sections contained relative references to the actual
> CRC values stored in the .rodata section when CONFIG_MODULE_REL_CRCS=y.
>
> Commit 7b4537199a4a ("kbuild: link symbol CRCs at final link, removing
> CONFIG_MODULE_REL_CRCS") removed this complexity. Now, the __kcrctab
> and __kcrctab_gpl sections directly contain the CRC values in all cases.
>
> The genksyms tool outputs unsigned 32-bit CRC values, so u32 is preferred
> over s32.
>
> No functional changes are intended.
>
> Regardless of this change, the CRC value is assigned to the u32 variable,
> 'crcval' before the comparison, as seen in kernel/module/version.c:
>
>     crcval = *crc;


[Just in case for confused reviewers]

It was previously mandatory (but now optional) in order to avoid sign
extension because the following line previously compared 'unsigned long'
and 's32':

    if (versions[i].crc == crcval)
            return 1;

versions[i].crc is still 'unsigned long' for backward compatibility.










-- 
Best Regards
Masahiro Yamada

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] module: get symbol crc back to unsigned
  2024-12-28 15:45 ` [PATCH 1/2] module: get symbol crc back to unsigned Masahiro Yamada
  2024-12-28 16:12   ` Masahiro Yamada
@ 2024-12-30 14:02   ` Petr Pavlu
  2025-01-03 16:03     ` Masahiro Yamada
  1 sibling, 1 reply; 6+ messages in thread
From: Petr Pavlu @ 2024-12-30 14:02 UTC (permalink / raw)
  To: Masahiro Yamada
  Cc: linux-kbuild, linux-kernel, Luis Chamberlain, Sami Tolvanen,
	Daniel Gomez, linux-modules, Ard Biesheuvel, Matthew Maurer

On 12/28/24 16:45, Masahiro Yamada wrote:
> Commit 71810db27c1c ("modversions: treat symbol CRCs as 32 bit
> quantities") changed the CRC fields to s32 because the __kcrctab and
> __kcrctab_gpl sections contained relative references to the actual
> CRC values stored in the .rodata section when CONFIG_MODULE_REL_CRCS=y.
> 
> Commit 7b4537199a4a ("kbuild: link symbol CRCs at final link, removing
> CONFIG_MODULE_REL_CRCS") removed this complexity. Now, the __kcrctab
> and __kcrctab_gpl sections directly contain the CRC values in all cases.
> 
> The genksyms tool outputs unsigned 32-bit CRC values, so u32 is preferred
> over s32.
> 
> No functional changes are intended.
> 
> Regardless of this change, the CRC value is assigned to the u32 variable,
> 'crcval' before the comparison, as seen in kernel/module/version.c:
> 
>     crcval = *crc;
> 
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

Reviewed-by: Petr Pavlu <petr.pavlu@suse.com>

I understand the plan is for this to go through the kbuild tree with the
rest of the extended modversions + Rust support.

-- 
Thanks,
Petr

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] module: get symbol crc back to unsigned
  2024-12-30 14:02   ` Petr Pavlu
@ 2025-01-03 16:03     ` Masahiro Yamada
  0 siblings, 0 replies; 6+ messages in thread
From: Masahiro Yamada @ 2025-01-03 16:03 UTC (permalink / raw)
  To: Petr Pavlu
  Cc: linux-kbuild, linux-kernel, Luis Chamberlain, Sami Tolvanen,
	Daniel Gomez, linux-modules, Ard Biesheuvel, Matthew Maurer

On Mon, Dec 30, 2024 at 11:02 PM Petr Pavlu <petr.pavlu@suse.com> wrote:
>
> On 12/28/24 16:45, Masahiro Yamada wrote:
> > Commit 71810db27c1c ("modversions: treat symbol CRCs as 32 bit
> > quantities") changed the CRC fields to s32 because the __kcrctab and
> > __kcrctab_gpl sections contained relative references to the actual
> > CRC values stored in the .rodata section when CONFIG_MODULE_REL_CRCS=y.
> >
> > Commit 7b4537199a4a ("kbuild: link symbol CRCs at final link, removing
> > CONFIG_MODULE_REL_CRCS") removed this complexity. Now, the __kcrctab
> > and __kcrctab_gpl sections directly contain the CRC values in all cases.
> >
> > The genksyms tool outputs unsigned 32-bit CRC values, so u32 is preferred
> > over s32.
> >
> > No functional changes are intended.
> >
> > Regardless of this change, the CRC value is assigned to the u32 variable,
> > 'crcval' before the comparison, as seen in kernel/module/version.c:
> >
> >     crcval = *crc;
> >
> > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
>
> Reviewed-by: Petr Pavlu <petr.pavlu@suse.com>
>
> I understand the plan is for this to go through the kbuild tree with the
> rest of the extended modversions + Rust support.


Yes.

Now applied to linux-kbuild.


-- 
Best Regards
Masahiro Yamada

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-01-03 16:04 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-28 15:45 [PATCH 0/2] Fixups before RUST modversions support Masahiro Yamada
2024-12-28 15:45 ` [PATCH 1/2] module: get symbol crc back to unsigned Masahiro Yamada
2024-12-28 16:12   ` Masahiro Yamada
2024-12-30 14:02   ` Petr Pavlu
2025-01-03 16:03     ` Masahiro Yamada
2024-12-28 15:45 ` [PATCH 2/2] modpost: zero-pad CRC values in modversion_info array Masahiro Yamada

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).