Skip to content

Commit b56eeb9

Browse files
authored
Merge pull request #9730 from douzzer/20251126-linuxkm-full-reloc-support
20251126-linuxkm-full-reloc-support
2 parents ff28a11 + f2f9d5b commit b56eeb9

File tree

10 files changed

+496
-199
lines changed

10 files changed

+496
-199
lines changed

.github/workflows/linuxkm.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ jobs:
1717
strategy:
1818
matrix:
1919
config: [
20-
'EXTRA_CPPFLAGS=-Werror --enable-option-checking=fatal --enable-linuxkm --enable-linuxkm-lkcapi-register=all --enable-all --enable-kyber=yes,original --enable-lms --enable-xmss --enable-dilithium --enable-experimental --enable-dual-alg-certs --disable-qt --disable-quic --with-sys-crypto-policy=no --disable-opensslextra --disable-testcert --enable-intelasm --disable-sp-asm --enable-crypttests --enable-linuxkm-benchmarks CFLAGS="-DWOLFSSL_LINUXKM_VERBOSE_DEBUG -Wframe-larger-than=2048 -Wstack-usage=4096 -DBENCH_EMBEDDED -DBENCH_MIN_RUNTIME_SEC=0.01 -DBENCH_NTIMES=1 -DBENCH_AGREETIMES=1" --with-max-rsa-bits=16384',
21-
'EXTRA_CPPFLAGS=-Werror --enable-option-checking=fatal --enable-linuxkm --enable-linuxkm-pie --enable-reproducible-build --enable-linuxkm-lkcapi-register=all --enable-all-crypto --enable-cryptonly --enable-kyber=yes,original --enable-lms --enable-xmss --enable-dilithium --enable-experimental --disable-qt --disable-quic --with-sys-crypto-policy=no --disable-opensslextra --disable-testcert --enable-intelasm --disable-sp-asm --enable-crypttests --enable-linuxkm-benchmarks CFLAGS="-DWOLFSSL_LINUXKM_VERBOSE_DEBUG -Wframe-larger-than=2048 -Wstack-usage=4096 -DBENCH_EMBEDDED -DBENCH_MIN_RUNTIME_SEC=0.01 -DBENCH_NTIMES=1 -DBENCH_AGREETIMES=1" --with-max-rsa-bits=16384'
20+
'EXTRA_CPPFLAGS=-Werror --enable-option-checking=fatal --enable-linuxkm --enable-linuxkm-lkcapi-register=all --enable-all --enable-kyber=yes,original --enable-lms --enable-xmss --enable-dilithium --enable-experimental --enable-dual-alg-certs --disable-qt --disable-quic --with-sys-crypto-policy=no --disable-testcert --enable-all-asm --enable-crypttests --enable-linuxkm-benchmarks CFLAGS="-Wframe-larger-than=2048 -Wstack-usage=4096 -DBENCH_EMBEDDED -DBENCH_MIN_RUNTIME_SEC=0.01 -DBENCH_NTIMES=1 -DBENCH_AGREETIMES=1" --with-max-rsa-bits=16384',
21+
'EXTRA_CPPFLAGS=-Werror --enable-option-checking=fatal --enable-linuxkm --enable-linuxkm-pie --enable-reproducible-build --enable-linuxkm-lkcapi-register=all --enable-all-crypto --enable-cryptonly --enable-kyber=yes,original --enable-lms --enable-xmss --enable-dilithium --enable-experimental --disable-qt --disable-quic --with-sys-crypto-policy=no --disable-opensslextra --disable-testcert --enable-intelasm --disable-sp-asm --enable-crypttests --enable-linuxkm-benchmarks CFLAGS="-DWOLFSSL_LINUXKM_VERBOSE_DEBUG -DDEBUG_LINUXKM_PIE_SUPPORT -Wframe-larger-than=2048 -Wstack-usage=4096 -DBENCH_EMBEDDED -DBENCH_MIN_RUNTIME_SEC=0.01 -DBENCH_NTIMES=1 -DBENCH_AGREETIMES=1" --with-max-rsa-bits=16384'
2222
]
2323
name: build module
2424
if: github.repository_owner == 'wolfssl'

