[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230601101257.530867-11-rppt@kernel.org>
Date: Thu, 1 Jun 2023 13:12:54 +0300
From: Mike Rapoport <rppt@...nel.org>
To: linux-kernel@...r.kernel.org
Cc: Andrew Morton <akpm@...ux-foundation.org>,
Catalin Marinas <catalin.marinas@....com>,
Christophe Leroy <christophe.leroy@...roup.eu>,
"David S. Miller" <davem@...emloft.net>,
Dinh Nguyen <dinguyen@...nel.org>,
Heiko Carstens <hca@...ux.ibm.com>,
Helge Deller <deller@....de>,
Huacai Chen <chenhuacai@...nel.org>,
Kent Overstreet <kent.overstreet@...ux.dev>,
Luis Chamberlain <mcgrof@...nel.org>,
Michael Ellerman <mpe@...erman.id.au>,
Mike Rapoport <rppt@...nel.org>,
"Naveen N. Rao" <naveen.n.rao@...ux.ibm.com>,
Palmer Dabbelt <palmer@...belt.com>,
Russell King <linux@...linux.org.uk>,
Song Liu <song@...nel.org>,
Steven Rostedt <rostedt@...dmis.org>,
Thomas Bogendoerfer <tsbogend@...ha.franken.de>,
Thomas Gleixner <tglx@...utronix.de>,
Will Deacon <will@...nel.org>, bpf@...r.kernel.org,
linux-arm-kernel@...ts.infradead.org, linux-mips@...r.kernel.org,
linux-mm@...ck.org, linux-modules@...r.kernel.org,
linux-parisc@...r.kernel.org, linux-riscv@...ts.infradead.org,
linux-s390@...r.kernel.org, linux-trace-kernel@...r.kernel.org,
linuxppc-dev@...ts.ozlabs.org, loongarch@...ts.linux.dev,
netdev@...r.kernel.org, sparclinux@...r.kernel.org, x86@...nel.org
Subject: [PATCH 10/13] modules, jitalloc: prepare to allocate executable memory as ROX
From: "Mike Rapoport (IBM)" <rppt@...nel.org>
When executable memory will be allocated as ROX it won't be possible to
update it using memset() and memcpy().
Introduce jit_update_copy() and jit_update_set() APIs and use them in
modules loading code instead of memcpy() and memset().
Signed-off-by: Mike Rapoport (IBM) <rppt@...nel.org>
---
include/linux/jitalloc.h | 2 ++
kernel/module/main.c | 19 ++++++++++++++-----
mm/jitalloc.c | 20 ++++++++++++++++++++
3 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/include/linux/jitalloc.h b/include/linux/jitalloc.h
index 7f8cafb3cfe9..0ba5ef785a85 100644
--- a/include/linux/jitalloc.h
+++ b/include/linux/jitalloc.h
@@ -55,6 +55,8 @@ struct jit_alloc_params *jit_alloc_arch_params(void);
void jit_free(void *buf);
void *jit_text_alloc(size_t len);
void *jit_data_alloc(size_t len);
+void jit_update_copy(void *buf, void *new_buf, size_t len);
+void jit_update_set(void *buf, int c, size_t len);
#ifdef CONFIG_JIT_ALLOC
void jit_alloc_init(void);
diff --git a/kernel/module/main.c b/kernel/module/main.c
index 91477aa5f671..9f0711c42aa2 100644
--- a/kernel/module/main.c
+++ b/kernel/module/main.c
@@ -1197,9 +1197,19 @@ void __weak module_arch_freeing_init(struct module *mod)
static void *module_memory_alloc(unsigned int size, enum mod_mem_type type)
{
- if (mod_mem_type_is_data(type))
- return jit_data_alloc(size);
- return jit_text_alloc(size);
+ void *p;
+
+ if (mod_mem_type_is_data(type)) {
+ p = jit_data_alloc(size);
+ if (p)
+ memset(p, 0, size);
+ } else {
+ p = jit_text_alloc(size);
+ if (p)
+ jit_update_set(p, 0, size);
+ }
+
+ return p;
}
static void module_memory_free(void *ptr, enum mod_mem_type type)
@@ -2223,7 +2233,6 @@ static int move_module(struct module *mod, struct load_info *info)
t = type;
goto out_enomem;
}
- memset(ptr, 0, mod->mem[type].size);
mod->mem[type].base = ptr;
}
@@ -2251,7 +2260,7 @@ static int move_module(struct module *mod, struct load_info *info)
ret = -ENOEXEC;
goto out_enomem;
}
- memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size);
+ jit_update_copy(dest, (void *)shdr->sh_addr, shdr->sh_size);
}
/*
* Update the userspace copy's ELF section address to point to
diff --git a/mm/jitalloc.c b/mm/jitalloc.c
index 16fd715d501a..a8ae64364d56 100644
--- a/mm/jitalloc.c
+++ b/mm/jitalloc.c
@@ -7,6 +7,16 @@
static struct jit_alloc_params jit_alloc_params;
+static inline void jit_text_poke_copy(void *dst, const void *src, size_t len)
+{
+ memcpy(dst, src, len);
+}
+
+static inline void jit_text_poke_set(void *addr, int c, size_t len)
+{
+ memset(addr, c, len);
+}
+
static void *jit_alloc(size_t len, unsigned int alignment, pgprot_t pgprot,
unsigned long start, unsigned long end,
unsigned long fallback_start, unsigned long fallback_end,
@@ -86,6 +96,16 @@ void *jit_data_alloc(size_t len)
fallback_start, fallback_end, kasan);
}
+void jit_update_copy(void *buf, void *new_buf, size_t len)
+{
+ jit_text_poke_copy(buf, new_buf, len);
+}
+
+void jit_update_set(void *addr, int c, size_t len)
+{
+ jit_text_poke_set(addr, c, len);
+}
+
struct jit_alloc_params * __weak jit_alloc_arch_params(void)
{
return NULL;
--
2.35.1
Powered by blists - more mailing lists