On Thu, May 22, 2025 at 11:43 AM Dylan Hatch <dylanbha...@google.com> wrote: > -static int reloc_data(enum aarch64_reloc_op op, void *place, u64 val, int > len) > +static int reloc_data(enum aarch64_reloc_op op, void *place, u64 val, int > len, > + struct module *me) > { > s64 sval = do_reloc(op, place, val); > > @@ -66,7 +69,11 @@ static int reloc_data(enum aarch64_reloc_op op, void > *place, u64 val, int len) > > switch (len) { > case 16: > - *(s16 *)place = sval; > + if (me->state != MODULE_STATE_UNFORMED) > + aarch64_insn_set(place, sval, sizeof(s16)); > + else > + *(s16 *)place = sval; > + > switch (op) { > case RELOC_OP_ABS: > if (sval < 0 || sval > U16_MAX) > @@ -82,7 +89,11 @@ static int reloc_data(enum aarch64_reloc_op op, void > *place, u64 val, int len) > } > break; > case 32: > - *(s32 *)place = sval; > + if (me->state != MODULE_STATE_UNFORMED) > + aarch64_insn_set(place, sval, sizeof(s32)); > + else > + *(s32 *)place = sval; > + > switch (op) { > case RELOC_OP_ABS: > if (sval < 0 || sval > U32_MAX) > @@ -98,8 +109,10 @@ static int reloc_data(enum aarch64_reloc_op op, void > *place, u64 val, int len) > } > break; > case 64: > - *(s64 *)place = sval; > - break; > + if (me->state != MODULE_STATE_UNFORMED) > + aarch64_insn_set(place, sval, sizeof(s64)); > + else > + *(s64 *)place = sval; break; > default: > pr_err("Invalid length (%d) for data relocation\n", len); > return 0; > @@ -113,7 +126,8 @@ enum aarch64_insn_movw_imm_type { > };
Don't merge this. I spotted an issue -- for the data relocations this looks like an incorrect usage of aarch64_insn_set(). An updated version will follow soon. Thanks, Dylan