linuxkm/Makefile

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ GENERATE_RELOC_TAB := $(AWK) ' \
148148
bad_relocs=0; \
149149
print "\#include <wolfssl/wolfcrypt/libwolfssl_sources.h>"; \
150150
printf("%s\n ", \
151-
"WOLFSSL_LOCAL const unsigned int wc_linuxkm_pie_reloc_tab[] = { "); \
151+
"WOLFSSL_LOCAL const struct wc_linuxkm_pie_reloc_tab_ent wc_linuxkm_pie_reloc_tab[] = { "); \
152152
if ("SECTION_MAP" in ENVIRON) { \
153153
while (getline <ENVIRON["SECTION_MAP"] > 0) \
154154
section_map[$$1] = $$2; \
@@ -177,44 +177,45 @@ GENERATE_RELOC_TAB := $(AWK) ' \
177177
if (section) { \
178178
switch (section) { \
179179
case ".text_wolfcrypt": \
180-
section_tag = 0; \
180+
section_tag = "WC_R_SEG_TEXT"; \
181181
break; \
182182
case ".rodata_wolfcrypt": \
183-
section_tag = 1; \
183+
section_tag = "WC_R_SEG_RODATA"; \
184184
break; \
185185
case ".data_wolfcrypt": \
186-
section_tag = 2; \
186+
section_tag = "WC_R_SEG_RWDATA"; \
187187
break; \
188188
case ".bss_wolfcrypt": \
189-
section_tag = 3; \
189+
section_tag = "WC_R_SEG_BSS"; \
190190
break; \
191191
default: \
192192
print "Unexpected section:\n" $$0 >"/dev/stderr"; \
193193
++bad_relocs; \
194-
section_tag = 4; \
194+
section_tag = "WC_R_SEG_OTHER"; \
195195
} \
196196
} else { \
197197
print "Unresolvable symbol reference for relocation:\n" $$0 >"/dev/stderr";\
198198
++bad_relocs; \
199-
section_tag = 4; \
199+
section_tag = "WC_R_SEG_OTHER"; \
200200
} \
201+
reloc_type = $$3; \
201202
if (strtonum("0x" gensub("^0*","",1,$$1)) >= lshift(1, 29)) { \
202203
print "Relocation offset overflow:" >"/dev/stderr"; \
203204
print >"/dev/stderr"; \
204205
exit(1); \
205206
} \
206-
printf("0x%xU%s", \
207-
or(strtonum("0x" gensub("^0*","",1,$$1)), \
208-
lshift(section_tag, 29)), \
209-
((++n%8) ? ", " : ",\n ")); \
207+
printf(" { .offset = 0x%xU, .dest_segment = %s, .reloc_type = WC_%s },\n", \
208+
strtonum("0x" gensub("^0*","",1,$$1)), \
209+
section_tag, reloc_type); \
210210
} \
211211
} \
212212
END { \
213213
if (bad_relocs) { \
214214
print "Found " bad_relocs " unresolvable relocations." >"/dev/stderr"; \
215215
exit(1); \
216216
} \
217-
print "~0U };\nWOLFSSL_LOCAL const unsigned long wc_linuxkm_pie_reloc_tab_length = sizeof wc_linuxkm_pie_reloc_tab / sizeof wc_linuxkm_pie_reloc_tab[0];";\
217+
print " { .offset = ~0U, .dest_segment = WC_R_SEG_NONE, .reloc_type = WC_R_NONE } };"; \
218+
print "WOLFSSL_LOCAL const unsigned long wc_linuxkm_pie_reloc_tab_length = sizeof wc_linuxkm_pie_reloc_tab / sizeof wc_linuxkm_pie_reloc_tab[0];"; \
218219
}'
219220

220221
ifeq "$(V)" "1"

