Message ID | 20221031222541.1773452-3-song@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | vmalloc_exec for modules and BPF programs | expand |
On Mon, 2022-10-31 at 15:25 -0700, Song Liu wrote: > diff --git a/arch/x86/kernel/alternative.c > b/arch/x86/kernel/alternative.c > index 5cadcea035e0..73d89774ace3 100644 > --- a/arch/x86/kernel/alternative.c > +++ b/arch/x86/kernel/alternative.c > @@ -1270,6 +1270,18 @@ void *text_poke_copy(void *addr, const void > *opcode, size_t len) > return addr; > } > > +void *arch_vcopy_exec(void *dst, void *src, size_t len) > +{ > + if (text_poke_copy(dst, src, len) == NULL) > + return ERR_PTR(-EINVAL); > + return dst; > +} Except for this, there are no more users of text_poke_copy() right? Should it just be replaced with arch_vcopy_exec()?
On Wed, Nov 2, 2022 at 3:22 PM Edgecombe, Rick P <rick.p.edgecombe@intel.com> wrote: > > On Mon, 2022-10-31 at 15:25 -0700, Song Liu wrote: > > diff --git a/arch/x86/kernel/alternative.c > > b/arch/x86/kernel/alternative.c > > index 5cadcea035e0..73d89774ace3 100644 > > --- a/arch/x86/kernel/alternative.c > > +++ b/arch/x86/kernel/alternative.c > > @@ -1270,6 +1270,18 @@ void *text_poke_copy(void *addr, const void > > *opcode, size_t len) > > return addr; > > } > > > > +void *arch_vcopy_exec(void *dst, void *src, size_t len) > > +{ > > + if (text_poke_copy(dst, src, len) == NULL) > > + return ERR_PTR(-EINVAL); > > + return dst; > > +} > > Except for this, there are no more users of text_poke_copy() right? > Should it just be replaced with arch_vcopy_exec()? I guess this is not really necessary, as we may have other use cases for text_poke_copy(), and the text_poke_* calls make a good API. I won't object if folks agree removing text_poke_copy() for now is a better approach. Thanks, Song
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index 5cadcea035e0..73d89774ace3 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c @@ -1270,6 +1270,18 @@ void *text_poke_copy(void *addr, const void *opcode, size_t len) return addr; } +void *arch_vcopy_exec(void *dst, void *src, size_t len) +{ + if (text_poke_copy(dst, src, len) == NULL) + return ERR_PTR(-EINVAL); + return dst; +} + +int arch_invalidate_exec(void *ptr, size_t len) +{ + return IS_ERR_OR_NULL(text_poke_set(ptr, 0xcc, len)); +} + /** * text_poke_set - memset into (an unused part of) RX memory * @addr: address to modify
Implement arch_vcopy_exec() and arch_invalidate_exec() to support vmalloc_exec. arch_vcopy_exec() copies dynamic kernel text (such as BPF programs) to RO+X memory region allocated by vmalloc_exec(). arch_invalidate_exec() fills memory with 0xcc after it is released by vfree_exec(). Signed-off-by: Song Liu <song@kernel.org> --- arch/x86/kernel/alternative.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)