[PATCH 5/7] RISC-V: fix auipc-jalr addresses in patched alternatives
Heiko Stübner
heiko at sntech.de
Thu Nov 17 03:51:02 PST 2022
Am Dienstag, 15. November 2022, 15:28:27 CET schrieb Lad, Prabhakar:
> Hi Heiko,
>
> Thank you for the patch.
>
> On Thu, Nov 10, 2022 at 4:50 PM Heiko Stuebner <heiko at sntech.de> wrote:
> >
> > From: Heiko Stuebner <heiko.stuebner at vrull.eu>
> >
> > Alternatives live in a different section, so addresses used by call
> > functions will point to wrong locations after the patch got applied.
> >
> > Similar to arm64, adjust the location to consider that offset.
> >
> > Signed-off-by: Heiko Stuebner <heiko.stuebner at vrull.eu>
> > ---
> > arch/riscv/kernel/cpufeature.c | 79 +++++++++++++++++++++++++++++++++-
> > 1 file changed, 77 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c
> > index 694267d1fe81..026512ca9c4c 100644
> > --- a/arch/riscv/kernel/cpufeature.c
> > +++ b/arch/riscv/kernel/cpufeature.c
> > @@ -298,6 +298,74 @@ static u32 __init_or_module cpufeature_probe(unsigned int stage)
> > return cpu_req_feature;
> > }
> >
> > +#include <asm/parse_asm.h>
> > +
> > +DECLARE_INSN(jalr, MATCH_JALR, MASK_JALR)
> > +DECLARE_INSN(auipc, MATCH_AUIPC, MASK_AUIPC)
> > +
> > +static inline bool is_auipc_jalr_pair(long insn1, long insn2)
> > +{
> > + return is_auipc_insn(insn1) && is_jalr_insn(insn2);
> > +}
> > +
> > +#define JALR_SIGN_MASK BIT(I_IMM_SIGN_OPOFF - I_IMM_11_0_OPOFF)
> > +#define JALR_OFFSET_MASK I_IMM_11_0_MASK
> > +#define AUIPC_OFFSET_MASK U_IMM_31_12_MASK
> > +#define AUIPC_PAD (0x00001000)
> > +#define JALR_SHIFT I_IMM_11_0_OPOFF
> > +
> > +#define to_jalr_imm(offset) \
> > + ((offset & I_IMM_11_0_MASK) << I_IMM_11_0_OPOFF)
> > +
> > +#define to_auipc_imm(offset) \
> > + ((offset & JALR_SIGN_MASK) ? \
> > + ((offset & AUIPC_OFFSET_MASK) + AUIPC_PAD) : \
> > + (offset & AUIPC_OFFSET_MASK))
> > +
> > +static void riscv_alternative_fix_auipc_jalr(unsigned int *alt_ptr,
> > + unsigned int len, int patch_offset)
> > +{
>
> I am yet to test this with my ASM code yet, but maybe can we move this
> to [0] so that other erratas can make use of it too?
>
> [0] arch/riscv/kernel/patch.c
yeah, that sounds like a very good plan.
I also want to make the to_foo_imm macros shared.
I.e. right now they're just duplicated from the ftrace patching code.
Heiko
More information about the linux-riscv
mailing list