linuxkm/linuxkm_wc_port.h

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,31 @@
483483
#ifndef WC_CONTAINERIZE_THIS
484484
#include <linux/kthread.h>
485485
#include <linux/net.h>
486-
#endif
486+
#ifndef WOLFCRYPT_ONLY
487+
#include <linux/inet.h>
488+
static inline int wc_linuxkm_inet_pton(int af, const char *src, void *dst)
489+
{
490+
int ret;
491+
492+
if (!src || !dst)
493+
return -EFAULT;
494+
495+
switch (af) {
496+
case AF_INET:
497+
ret = in4_pton(src, -1, (u8 *)dst, '\0', NULL);
498+
return ret == 1 ? 1 : 0;
499+
500+
case AF_INET6:
501+
ret = in6_pton(src, -1, (u8 *)dst, '\0', NULL);
502+
return ret == 1 ? 1 : 0;
503+
504+
default:
505+
return -EAFNOSUPPORT;
506+
}
507+
}
508+
#define XINET_PTON(af, src, dst) wc_linuxkm_inet_pton(af, src, dst)
509+
#endif /* !WOLFCRYPT_ONLY */
510+
#endif /* !WC_CONTAINERIZE_THIS */
487511

488512
#include <linux/slab.h>
489513
#include <linux/sched.h>
@@ -815,7 +839,52 @@
815839
__wc_bss_start[],
816840
__wc_bss_end[];
817841

818-
extern const unsigned int wc_linuxkm_pie_reloc_tab[];
842+
struct wc_linuxkm_pie_reloc_tab_ent {
843+
unsigned int offset;
844+
#define WC_RELOC_DEST_SEGMENT_BITS 3
845+
unsigned int dest_segment:WC_RELOC_DEST_SEGMENT_BITS;
846+
#define WC_RELOC_TYPE_BITS 5
847+
unsigned int reloc_type:WC_RELOC_TYPE_BITS;
848+
};
849+
850+
enum wc_reloc_dest_segment {
851+
WC_R_SEG_NONE = 0,
852+
WC_R_SEG_TEXT,
853+
WC_R_SEG_RODATA,
854+
WC_R_SEG_RWDATA,
855+
WC_R_SEG_BSS,
856+
WC_R_SEG_OTHER
857+
};
858+
859+
enum wc_reloc_type {
860+
WC_R_NONE = 0,
861+
WC_R_X86_64_32,
862+
WC_R_X86_64_32S,
863+
WC_R_X86_64_64,
864+
WC_R_X86_64_PC32,
865+
WC_R_X86_64_PLT32,
866+
WC_R_AARCH64_ABS32,
867+
WC_R_AARCH64_ABS64,
868+
WC_R_AARCH64_ADD_ABS_LO12_NC,
869+
WC_R_AARCH64_ADR_PREL_PG_HI21,
870+
WC_R_AARCH64_CALL26,
871+
WC_R_AARCH64_JUMP26,
872+
WC_R_AARCH64_LDST8_ABS_LO12_NC,
873+
WC_R_AARCH64_LDST16_ABS_LO12_NC,
874+
WC_R_AARCH64_LDST32_ABS_LO12_NC,
875+
WC_R_AARCH64_LDST64_ABS_LO12_NC,
876+
WC_R_AARCH64_PREL32,
877+
WC_R_ARM_ABS32,
878+
WC_R_ARM_PREL31,
879+
WC_R_ARM_REL32,
880+
WC_R_ARM_THM_CALL,
881+
WC_R_ARM_THM_JUMP11,
882+
WC_R_ARM_THM_JUMP24,
883+
WC_R_ARM_THM_MOVT_ABS,
884+
WC_R_ARM_THM_MOVW_ABS_NC
885+
};
886+
887+
extern const struct wc_linuxkm_pie_reloc_tab_ent wc_linuxkm_pie_reloc_tab[];
819888
extern const unsigned long wc_linuxkm_pie_reloc_tab_length;
820889
extern ssize_t wc_linuxkm_normalize_relocations(
821890
const u8 *text_in,

0 commit comments

Comments
 (0)