Skip to content

Commit a444f7d

Browse files
laurenmurphyx64fabiobaltieri
authored andcommitted
llext: add reloc and symbols for mwdt
Adds relocation and symbols generated by MWDT while using it for NSIM VPX5. Signed-off-by: Lauren Murphy <[email protected]>
1 parent a4274f8 commit a444f7d

File tree

2 files changed

+116
-2
lines changed

2 files changed

+116
-2
lines changed

arch/arc/core/elf.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ LOG_MODULE_REGISTER(elf, CONFIG_LLEXT_LOG_LEVEL);
1515

1616
#define R_ARC_32 4
1717
#define R_ARC_B26 5 /* AKA R_ARC_64 */
18+
#define R_ARC_S25H_PCREL 16
1819
#define R_ARC_S25W_PCREL 17
1920
#define R_ARC_32_ME 27
2021

@@ -68,12 +69,28 @@ int arch_elf_relocate(struct llext_loader *ldr, struct llext *ext, elf_rela_t *r
6869
case R_ARC_B26:
6970
UNALIGNED_PUT(sym_base_addr, (uint32_t *)loc);
7071
break;
71-
case R_ARC_S25W_PCREL:
72-
/* ((S + A) - P) >> 2
72+
case R_ARC_S25H_PCREL:
73+
/* ((S + A) - P) >> 1
7374
* S = symbol address
7475
* A = addend
7576
* P = relative offset to PCL
7677
*/
78+
value = (sym_base_addr + rel->r_addend - (loc & ~0x3)) >> 1;
79+
80+
insn = ME(insn);
81+
82+
/* disp25h */
83+
insn = insn & ~0x7feffcf;
84+
insn |= ((value >> 0) & 0x03ff) << 17;
85+
insn |= ((value >> 10) & 0x03ff) << 6;
86+
insn |= ((value >> 20) & 0x000f) << 0;
87+
88+
insn = ME(insn);
89+
90+
UNALIGNED_PUT(insn, (uint32_t *)loc);
91+
break;
92+
case R_ARC_S25W_PCREL:
93+
/* ((S + A) - P) >> 2 */
7794
value = (sym_base_addr + rel->r_addend - (loc & ~0x3)) >> 2;
7895

7996
insn = ME(insn);

subsys/llext/llext_export.c

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,101 @@ EXPORT_SYMBOL(memcmp);
1616
EXPORT_SYMBOL(memcpy);
1717
EXPORT_SYMBOL(memset);
1818

19+
/* These symbols are used if CCAC is given the flag -Os */
20+
#ifdef __CCAC__
21+
extern void __ac_mc_va(void);
22+
extern void __ac_push_13_to_13(void);
23+
extern void __ac_push_13_to_14(void);
24+
extern void __ac_push_13_to_15(void);
25+
extern void __ac_push_13_to_16(void);
26+
extern void __ac_push_13_to_17(void);
27+
extern void __ac_push_13_to_18(void);
28+
extern void __ac_push_13_to_19(void);
29+
extern void __ac_push_13_to_20(void);
30+
extern void __ac_push_13_to_21(void);
31+
extern void __ac_push_13_to_22(void);
32+
extern void __ac_push_13_to_23(void);
33+
extern void __ac_push_13_to_24(void);
34+
extern void __ac_push_13_to_25(void);
35+
extern void __ac_push_13_to_26(void);
36+
extern void __ac_push_none(void);
37+
extern void __ac_pop_13_to_13(void);
38+
extern void __ac_pop_13_to_13v(void);
39+
extern void __ac_pop_13_to_14(void);
40+
extern void __ac_pop_13_to_14v(void);
41+
extern void __ac_pop_13_to_15(void);
42+
extern void __ac_pop_13_to_15v(void);
43+
extern void __ac_pop_13_to_16(void);
44+
extern void __ac_pop_13_to_16v(void);
45+
extern void __ac_pop_13_to_17(void);
46+
extern void __ac_pop_13_to_17v(void);
47+
extern void __ac_pop_13_to_18(void);
48+
extern void __ac_pop_13_to_18v(void);
49+
extern void __ac_pop_13_to_19(void);
50+
extern void __ac_pop_13_to_19v(void);
51+
extern void __ac_pop_13_to_20(void);
52+
extern void __ac_pop_13_to_20v(void);
53+
extern void __ac_pop_13_to_21(void);
54+
extern void __ac_pop_13_to_21v(void);
55+
extern void __ac_pop_13_to_22(void);
56+
extern void __ac_pop_13_to_22v(void);
57+
extern void __ac_pop_13_to_23(void);
58+
extern void __ac_pop_13_to_23v(void);
59+
extern void __ac_pop_13_to_24(void);
60+
extern void __ac_pop_13_to_24v(void);
61+
extern void __ac_pop_13_to_25(void);
62+
extern void __ac_pop_13_to_25v(void);
63+
extern void __ac_pop_13_to_26(void);
64+
extern void __ac_pop_13_to_26v(void);
65+
extern void __ac_pop_none(void);
66+
extern void __ac_pop_nonev(void);
67+
68+
EXPORT_SYMBOL(__ac_mc_va);
69+
EXPORT_SYMBOL(__ac_push_13_to_13);
70+
EXPORT_SYMBOL(__ac_push_13_to_14);
71+
EXPORT_SYMBOL(__ac_push_13_to_15);
72+
EXPORT_SYMBOL(__ac_push_13_to_16);
73+
EXPORT_SYMBOL(__ac_push_13_to_17);
74+
EXPORT_SYMBOL(__ac_push_13_to_18);
75+
EXPORT_SYMBOL(__ac_push_13_to_19);
76+
EXPORT_SYMBOL(__ac_push_13_to_20);
77+
EXPORT_SYMBOL(__ac_push_13_to_21);
78+
EXPORT_SYMBOL(__ac_push_13_to_22);
79+
EXPORT_SYMBOL(__ac_push_13_to_23);
80+
EXPORT_SYMBOL(__ac_push_13_to_24);
81+
EXPORT_SYMBOL(__ac_push_13_to_25);
82+
EXPORT_SYMBOL(__ac_push_13_to_26);
83+
EXPORT_SYMBOL(__ac_push_none);
84+
EXPORT_SYMBOL(__ac_pop_13_to_13);
85+
EXPORT_SYMBOL(__ac_pop_13_to_13v);
86+
EXPORT_SYMBOL(__ac_pop_13_to_14);
87+
EXPORT_SYMBOL(__ac_pop_13_to_14v);
88+
EXPORT_SYMBOL(__ac_pop_13_to_15);
89+
EXPORT_SYMBOL(__ac_pop_13_to_15v);
90+
EXPORT_SYMBOL(__ac_pop_13_to_16);
91+
EXPORT_SYMBOL(__ac_pop_13_to_16v);
92+
EXPORT_SYMBOL(__ac_pop_13_to_17);
93+
EXPORT_SYMBOL(__ac_pop_13_to_17v);
94+
EXPORT_SYMBOL(__ac_pop_13_to_18);
95+
EXPORT_SYMBOL(__ac_pop_13_to_18v);
96+
EXPORT_SYMBOL(__ac_pop_13_to_19);
97+
EXPORT_SYMBOL(__ac_pop_13_to_19v);
98+
EXPORT_SYMBOL(__ac_pop_13_to_20);
99+
EXPORT_SYMBOL(__ac_pop_13_to_20v);
100+
EXPORT_SYMBOL(__ac_pop_13_to_21);
101+
EXPORT_SYMBOL(__ac_pop_13_to_21v);
102+
EXPORT_SYMBOL(__ac_pop_13_to_22);
103+
EXPORT_SYMBOL(__ac_pop_13_to_22v);
104+
EXPORT_SYMBOL(__ac_pop_13_to_23);
105+
EXPORT_SYMBOL(__ac_pop_13_to_23v);
106+
EXPORT_SYMBOL(__ac_pop_13_to_24);
107+
EXPORT_SYMBOL(__ac_pop_13_to_24v);
108+
EXPORT_SYMBOL(__ac_pop_13_to_25);
109+
EXPORT_SYMBOL(__ac_pop_13_to_25v);
110+
EXPORT_SYMBOL(__ac_pop_13_to_26);
111+
EXPORT_SYMBOL(__ac_pop_13_to_26v);
112+
EXPORT_SYMBOL(__ac_pop_none);
113+
EXPORT_SYMBOL(__ac_pop_nonev);
114+
#endif
115+
19116
#include <zephyr/syscall_exports_llext.c>

0 commit comments

Comments
 (0)