RE: [PATCH v2 06/14] x86/asm: Fix register order
From: David Laight
Date: Fri Oct 22 2021 - 15:27:17 EST
From: Peter Zijlstra
> Sent: 20 October 2021 11:45
>
> Ensure the register order is correct; this allows for easy translation
> between register number and trampoline and vice-versa.
There is an alternate cpp pattern that can be used to have the
same effect.
Possibly less error prone.
Stealing some text from 2 patches you'd have:
asm/GEN-for-each-reg.h would contain:
#define GEN_FOR_EACH_REG(GEN) \
GEN(rax) \
GEN(rcx) \
GEN(rdx) \
GEN(rbx) \
GEN(rsp) \
GEN(rbp) \
GEN(rsi) \
GEN(rdi) \
GEN(r8) \
GEN(r9) \
GEN(r10)
and the user would contain:
#include <asm/GEN-for-each-reg.h>
#define GEN(reg) \
extern asmlinkage void __x86_indirect_thunk_ ## reg (void);
GEN_FOR_EACH_REG(GEN)
#undef GEN
#define GEN(reg) \
extern asmlinkage void __x86_indirect_alt_call_ ## reg (void);
GEN_FOR_EACH_REG(GEN)
#undef GEN
It is probably possible to use ... and _VA_LIST_.
Something like:
#define GEN_FOR_EACH_REG(GEN, ...) \
GEN(rax, _VA_LIST_) \
...
#define GEN_THUNK(reg, thunk) \
extern asmlinkage void thunk ## reg (void);
GEN_FOR_EACH_REG(GEN_THUNK, __x86_indirect_thunk_)
GEN_FOR_EACH_REG(GEN_THUNK, __x86_indirect_alt_call_)
#undef GEN_THUNK
David
-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)