Re: [PATCH] ARC: ARCv2: jump label: implement jump label patching

From: Peter Zijlstra
Date: Wed Jun 19 2019 - 04:17:40 EST


On Tue, Jun 18, 2019 at 04:16:20PM +0000, Vineet Gupta wrote:

> > +/*
> > + * To make atomic update of patched instruction available we need to guarantee
> > + * that this instruction doesn't cross L1 cache line boundary.
> > + *

Oh urgh. Is that the only way ARC can do text patching? We've actually
considered something like this on x86 at some point, but there we have
the 'fun' detail that the i-fetch window does not in fact align with L1
size on all uarchs, so that got complicated real fast.

I'm assuming you've looked at what x86 currently does and found
something like that doesn't work for ARC?

> > +/* Halt system on fatal error to make debug easier */
> > +#define arc_jl_fatal(format...) \
> > +({ \
> > + pr_err(JUMPLABEL_ERR format); \
> > + BUG(); \
>
> Does it make sense to bring down the whole system vs. failing and returning.
> I see there is no error propagation to core code, but still.

It is what x86 does. And I've been fairly adamant about doing so. When
the kernel text is compromised, do you really want to continue running
it?

> > +})
> > +
> > +static inline u32 arc_gen_nop(void)
> > +{
> > + /* 1x 32bit NOP in middle endian */

I dare not ask...

> > + return 0x7000264a;
> > +}
> > +

> > + /*
> > + * All instructions are aligned by 2 bytes so we should never get offset
> > + * here which is not 2 bytes aligned.
> > + */

> > + WRITE_ONCE(*instr_addr, instr);
> > + flush_icache_range(entry->code, entry->code + JUMP_LABEL_NOP_SIZE);

So do you have a 2 byte opcode that traps unconditionally? In that case
I'm thinking you could do something like x86 does. And it would avoid
that NOP padding you do to get the alignment.