Skip to content

Commit 7bad79a

Browse files
authored
Merge pull request #10512 from douzzer/20260520-linuxkm-7v2
20260520-linuxkm-7v2
2 parents 7827872 + 7164d75 commit 7bad79a

3 files changed

Lines changed: 96 additions & 1 deletion

File tree

.wolfssl_known_macro_extras

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,7 @@ WC_FORCE_LINUXKM_FORTIFY_SOURCE
660660
WC_HASH_CUSTOM_MAX_BLOCK_SIZE
661661
WC_HASH_CUSTOM_MAX_DIGEST_SIZE
662662
WC_HASH_CUSTOM_MIN_DIGEST_SIZE
663+
WC_LINUXKM_NO_USE_HEAP_WRAPPERS
663664
WC_MLKEM_KERNEL_ASM
664665
WC_NO_ASYNC_SLEEP
665666
WC_NO_RNG_SIMPLE

linuxkm/linuxkm_wc_port.h

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,13 @@
249249
#define LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT
250250
#endif
251251

252+
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)) && \
253+
defined(WC_SYM_RELOC_TABLES) && \
254+
!defined(WC_LINUXKM_NO_USE_HEAP_WRAPPERS) && \
255+
!defined(WC_LINUXKM_USE_HEAP_WRAPPERS)
256+
#define WC_LINUXKM_USE_HEAP_WRAPPERS
257+
#endif
258+
252259
#ifdef BUILDING_WOLFSSL
253260

254261
#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0)) || \
@@ -521,6 +528,13 @@
521528
#include <linux/mm.h>
522529
#endif
523530

531+
#ifdef WC_LINUXKM_USE_HEAP_WRAPPERS
532+
WOLFSSL_API void *wc_linuxkm_malloc(size_t size);
533+
WOLFSSL_API void wc_linuxkm_free(void *ptr);
534+
WOLFSSL_API void *wc_linuxkm_realloc(void *ptr, size_t newsize);
535+
WOLFSSL_API size_t wc_linuxkm_malloc_usable_size(void *ptr);
536+
#endif
537+
524538
#ifndef WC_CONTAINERIZE_THIS
525539
#include <linux/kthread.h>
526540
#include <linux/net.h>
@@ -973,6 +987,12 @@
973987

974988
const unsigned char *_ctype;
975989

990+
#ifdef WC_LINUXKM_USE_HEAP_WRAPPERS
991+
typeof(wc_linuxkm_malloc) *wc_linuxkm_malloc;
992+
typeof(wc_linuxkm_free) *wc_linuxkm_free;
993+
typeof(wc_linuxkm_realloc) *wc_linuxkm_realloc;
994+
typeof(wc_linuxkm_malloc_usable_size) *wc_linuxkm_malloc_usable_size;
995+
#else /* !WC_LINUXKM_USE_HEAP_WRAPPERS */
976996
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 18, 0)
977997
typeof(kmalloc_noprof) *kmalloc_noprof;
978998
typeof(krealloc_node_align_noprof) *krealloc_node_align_noprof;
@@ -1023,6 +1043,7 @@
10231043
#endif
10241044
typeof(kfree) *kfree;
10251045
typeof(ksize) *ksize;
1046+
#endif /* !WC_LINUXKM_USE_HEAP_WRAPPERS */
10261047

10271048
#ifndef LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT
10281049
typeof(get_random_bytes) *get_random_bytes;
@@ -1313,6 +1334,11 @@
13131334

13141335
#define _ctype WC_PIE_INDIRECT_SYM(_ctype)
13151336

