[PATCH v3 2/2] arm64/module: Use text-poke API for late relocations.
Dylan Hatch
dylanbhatch at google.com
Thu May 22 13:01:58 PDT 2025
On Thu, May 22, 2025 at 11:43 AM Dylan Hatch <dylanbhatch at 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
More information about the linux-arm-kernel
mailing list