x86/hypercall: Move the hypercall arg tables into C
authorAndrew Cooper <andrew.cooper3@citrix.com>
Mon, 26 Jan 2015 11:25:43 +0000 (11:25 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 6 Sep 2016 12:33:44 +0000 (13:33 +0100)
Editing (and indeed, finding) the hypercall args tables can be tricky,
especially towards the end where .rept's are used to maintain the correct
layout.

Move this all into C, and let the compiler do the hard work.  As 0 is the
default value, drop all explicit 0's.

No functional change.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/Makefile
xen/arch/x86/hypercall.c [new file with mode: 0644]
xen/arch/x86/x86_64/compat/entry.S
xen/arch/x86/x86_64/entry.S

index b49d7cf048cf128b95289a95595dd6da6ec59004..96e6a022352d6cb0f6c7c8ca8253a7d361b7723d 100644 (file)
@@ -28,6 +28,7 @@ obj-y += e820.o
 obj-y += extable.o
 obj-y += flushtlb.o
 obj-$(CONFIG_CRASH_DEBUG) += gdbstub.o
+obj-y += hypercall.o
 obj-y += i387.o
 obj-y += i8259.o
 obj-y += io_apic.o
diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c
new file mode 100644 (file)
index 0000000..4b42f86
--- /dev/null
@@ -0,0 +1,123 @@
+/******************************************************************************
+ * arch/x86/hypercall.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright (c) 2015,2016 Citrix Systems Ltd.
+ */
+
+#include <xen/hypercall.h>
+
+#define ARGS(x, n)                              \
+    [ __HYPERVISOR_ ## x ] = (n)
+
+const uint8_t hypercall_args_table[NR_hypercalls] =
+{
+    ARGS(set_trap_table, 1),
+    ARGS(mmu_update, 4),
+    ARGS(set_gdt, 2),
+    ARGS(stack_switch, 2),
+    ARGS(set_callbacks, 3),
+    ARGS(fpu_taskswitch, 1),
+    ARGS(sched_op_compat, 2),
+    ARGS(platform_op, 1),
+    ARGS(set_debugreg, 2),
+    ARGS(get_debugreg, 1),
+    ARGS(update_descriptor, 2),
+    ARGS(memory_op, 2),
+    ARGS(multicall, 2),
+    ARGS(update_va_mapping, 3),
+    ARGS(set_timer_op, 1),
+    ARGS(event_channel_op_compat, 1),
+    ARGS(xen_version, 2),
+    ARGS(console_io, 3),
+    ARGS(physdev_op_compat, 1),
+    ARGS(grant_table_op, 3),
+    ARGS(vm_assist, 2),
+    ARGS(update_va_mapping_otherdomain, 4),
+    ARGS(vcpu_op, 3),
+    ARGS(set_segment_base, 2),
+    ARGS(mmuext_op, 4),
+    ARGS(xsm_op, 1),
+    ARGS(nmi_op, 2),
+    ARGS(sched_op, 2),
+    ARGS(callback_op, 2),
+    ARGS(xenoprof_op, 2),
+    ARGS(event_channel_op, 2),
+    ARGS(physdev_op, 2),
+    ARGS(hvm_op, 2),
+    ARGS(sysctl, 1),
+    ARGS(domctl, 1),
+    ARGS(kexec_op, 2),
+    ARGS(tmem_op, 1),
+    ARGS(xenpmu_op, 2),
+    ARGS(mca, 1),
+    ARGS(arch_1, 1),
+};
+
+const uint8_t compat_hypercall_args_table[NR_hypercalls] =
+{
+    ARGS(set_trap_table, 1),
+    ARGS(mmu_update, 4),
+    ARGS(set_gdt, 2),
+    ARGS(stack_switch, 2),
+    ARGS(set_callbacks, 4),
+    ARGS(fpu_taskswitch, 1),
+    ARGS(sched_op_compat, 2),
+    ARGS(platform_op, 1),
+    ARGS(set_debugreg, 2),
+    ARGS(get_debugreg, 1),
+    ARGS(update_descriptor, 4),
+    ARGS(memory_op, 2),
+    ARGS(multicall, 2),
+    ARGS(update_va_mapping, 4),
+    ARGS(set_timer_op, 2),
+    ARGS(event_channel_op_compat, 1),
+    ARGS(xen_version, 2),
+    ARGS(console_io, 3),
+    ARGS(physdev_op_compat, 1),
+    ARGS(grant_table_op, 3),
+    ARGS(vm_assist, 2),
+    ARGS(update_va_mapping_otherdomain, 5),
+    ARGS(vcpu_op, 3),
+    ARGS(mmuext_op, 4),
+    ARGS(xsm_op, 1),
+    ARGS(nmi_op, 2),
+    ARGS(sched_op, 2),
+    ARGS(callback_op, 2),
+    ARGS(xenoprof_op, 2),
+    ARGS(event_channel_op, 2),
+    ARGS(physdev_op, 2),
+    ARGS(hvm_op, 2),
+    ARGS(sysctl, 1),
+    ARGS(domctl, 1),
+    ARGS(kexec_op, 2),
+    ARGS(tmem_op, 1),
+    ARGS(xenpmu_op, 2),
+    ARGS(mca, 1),
+    ARGS(arch_1, 1),
+};
+
+#undef ARGS
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
+
index 1b6a482b9c35a5d0cace8ccfb8dee1143f33c55a..f0eae560e9d44e349b863d675742cba1a1cf9e01 100644 (file)
@@ -480,54 +480,3 @@ ENTRY(compat_hypercall_table)
         .rept NR_hypercalls-((.-compat_hypercall_table)/8)
         .quad compat_ni_hypercall
         .endr
-
-ENTRY(compat_hypercall_args_table)
-        .byte 1 /* compat_set_trap_table    */  /*  0 */
-        .byte 4 /* compat_mmu_update        */
-        .byte 2 /* compat_set_gdt           */
-        .byte 2 /* compat_stack_switch      */
-        .byte 4 /* compat_set_callbacks     */
-        .byte 1 /* compat_fpu_taskswitch    */  /*  5 */
-        .byte 2 /* compat_sched_op_compat   */
-        .byte 1 /* compat_platform_op       */
-        .byte 2 /* compat_set_debugreg      */
-        .byte 1 /* compat_get_debugreg      */
-        .byte 4 /* compat_update_descriptor */  /* 10 */
-        .byte 0 /* compat_ni_hypercall      */
-        .byte 2 /* compat_memory_op         */
-        .byte 2 /* compat_multicall         */
-        .byte 4 /* compat_update_va_mapping */
-        .byte 2 /* compat_set_timer_op      */  /* 15 */
-        .byte 1 /* compat_event_channel_op_compat */
-        .byte 2 /* compat_xen_version       */
-        .byte 3 /* compat_console_io        */
-        .byte 1 /* compat_physdev_op_compat */
-        .byte 3 /* compat_grant_table_op    */  /* 20 */
-        .byte 2 /* compat_vm_assist         */
-        .byte 5 /* compat_update_va_mapping_otherdomain */
-        .byte 0 /* compat_iret              */
-        .byte 3 /* compat_vcpu_op           */
-        .byte 0 /* compat_ni_hypercall      */  /* 25 */
-        .byte 4 /* compat_mmuext_op         */
-        .byte 1 /* do_xsm_op                */
-        .byte 2 /* compat_nmi_op            */
-        .byte 2 /* compat_sched_op          */
-        .byte 2 /* compat_callback_op       */  /* 30 */
-        .byte 2 /* compat_xenoprof_op       */
-        .byte 2 /* compat_event_channel_op  */
-        .byte 2 /* compat_physdev_op        */
-        .byte 2 /* do_hvm_op                */
-        .byte 1 /* do_sysctl                */  /* 35 */
-        .byte 1 /* do_domctl                */
-        .byte 2 /* compat_kexec_op          */
-        .byte 1 /* do_tmem_op               */
-        .byte 0 /* reserved for XenClient   */
-        .byte 2 /* do_xenpmu_op             */  /* 40 */
-        .rept __HYPERVISOR_arch_0-(.-compat_hypercall_args_table)
-        .byte 0 /* compat_ni_hypercall      */
-        .endr
-        .byte 1 /* do_mca                   */
-        .byte 1 /* paging_domctl_continuation      */
-        .rept NR_hypercalls-(.-compat_hypercall_args_table)
-        .byte 0 /* compat_ni_hypercall      */
-        .endr
index 64d260a67d7590f89eff3f49d195d632e50bbbc5..086fcec8a2cf1a4c7ca8bb612fc1e3fbbf3c5f59 100644 (file)
@@ -803,57 +803,6 @@ ENTRY(hypercall_table)
         .quad do_ni_hypercall
         .endr
 
-ENTRY(hypercall_args_table)
-        .byte 1 /* do_set_trap_table    */  /*  0 */
-        .byte 4 /* do_mmu_update        */
-        .byte 2 /* do_set_gdt           */
-        .byte 2 /* do_stack_switch      */
-        .byte 3 /* do_set_callbacks     */
-        .byte 1 /* do_fpu_taskswitch    */  /*  5 */
-        .byte 2 /* do_sched_op_compat   */
-        .byte 1 /* do_platform_op       */
-        .byte 2 /* do_set_debugreg      */
-        .byte 1 /* do_get_debugreg      */
-        .byte 2 /* do_update_descriptor */  /* 10 */
-        .byte 0 /* do_ni_hypercall      */
-        .byte 2 /* do_memory_op         */
-        .byte 2 /* do_multicall         */
-        .byte 3 /* do_update_va_mapping */
-        .byte 1 /* do_set_timer_op      */  /* 15 */
-        .byte 1 /* do_event_channel_op_compat */
-        .byte 2 /* do_xen_version       */
-        .byte 3 /* do_console_io        */
-        .byte 1 /* do_physdev_op_compat */
-        .byte 3 /* do_grant_table_op    */  /* 20 */
-        .byte 2 /* do_vm_assist         */
-        .byte 4 /* do_update_va_mapping_otherdomain */
-        .byte 0 /* do_iret              */
-        .byte 3 /* do_vcpu_op           */
-        .byte 2 /* do_set_segment_base  */  /* 25 */
-        .byte 4 /* do_mmuext_op         */
-        .byte 1 /* do_xsm_op            */
-        .byte 2 /* do_nmi_op            */
-        .byte 2 /* do_sched_op          */
-        .byte 2 /* do_callback_op       */  /* 30 */
-        .byte 2 /* do_xenoprof_op       */
-        .byte 2 /* do_event_channel_op  */
-        .byte 2 /* do_physdev_op        */
-        .byte 2 /* do_hvm_op            */
-        .byte 1 /* do_sysctl            */  /* 35 */
-        .byte 1 /* do_domctl            */
-        .byte 2 /* do_kexec             */
-        .byte 1 /* do_tmem_op           */
-        .byte 0 /* reserved for XenClient */
-        .byte 2 /* do_xenpmu_op         */  /* 40 */
-        .rept __HYPERVISOR_arch_0-(.-hypercall_args_table)
-        .byte 0 /* do_ni_hypercall      */
-        .endr
-        .byte 1 /* do_mca               */  /* 48 */
-        .byte 1 /* paging_domctl_continuation */
-        .rept NR_hypercalls-(.-hypercall_args_table)
-        .byte 0 /* do_ni_hypercall      */
-        .endr
-
 /* Table of automatically generated entry points.  One per vector. */
         .section .init.rodata, "a", @progbits
 GLOBAL(autogen_entrypoints)