1337+
#ifdef WC_LINUXKM_USE_HEAP_WRAPPERS
1338+
/* no native heap call masking -- wc_linuxkm wrapper functions bound
1339+
* directly to malloc() and friends.
1340+
*/
1341+
#else /* !WC_LINUXKM_USE_HEAP_WRAPPERS */
13161342
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 18, 0)
13171343
/* see include/linux/alloc_tag.h and include/linux/slab.h */
13181344
#define kmalloc_noprof WC_PIE_INDIRECT_SYM(kmalloc_noprof)
@@ -1368,6 +1394,7 @@
13681394
#define kvfree WC_PIE_INDIRECT_SYM(kvfree)
13691395
#endif
13701396
#define ksize WC_PIE_INDIRECT_SYM(ksize)
1397+
#endif /* !WC_LINUXKM_USE_HEAP_WRAPPERS */
13711398

13721399
#ifndef LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT
13731400
#define get_random_bytes WC_PIE_INDIRECT_SYM(get_random_bytes)
@@ -1705,6 +1732,12 @@
17051732
#error WOLFSSL_USE_SAVE_VECTOR_REGISTERS is set for an unimplemented architecture.
17061733
#endif /* !CONFIG_X86 */
17071734
#endif /* WOLFSSL_USE_SAVE_VECTOR_REGISTERS */
1735+
#ifdef WC_LINUXKM_USE_HEAP_WRAPPERS
1736+
WOLFSSL_API extern void *wc_linuxkm_malloc(size_t size);
1737+
WOLFSSL_API void wc_linuxkm_free(void *ptr);
1738+
WOLFSSL_API void *wc_linuxkm_realloc(void *ptr, size_t newsize);
1739+
WOLFSSL_API size_t wc_linuxkm_malloc_usable_size(void *ptr);
1740+
#endif
17081741
#endif /* !BUILDING_WOLFSSL */
17091742

17101743
/* Copied from wc_port.h */
@@ -1859,9 +1892,25 @@
18591892
((sizeof(_alloc_sz) * 8UL) - __builtin_clzl(_alloc_sz - 1)); \
18601893
_alloc_sz; \
18611894
})
1895+
1896+
#ifdef WC_LINUXKM_USE_HEAP_WRAPPERS
1897+
#ifdef WC_CONTAINERIZE_THIS
1898+
#define malloc(size) WC_PIE_INDIRECT_SYM(wc_linuxkm_malloc)(size)
1899+
#define free(ptr) WC_PIE_INDIRECT_SYM(wc_linuxkm_free)(ptr)
1900+
#define realloc(ptr, newsize) WC_PIE_INDIRECT_SYM(wc_linuxkm_realloc)(ptr, newsize)
1901+
#else
1902+
#define malloc(size) wc_linuxkm_malloc(size)
1903+
#define free(ptr) wc_linuxkm_free(ptr)
1904+
#define realloc(ptr, newsize) wc_linuxkm_realloc(ptr, newsize)
1905+
#endif
1906+
#else /* !WC_LINUXKM_USE_HEAP_WRAPPERS */
18621907
#ifdef USE_KVMALLOC
18631908
#define malloc(size) kvmalloc_node(WC_LINUXKM_ROUND_UP_P_OF_2(size), (preempt_count() == 0 ? GFP_KERNEL : GFP_ATOMIC), NUMA_NO_NODE)
1864-
#define free(ptr) kvfree(ptr)
1909+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 2, 0)
1910+
#define free(ptr) (preempt_count() == 0 ? kvfree(ptr) : kvfree_atomic(ptr))
1911+
#else
1912+
#define free(ptr) kvfree(ptr)
1913+
#endif
18651914
#ifdef USE_KVREALLOC
18661915
#define realloc(ptr, newsize) kvrealloc(ptr, WC_LINUXKM_ROUND_UP_P_OF_2(newsize), (preempt_count() == 0 ? GFP_KERNEL : GFP_ATOMIC))
18671916
#else
@@ -1872,6 +1921,7 @@
18721921
#define free(ptr) kfree(ptr)
18731922
#define realloc(ptr, newsize) krealloc(ptr, WC_LINUXKM_ROUND_UP_P_OF_2(newsize), (preempt_count() == 0 ? GFP_KERNEL : GFP_ATOMIC))
18741923
#endif
1924+
#endif /* !WC_LINUXKM_USE_HEAP_WRAPPERS */
18751925

