111 lines
3.1 KiB
Diff
111 lines
3.1 KiB
Diff
From 24fd2e3cef1b98f4417b8015ba24a8a4dcaae0c1 Mon Sep 17 00:00:00 2001
|
|
From: "Mike Rapoport (Microsoft)" <rppt@kernel.org>
|
|
Date: Tue, 3 Jun 2025 14:14:43 +0300
|
|
Subject: x86/its: move its_pages array to struct mod_arch_specific
|
|
|
|
The of pages with ITS thunks allocated for modules are tracked by an
|
|
array in 'struct module'.
|
|
|
|
Since this is very architecture specific data structure, move it to
|
|
'struct mod_arch_specific'.
|
|
|
|
No functional changes.
|
|
|
|
Fixes: 872df34d7c51 ("x86/its: Use dynamic thunks for indirect branches")
|
|
Suggested-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
|
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
|
|
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
|
|
Cc: stable@vger.kernel.org
|
|
Link: https://lkml.kernel.org/r/20250603111446.2609381-4-rppt@kernel.org
|
|
---
|
|
arch/x86/include/asm/module.h | 8 ++++++++
|
|
arch/x86/kernel/alternative.c | 19 ++++++++++---------
|
|
include/linux/module.h | 5 -----
|
|
3 files changed, 18 insertions(+), 14 deletions(-)
|
|
|
|
--- a/arch/x86/include/asm/module.h
|
|
+++ b/arch/x86/include/asm/module.h
|
|
@@ -5,12 +5,20 @@
|
|
#include <asm-generic/module.h>
|
|
#include <asm/orc_types.h>
|
|
|
|
+struct its_array {
|
|
+#ifdef CONFIG_MITIGATION_ITS
|
|
+ void **pages;
|
|
+ int num;
|
|
+#endif
|
|
+};
|
|
+
|
|
struct mod_arch_specific {
|
|
#ifdef CONFIG_UNWINDER_ORC
|
|
unsigned int num_orcs;
|
|
int *orc_unwind_ip;
|
|
struct orc_entry *orc_unwind;
|
|
#endif
|
|
+ struct its_array its_pages;
|
|
};
|
|
|
|
#endif /* _ASM_X86_MODULE_H */
|
|
--- a/arch/x86/kernel/alternative.c
|
|
+++ b/arch/x86/kernel/alternative.c
|
|
@@ -195,8 +195,8 @@ void its_fini_mod(struct module *mod)
|
|
its_page = NULL;
|
|
mutex_unlock(&text_mutex);
|
|
|
|
- for (int i = 0; i < mod->its_num_pages; i++) {
|
|
- void *page = mod->its_page_array[i];
|
|
+ for (int i = 0; i < mod->arch.its_pages.num; i++) {
|
|
+ void *page = mod->arch.its_pages.pages[i];
|
|
execmem_restore_rox(page, PAGE_SIZE);
|
|
}
|
|
}
|
|
@@ -206,11 +206,11 @@ void its_free_mod(struct module *mod)
|
|
if (!cpu_feature_enabled(X86_FEATURE_INDIRECT_THUNK_ITS))
|
|
return;
|
|
|
|
- for (int i = 0; i < mod->its_num_pages; i++) {
|
|
- void *page = mod->its_page_array[i];
|
|
+ for (int i = 0; i < mod->arch.its_pages.num; i++) {
|
|
+ void *page = mod->arch.its_pages.pages[i];
|
|
execmem_free(page);
|
|
}
|
|
- kfree(mod->its_page_array);
|
|
+ kfree(mod->arch.its_pages.pages);
|
|
}
|
|
#endif /* CONFIG_MODULES */
|
|
|
|
@@ -223,14 +223,15 @@ static void *its_alloc(void)
|
|
|
|
#ifdef CONFIG_MODULES
|
|
if (its_mod) {
|
|
- void *tmp = krealloc(its_mod->its_page_array,
|
|
- (its_mod->its_num_pages+1) * sizeof(void *),
|
|
+ struct its_array *pages = &its_mod->arch.its_pages;
|
|
+ void *tmp = krealloc(pages->pages,
|
|
+ (pages->num+1) * sizeof(void *),
|
|
GFP_KERNEL);
|
|
if (!tmp)
|
|
return NULL;
|
|
|
|
- its_mod->its_page_array = tmp;
|
|
- its_mod->its_page_array[its_mod->its_num_pages++] = page;
|
|
+ pages->pages = tmp;
|
|
+ pages->pages[pages->num++] = page;
|
|
|
|
execmem_make_temp_rw(page, PAGE_SIZE);
|
|
}
|
|
--- a/include/linux/module.h
|
|
+++ b/include/linux/module.h
|
|
@@ -586,11 +586,6 @@ struct module {
|
|
atomic_t refcnt;
|
|
#endif
|
|
|
|
-#ifdef CONFIG_MITIGATION_ITS
|
|
- int its_num_pages;
|
|
- void **its_page_array;
|
|
-#endif
|
|
-
|
|
#ifdef CONFIG_CONSTRUCTORS
|
|
/* Constructor functions. */
|
|
ctor_fn_t *ctors;
|