@@ -1516,8 +1516,9 @@ static bool_t check_multicall_32bit_clean(struct multicall_entry *multi)
return true;
}
-void do_multicall_call(struct multicall_entry *multi)
+void arch_do_multicall_call(struct mc_state *state)
{
+ struct multicall_entry *multi = &state->call;
arm_hypercall_fn_t call = NULL;
if ( multi->op >= ARRAY_SIZE(arm_hypercall_table) )
@@ -340,6 +340,34 @@ void pv_hypercall(struct cpu_user_regs *regs)
perfc_incr(hypercalls);
}
+void arch_do_multicall_call(struct mc_state *state)
+{
+ if ( !is_pv_32bit_vcpu(current) )
+ {
+ struct multicall_entry *call = &state->call;
+
+ if ( (call->op < NR_hypercalls) && hypercall_table[call->op] )
+ call->result = hypercall_table[call->op](
+ call->args[0], call->args[1], call->args[2],
+ call->args[3], call->args[4], call->args[5]);
+ else
+ call->result = -ENOSYS;
+ }
+#ifdef CONFIG_COMPAT
+ else
+ {
+ struct compat_multicall_entry *call = &state->compat_call;
+
+ if ( (call->op < NR_hypercalls) && compat_hypercall_table[call->op] )
+ call->result = compat_hypercall_table[call->op](
+ call->args[0], call->args[1], call->args[2],
+ call->args[3], call->args[4], call->args[5]);
+ else
+ call->result = -ENOSYS;
+ }
+#endif
+}
+
/*
* Local variables:
* mode: C
@@ -63,7 +63,7 @@ do_multicall(
trace_multicall_call(&mcs->call);
- do_multicall_call(&mcs->call);
+ arch_do_multicall_call(mcs);
#ifndef NDEBUG
{
deleted file mode 100644
@@ -1,14 +0,0 @@
-#ifndef __ASM_ARM_MULTICALL_H__
-#define __ASM_ARM_MULTICALL_H__
-
-extern void do_multicall_call(struct multicall_entry *call);
-
-#endif /* __ASM_ARM_MULTICALL_H__ */
-/*
- * Local variables:
- * mode: C
- * c-file-style: "BSD"
- * c-basic-offset: 4
- * indent-tabs-mode: nil
- * End:
- */
deleted file mode 100644
@@ -1,72 +0,0 @@
-/******************************************************************************
- * asm-x86/multicall.h
- */
-
-#ifndef __ASM_X86_MULTICALL_H__
-#define __ASM_X86_MULTICALL_H__
-
-#include <xen/errno.h>
-
-#define do_multicall_call(_call) \
- do { \
- __asm__ __volatile__ ( \
- " movq %c1(%0),%%rax; " \
- " leaq hypercall_table(%%rip),%%rdi; " \
- " cmpq $("STR(NR_hypercalls)"),%%rax; " \
- " jae 2f; " \
- " movq (%%rdi,%%rax,8),%%rax; " \
- " movq %c2+0*%c3(%0),%%rdi; " \
- " movq %c2+1*%c3(%0),%%rsi; " \
- " movq %c2+2*%c3(%0),%%rdx; " \
- " movq %c2+3*%c3(%0),%%rcx; " \
- " movq %c2+4*%c3(%0),%%r8; " \
- " movq %c2+5*%c3(%0),%%r9; " \
- " callq *%%rax; " \
- "1: movq %%rax,%c4(%0)\n" \
- ".section .fixup,\"ax\"\n" \
- "2: movq %5,%%rax\n" \
- " jmp 1b\n" \
- ".previous\n" \
- : \
- : "b" (_call), \
- "i" (offsetof(__typeof__(*_call), op)), \
- "i" (offsetof(__typeof__(*_call), args)), \
- "i" (sizeof(*(_call)->args)), \
- "i" (offsetof(__typeof__(*_call), result)), \
- "i" (-ENOSYS) \
- /* all the caller-saves registers */ \
- : "rax", "rcx", "rdx", "rsi", "rdi", \
- "r8", "r9", "r10", "r11" ); \
- } while ( 0 )
-
-#define compat_multicall_call(_call) \
- __asm__ __volatile__ ( \
- " movl %c1(%0),%%eax; " \
- " leaq compat_hypercall_table(%%rip),%%rdi; "\
- " cmpl $("STR(NR_hypercalls)"),%%eax; " \
- " jae 2f; " \
- " movq (%%rdi,%%rax,8),%%rax; " \
- " movl %c2+0*%c3(%0),%%edi; " \
- " movl %c2+1*%c3(%0),%%esi; " \
- " movl %c2+2*%c3(%0),%%edx; " \
- " movl %c2+3*%c3(%0),%%ecx; " \
- " movl %c2+4*%c3(%0),%%r8d; " \
- " movl %c2+5*%c3(%0),%%r9d; " \
- " callq *%%rax; " \
- "1: movl %%eax,%c4(%0)\n" \
- ".section .fixup,\"ax\"\n" \
- "2: movl %5,%%eax\n" \
- " jmp 1b\n" \
- ".previous\n" \
- : \
- : "b" (_call), \
- "i" (offsetof(__typeof__(*_call), op)), \
- "i" (offsetof(__typeof__(*_call), args)), \
- "i" (sizeof(*(_call)->args)), \
- "i" (offsetof(__typeof__(*_call), result)), \
- "i" (-ENOSYS) \
- /* all the caller-saves registers */ \
- : "rax", "rcx", "rdx", "rsi", "rdi", \
- "r8", "r9", "r10", "r11" ) \
-
-#endif /* __ASM_X86_MULTICALL_H__ */
@@ -6,7 +6,6 @@
#define __XEN_MULTICALL_H__
#include <xen/percpu.h>
-#include <asm/multicall.h>
#ifdef CONFIG_COMPAT
#include <compat/xen.h>
#endif
@@ -25,4 +24,6 @@ struct mc_state {
};
};
+void arch_do_multicall_call(struct mc_state *mc);
+
#endif /* __XEN_MULTICALL_H__ */