18761926
#ifndef static_assert
18771927
#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)

linuxkm/module_hooks.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1275,6 +1275,41 @@ static const struct wc_reloc_table_segments seg_map = {
12751275

12761276
#endif /* !WC_SYM_RELOC_TABLES && HAVE_FIPS */
12771277

1278+
#ifdef WC_LINUXKM_USE_HEAP_WRAPPERS
1279+
1280+
#ifndef USE_KVREALLOC
1281+
#error WC_LINUXKM_USE_HEAP_WRAPPERS requires USE_KVREALLOC
1282+
#endif
1283+
1284+
void *wc_linuxkm_malloc(size_t size)
1285+
{
1286+
return kvmalloc_node(WC_LINUXKM_ROUND_UP_P_OF_2(size), (preempt_count() == 0 ? GFP_KERNEL : GFP_ATOMIC), NUMA_NO_NODE);
1287+
}
1288+
1289+
void wc_linuxkm_free(void *ptr)
1290+
{
1291+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 2, 0)
1292+
if (preempt_count() == 0)
1293+
kvfree(ptr);
1294+
else
1295+
kvfree_atomic(ptr);
1296+
#else
1297+
kvfree(ptr);
1298+
#endif
1299+
}
1300+
1301+
void *wc_linuxkm_realloc(void *ptr, size_t newsize)
1302+
{
1303+
return kvrealloc(ptr, WC_LINUXKM_ROUND_UP_P_OF_2(newsize), (preempt_count() == 0 ? GFP_KERNEL : GFP_ATOMIC));
1304+
}
1305+
1306+
size_t wc_linuxkm_malloc_usable_size(void *ptr)
1307+
{
1308+
return ksize(ptr);
1309+
}
1310+
1311+
#endif /* WC_LINUXKM_USE_HEAP_WRAPPERS */
1312+
12781313
#ifdef WC_SYM_RELOC_TABLES
12791314

12801315
/* get_current() is an inline or macro, depending on the target -- sidestep the
@@ -1361,6 +1396,13 @@ static int set_up_wolfssl_linuxkm_pie_redirect_table(void) {
13611396

13621397
wolfssl_linuxkm_pie_redirect_table._ctype = _ctype;
13631398

1399+
#ifdef WC_LINUXKM_USE_HEAP_WRAPPERS
1400+
wolfssl_linuxkm_pie_redirect_table.wc_linuxkm_malloc = wc_linuxkm_malloc;
1401+
wolfssl_linuxkm_pie_redirect_table.wc_linuxkm_free = wc_linuxkm_free;
1402+
wolfssl_linuxkm_pie_redirect_table.wc_linuxkm_realloc = wc_linuxkm_realloc;
1403+
wolfssl_linuxkm_pie_redirect_table.wc_linuxkm_malloc_usable_size = wc_linuxkm_malloc_usable_size;
1404+
#else /* !WC_LINUXKM_USE_HEAP_WRAPPERS */
1405+
13641406
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 18, 0)
13651407
wolfssl_linuxkm_pie_redirect_table.kmalloc_noprof = kmalloc_noprof;
13661408
wolfssl_linuxkm_pie_redirect_table.krealloc_node_align_noprof = krealloc_node_align_noprof;
@@ -1416,6 +1458,8 @@ static int set_up_wolfssl_linuxkm_pie_redirect_table(void) {
14161458
wolfssl_linuxkm_pie_redirect_table.kvfree = kvfree;
14171459
#endif
14181460

1461+
#endif /* !WC_LINUXKM_USE_HEAP_WRAPPERS */
1462+
14191463
#ifndef LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT
14201464
wolfssl_linuxkm_pie_redirect_table.get_random_bytes = get_random_bytes;
14211465
#endif

0 commit comments

Comments
 (0)