From c8c107a09e268cd89d8596166850d6118da0ea12 Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Tue, 18 Oct 2022 13:34:24 -0500 Subject: [PATCH] linuxkm/: fixes to deal with kernel 6.1+ show_free_areas() mess. --- linuxkm/linuxkm_memory.c | 16 ++++++++++++++++ linuxkm/linuxkm_wc_port.h | 24 ++++++++++++++++++++---- linuxkm/module_hooks.c | 13 +++++++++---- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/linuxkm/linuxkm_memory.c b/linuxkm/linuxkm_memory.c index 8819bca74..a4889704c 100644 --- a/linuxkm/linuxkm_memory.c +++ b/linuxkm/linuxkm_memory.c @@ -305,3 +305,19 @@ return; } #endif /* WOLFSSL_LINUXKM_SIMD_X86 && WOLFSSL_LINUXKM_SIMD_X86_IRQ_ALLOWED */ + +#if defined(__PIE__) && (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) +/* needed in 6.1+ because show_free_areas() static definition in mm.h calls + * __show_free_areas(), which isn't exported (neither was show_free_areas()). + */ +void my__show_free_areas( + unsigned int flags, + nodemask_t *nodemask, + int max_zone_idx) +{ + (void)flags; + (void)nodemask; + (void)max_zone_idx; + return; +} +#endif diff --git a/linuxkm/linuxkm_wc_port.h b/linuxkm/linuxkm_wc_port.h index a822c971f..49e17325f 100644 --- a/linuxkm/linuxkm_wc_port.h +++ b/linuxkm/linuxkm_wc_port.h @@ -105,6 +105,13 @@ */ #undef USE_SPLIT_PMD_PTLOCKS #define USE_SPLIT_PMD_PTLOCKS 0 + + #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + /* without this, static show_free_areas() mm.h brings in direct + * reference to unexported __show_free_areas(). + */ + #define __show_free_areas my__show_free_areas + #endif #endif #include #ifndef SINGLE_THREADED @@ -267,8 +274,13 @@ typeof(kvfree) *kvfree; #endif typeof(is_vmalloc_addr) *is_vmalloc_addr; - typeof(kmem_cache_alloc_trace) *kmem_cache_alloc_trace; - typeof(kmalloc_order_trace) *kmalloc_order_trace; + + #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + typeof(kmalloc_trace) *kmalloc_trace; + #else + typeof(kmem_cache_alloc_trace) *kmem_cache_alloc_trace; + typeof(kmalloc_order_trace) *kmalloc_order_trace; + #endif typeof(get_random_bytes) *get_random_bytes; #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0) @@ -402,8 +414,12 @@ #define kvfree (wolfssl_linuxkm_get_pie_redirect_table()->kvfree) #endif #define is_vmalloc_addr (wolfssl_linuxkm_get_pie_redirect_table()->is_vmalloc_addr) - #define kmem_cache_alloc_trace (wolfssl_linuxkm_get_pie_redirect_table()->kmem_cache_alloc_trace) - #define kmalloc_order_trace (wolfssl_linuxkm_get_pie_redirect_table()->kmalloc_order_trace) + #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + #define kmalloc_trace (wolfssl_linuxkm_get_pie_redirect_table()->kmalloc_trace) + #else + #define kmem_cache_alloc_trace (wolfssl_linuxkm_get_pie_redirect_table()->kmem_cache_alloc_trace) + #define kmalloc_order_trace (wolfssl_linuxkm_get_pie_redirect_table()->kmalloc_order_trace) + #endif #define get_random_bytes (wolfssl_linuxkm_get_pie_redirect_table()->get_random_bytes) #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0) diff --git a/linuxkm/module_hooks.c b/linuxkm/module_hooks.c index 74df63546..608d34611 100644 --- a/linuxkm/module_hooks.c +++ b/linuxkm/module_hooks.c @@ -394,10 +394,15 @@ static int set_up_wolfssl_linuxkm_pie_redirect_table(void) { wolfssl_linuxkm_pie_redirect_table.kvfree = kvfree; #endif wolfssl_linuxkm_pie_redirect_table.is_vmalloc_addr = is_vmalloc_addr; - wolfssl_linuxkm_pie_redirect_table.kmem_cache_alloc_trace = - kmem_cache_alloc_trace; - wolfssl_linuxkm_pie_redirect_table.kmalloc_order_trace = - kmalloc_order_trace; + #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) + wolfssl_linuxkm_pie_redirect_table.kmalloc_trace = + kmalloc_trace; + #else + wolfssl_linuxkm_pie_redirect_table.kmem_cache_alloc_trace = + kmem_cache_alloc_trace; + wolfssl_linuxkm_pie_redirect_table.kmalloc_order_trace = + kmalloc_order_trace; + #endif wolfssl_linuxkm_pie_redirect_table.get_random_bytes = get_random_bytes; #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)