mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86: rework hypercall argument count table instantiation & use
The initial observation were duplicate symbols that our checking warns about. Instead of merely renaming one or both pair(s) of symbols, reduce #ifdef-ary at the same time by moving the instantiation of the arrays into a macro. While doing the conversion also stop open-coding array_access_nospec(). Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Juergen Gross <jgross@suse.com>
This commit is contained in:
1 parent
fe3f50726e
commit
6c987150cf
3 files changed
+11
-28
No files matched your search
@@ -111,11 +111,6 @@ long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
|
||||
return compat_physdev_op(cmd, arg);
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
static const unsigned char hypercall_args_64[] = hypercall_args_hvm64;
|
||||
static const unsigned char hypercall_args_32[] = hypercall_args_hvm32;
|
||||
#endif
|
||||
|
||||
int hvm_hypercall(struct cpu_user_regs *regs)
|
||||
{
|
||||
struct vcpu *curr = current;
|
||||
@@ -177,7 +172,7 @@ int hvm_hypercall(struct cpu_user_regs *regs)
|
||||
regs->r10, regs->r8);
|
||||
|
||||
if ( !curr->hcall_preempted && regs->rax != -ENOSYS )
|
||||
clobber_regs(regs, get_nargs(hypercall_args_64, eax));
|
||||
clobber_regs(regs, eax, hvm, 64);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -190,7 +185,7 @@ int hvm_hypercall(struct cpu_user_regs *regs)
|
||||
curr->hcall_compat = false;
|
||||
|
||||
if ( !curr->hcall_preempted && regs->eax != -ENOSYS )
|
||||
clobber_regs32(regs, get_nargs(hypercall_args_32, eax));
|
||||
clobber_regs(regs, eax, hvm, 32);
|
||||
}
|
||||
|
||||
hvmemul_cache_restore(curr, token);
|
||||
|
||||
@@ -43,18 +43,8 @@ compat_common_vcpu_op(
|
||||
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
#ifndef NDEBUG
|
||||
static inline unsigned int _get_nargs(const unsigned char *tbl, unsigned int c)
|
||||
{
|
||||
return tbl[c];
|
||||
}
|
||||
#define get_nargs(t, c) _get_nargs(t, array_index_nospec(c, ARRAY_SIZE(t)))
|
||||
#else
|
||||
#define get_nargs(tbl, c) 0
|
||||
#endif
|
||||
|
||||
static inline void clobber_regs(struct cpu_user_regs *regs,
|
||||
unsigned int nargs)
|
||||
static inline void clobber_regs64(struct cpu_user_regs *regs,
|
||||
unsigned int nargs)
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
/* Deliberately corrupt used parameter regs. */
|
||||
@@ -85,4 +75,9 @@ static inline void clobber_regs32(struct cpu_user_regs *regs,
|
||||
#endif
|
||||
}
|
||||
|
||||
#define clobber_regs(r, n, t, b) ({ \
|
||||
static const unsigned char t ## b[] = hypercall_args_ ## t ## b; \
|
||||
clobber_regs ## b(r, array_access_nospec(t ## b, n)); \
|
||||
})
|
||||
|
||||
#endif /* __ASM_X86_HYPERCALL_H__ */
|
||||
@@ -27,13 +27,6 @@
|
||||
#include <asm/multicall.h>
|
||||
#include <irq_vectors.h>
|
||||
|
||||
#ifndef NDEBUG
|
||||
static const unsigned char hypercall_args_64[] = hypercall_args_pv64;
|
||||
#ifdef CONFIG_PV32
|
||||
static const unsigned char hypercall_args_32[] = hypercall_args_pv32;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Forced inline to cause 'compat' to be evaluated at compile time. */
|
||||
static void always_inline
|
||||
_pv_hypercall(struct cpu_user_regs *regs, bool compat)
|
||||
@@ -65,7 +58,7 @@ _pv_hypercall(struct cpu_user_regs *regs, bool compat)
|
||||
call_handlers_pv64(eax, regs->rax, rdi, rsi, rdx, r10, r8);
|
||||
|
||||
if ( !curr->hcall_preempted && regs->rax != -ENOSYS )
|
||||
clobber_regs(regs, get_nargs(hypercall_args_64, eax));
|
||||
clobber_regs(regs, eax, pv, 64);
|
||||
}
|
||||
#ifdef CONFIG_PV32
|
||||
else
|
||||
@@ -90,7 +83,7 @@ _pv_hypercall(struct cpu_user_regs *regs, bool compat)
|
||||
curr->hcall_compat = false;
|
||||
|
||||
if ( !curr->hcall_preempted && regs->eax != -ENOSYS )
|
||||
clobber_regs32(regs, get_nargs(hypercall_args_32, eax));
|
||||
clobber_regs(regs, eax, pv, 32);
|
||||
}
|
||||
#endif /* CONFIG_PV32 */
|
||||
|
||||
|
||||