On 03.11.21 16:08, Jan Beulich wrote:
On 03.11.2021 11:20, Juergen Gross wrote:
+# Generate the output
+END {
+    # Verbatim generated lines
+    for (i = 1; i <= e; i++)
+        printf("%s\n", emit[i]);
+    printf("\n");
+    # Generate prototypes
+    for (i = 1; i <= n; i++) {
+        for (p = 1; p <= n_pre[i]; p++) {
+            printf("%s %s_%s(", rettype[pre[i, p]], pre[i, p], fn[i]);
+            if (n_args[i] == 0)
+                printf("void");
+            else
+                for (j = 1; j <= n_args[i]; j++) {
+                    if (j > 1)
+                        printf(", ");
+                    if (ptr[i, j])
+                        printf("XEN_GUEST_HANDLE_PARAM(%s)", typ[i, j]);
+                    else
+                        printf("%s", typ[i, j]);
+                    printf(" %s", arg[i, j]);
+                }
+            printf(");\n");
+        }
+    }
+    # Generate call sequences and args array contents
+    for (ca in caller) {
+        if (caller[ca] != 1)
+            continue;
+        need_mask = 0;
+        for (pl = 1; pl <= n_prios[ca]; pl++) {
+            for (pll = pl; pll > 1; pll--) {
+                if (prio_list[ca, pl] > p_list[pll - 1])
+                    break;
+                else
+                    p_list[pll] = p_list[pll - 1];
+            }
+            p_list[pll] = prio_list[ca, pl];
+            # If any prio but the default one has more than 1 entry we need 
"mask"
+            if (p_list[pll] != 100 && prios[ca, p_list[pll]] > 1)
+                need_mask = 1;
+        }
+        printf("\n");
+        printf("#define call_handlers_%s(num, ret, a1, a2, a3, a4, a5) \\\n", 
ca);
+        printf("{ \\\n");

In order to require a semicolon at the use site(s) of the macro I think
you want "({ \\\n" here. Everything else looks good to me so far, but
I'd really like to take a look at the generated output: Would you happen
to have available an instance, to supply in reply?

Okay.

The generated file is attached.


Juergen
/* Generated file, do not edit! */

DEFINE_XEN_GUEST_HANDLE(multicall_entry_compat_t);
typedef struct compat_platform_op compat_platform_op_t;
DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
DEFINE_XEN_GUEST_HANDLE(trap_info_compat_t);
DEFINE_XEN_GUEST_HANDLE(physdev_op_compat_t);

long do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
int compat_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
long do_grant_table_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count);
long hvm_grant_table_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count);
int compat_grant_table_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count);
long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
long hvm_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
long do_xen_version(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
int compat_xen_version(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
long do_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg);
int compat_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg);
long do_sched_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
int compat_sched_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
long do_xsm_op(XEN_GUEST_HANDLE_PARAM(void) op);
int compat_xsm_op(XEN_GUEST_HANDLE_PARAM(void) op);
long do_callback_op(int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg);
int compat_callback_op(int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg);
long do_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg);
int compat_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg);
long do_iret(void);
int compat_iret(void);
long do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
int compat_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
long do_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg);
int compat_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg);
int compat_set_timer_op(uint32_t lo, int32_t hi);
int compat_multicall(XEN_GUEST_HANDLE_PARAM(multicall_entry_compat_t) call_list, uint32_t nr_calls);
int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
int compat_dm_op(domid_t domid, unsigned int nr_bufs, XEN_GUEST_HANDLE_PARAM(void) bufs);
int compat_mmuext_op(XEN_GUEST_HANDLE_PARAM(void) arg, unsigned int count, XEN_GUEST_HANDLE_PARAM(uint) pdone, unsigned int foreigndom);
int compat_set_trap_table(XEN_GUEST_HANDLE_PARAM(trap_info_compat_t) traps);
int compat_set_gdt(XEN_GUEST_HANDLE_PARAM(uint) frame_list, unsigned int entries);
int compat_set_callbacks(unsigned long event_selector, unsigned long event_address, unsigned long failsafe_selector, unsigned long failsafe_address);
int compat_update_descriptor(uint32_t pa_lo, uint32_t pa_hi, uint32_t desc_lo, uint32_t desc_hi);
int compat_update_va_mapping(unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags);
int compat_physdev_op_compat(XEN_GUEST_HANDLE_PARAM(physdev_op_compat_t) uop);
int compat_update_va_mapping_otherdomain(unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags, domid_t domid);
int compat_platform_op(XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
long do_event_channel_op_compat(XEN_GUEST_HANDLE_PARAM(evtchn_op_t) uop);
long do_physdev_op_compat(XEN_GUEST_HANDLE_PARAM(physdev_op_t) uop);
long do_sched_op_compat(int cmd, unsigned long arg);
long do_set_timer_op(s_time_t timeout);
long do_console_io(unsigned int cmd, unsigned int count, XEN_GUEST_HANDLE_PARAM(char) buffer);
long do_vm_assist(unsigned int cmd, unsigned int type);
long do_event_channel_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
long do_mmuext_op(XEN_GUEST_HANDLE_PARAM(mmuext_op_t) uops, unsigned int count, XEN_GUEST_HANDLE_PARAM(uint) pdone, unsigned int foreigndom);
long do_multicall(XEN_GUEST_HANDLE_PARAM(multicall_entry_t) call_list, unsigned int nr_calls);
long do_mmu_update(XEN_GUEST_HANDLE_PARAM(mmu_update_t) ureqs, unsigned int count, XEN_GUEST_HANDLE_PARAM(uint) pdone, unsigned int foreigndom);
long do_stack_switch(unsigned long ss, unsigned long esp);
long do_fpu_taskswitch(int set);
long do_set_debugreg(int reg, unsigned long value);
long do_get_debugreg(int reg);
long do_set_segment_base(unsigned int which, unsigned long base);
long do_mca(XEN_GUEST_HANDLE_PARAM(xen_mc_t) u_xen_mc);
long do_set_trap_table(XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps);
long do_set_gdt(XEN_GUEST_HANDLE_PARAM(xen_ulong_t) frame_list, unsigned int entries);
long do_set_callbacks(unsigned long event_address, unsigned long failsafe_address, unsigned long syscall_address);
long do_update_descriptor(uint64_t gaddr, seg_desc_t desc);
long do_update_va_mapping(unsigned long va, uint64_t val64, unsigned long flags);
long do_update_va_mapping_otherdomain(unsigned long va, uint64_t val64, unsigned long flags, domid_t domid);
long do_dm_op(domid_t domid, unsigned int nr_bufs, XEN_GUEST_HANDLE_PARAM(xen_dm_op_buf_t) bufs);
long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl);
long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
long do_paging_domctl_cont(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
long do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op);
long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg);
long do_hypfs_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(const_char) arg1, unsigned long arg2, XEN_GUEST_HANDLE_PARAM(void) arg3, unsigned long arg4);
long do_xenpmu_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg);

#define call_handlers_hvm64(num, ret, a1, a2, a3, a4, a5) \
{ \
    uint64_t mask = 1ULL << num; \
    if ( likely(mask & ((1ULL << __HYPERVISOR_vcpu_op) | (1ULL << __HYPERVISOR_event_channel_op))) ) \
    { \
        if ( num == __HYPERVISOR_vcpu_op ) \
            ret = do_vcpu_op((int)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a3) }); \
        else \
            ret = do_event_channel_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
    } \
    else         switch ( num ) \
        { \
        case __HYPERVISOR_platform_op: \
            ret = do_platform_op((XEN_GUEST_HANDLE_PARAM(xen_platform_op_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_memory_op: \
            ret = hvm_memory_op((unsigned long)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_multicall: \
            ret = do_multicall((XEN_GUEST_HANDLE_PARAM(multicall_entry_t)){ _p(a1) }, (unsigned int)(a2)); \
            break; \
        case __HYPERVISOR_set_timer_op: \
            ret = do_set_timer_op((s_time_t)(a1)); \
            break; \
        case __HYPERVISOR_xen_version: \
            ret = do_xen_version((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_console_io: \
            ret = do_console_io((unsigned int)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(char)){ _p(a3) }); \
            break; \
        case __HYPERVISOR_grant_table_op: \
            ret = hvm_grant_table_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }, (unsigned int)(a3)); \
            break; \
        case __HYPERVISOR_vm_assist: \
            ret = do_vm_assist((unsigned int)(a1), (unsigned int)(a2)); \
            break; \
        case __HYPERVISOR_mmuext_op: \
            ret = do_mmuext_op((XEN_GUEST_HANDLE_PARAM(mmuext_op_t)){ _p(a1) }, (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(uint)){ _p(a3) }, (unsigned int)(a4)); \
            break; \
        case __HYPERVISOR_xsm_op: \
            ret = do_xsm_op((XEN_GUEST_HANDLE_PARAM(void)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_sched_op: \
            ret = do_sched_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_physdev_op: \
            ret = hvm_physdev_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_hvm_op: \
            ret = do_hvm_op((unsigned long)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_sysctl: \
            ret = do_sysctl((XEN_GUEST_HANDLE_PARAM(xen_sysctl_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_domctl: \
            ret = do_domctl((XEN_GUEST_HANDLE_PARAM(xen_domctl_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_xenpmu_op: \
            ret = do_xenpmu_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_dm_op: \
            ret = do_dm_op((domid_t)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(xen_dm_op_buf_t)){ _p(a3) }); \
            break; \
        case __HYPERVISOR_hypfs_op: \
            ret = do_hypfs_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(const_char)){ _p(a2) }, (unsigned long)(a3), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a4) }, (unsigned long)(a5)); \
            break; \
        case __HYPERVISOR_paging_domctl_cont: \
            ret = do_paging_domctl_cont((XEN_GUEST_HANDLE_PARAM(xen_domctl_t)){ _p(a1) }); \
            break; \
        default: \
            ret = -ENOSYS; \
            break; \
        } \
}

#define hypercall_args_hvm64 \
{ \
[__HYPERVISOR_platform_op] = 1, \
[__HYPERVISOR_memory_op] = 2, \
[__HYPERVISOR_multicall] = 2, \
[__HYPERVISOR_set_timer_op] = 1, \
[__HYPERVISOR_xen_version] = 2, \
[__HYPERVISOR_console_io] = 3, \
[__HYPERVISOR_grant_table_op] = 3, \
[__HYPERVISOR_vm_assist] = 2, \
[__HYPERVISOR_vcpu_op] = 3, \
[__HYPERVISOR_mmuext_op] = 4, \
[__HYPERVISOR_xsm_op] = 1, \
[__HYPERVISOR_sched_op] = 2, \
[__HYPERVISOR_event_channel_op] = 2, \
[__HYPERVISOR_physdev_op] = 2, \
[__HYPERVISOR_hvm_op] = 2, \
[__HYPERVISOR_sysctl] = 1, \
[__HYPERVISOR_domctl] = 1, \
[__HYPERVISOR_xenpmu_op] = 2, \
[__HYPERVISOR_dm_op] = 3, \
[__HYPERVISOR_hypfs_op] = 5, \
[__HYPERVISOR_paging_domctl_cont] = 1, \
}

#define call_handlers_pv32(num, ret, a1, a2, a3, a4, a5) \
{ \
    uint64_t mask = 1ULL << num; \
    if ( likely(mask & ((1ULL << __HYPERVISOR_mmu_update) | (1ULL << __HYPERVISOR_iret))) ) \
    { \
        if ( num == __HYPERVISOR_mmu_update ) \
            ret = do_mmu_update((XEN_GUEST_HANDLE_PARAM(mmu_update_t)){ _p(a1) }, (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(uint)){ _p(a3) }, (unsigned int)(a4)); \
        else \
            ret = compat_iret(); \
    } \
    else if ( likely(mask & ((1ULL << __HYPERVISOR_stack_switch) | (1ULL << __HYPERVISOR_multicall) | (1ULL << __HYPERVISOR_set_segment_base) | (1ULL << __HYPERVISOR_mmuext_op))) ) \
    { \
        switch ( num ) \
        { \
        case __HYPERVISOR_stack_switch: \
            ret = do_stack_switch((unsigned long)(a1), (unsigned long)(a2)); \
            break; \
        case __HYPERVISOR_multicall: \
            ret = compat_multicall((XEN_GUEST_HANDLE_PARAM(multicall_entry_compat_t)){ _p(a1) }, (uint32_t)(a2)); \
            break; \
        case __HYPERVISOR_set_segment_base: \
            ret = do_set_segment_base((unsigned int)(a1), (unsigned long)(a2)); \
            break; \
        case __HYPERVISOR_mmuext_op: \
            ret = compat_mmuext_op((XEN_GUEST_HANDLE_PARAM(void)){ _p(a1) }, (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(uint)){ _p(a3) }, (unsigned int)(a4)); \
            break; \
        default: \
            ret = -ENOSYS; \
            break; \
        } \
    } \
    else         switch ( num ) \
        { \
        case __HYPERVISOR_set_trap_table: \
            ret = compat_set_trap_table((XEN_GUEST_HANDLE_PARAM(trap_info_compat_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_set_gdt: \
            ret = compat_set_gdt((XEN_GUEST_HANDLE_PARAM(uint)){ _p(a1) }, (unsigned int)(a2)); \
            break; \
        case __HYPERVISOR_set_callbacks: \
            ret = compat_set_callbacks((unsigned long)(a1), (unsigned long)(a2), (unsigned long)(a3), (unsigned long)(a4)); \
            break; \
        case __HYPERVISOR_fpu_taskswitch: \
            ret = do_fpu_taskswitch((int)(a1)); \
            break; \
        case __HYPERVISOR_sched_op_compat: \
            ret = do_sched_op_compat((int)(a1), (unsigned long)(a2)); \
            break; \
        case __HYPERVISOR_platform_op: \
            ret = compat_platform_op((XEN_GUEST_HANDLE_PARAM(compat_platform_op_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_set_debugreg: \
            ret = do_set_debugreg((int)(a1), (unsigned long)(a2)); \
            break; \
        case __HYPERVISOR_get_debugreg: \
            ret = do_get_debugreg((int)(a1)); \
            break; \
        case __HYPERVISOR_update_descriptor: \
            ret = compat_update_descriptor((uint32_t)(a1), (uint32_t)(a2), (uint32_t)(a3), (uint32_t)(a4)); \
            break; \
        case __HYPERVISOR_memory_op: \
            ret = compat_memory_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_update_va_mapping: \
            ret = compat_update_va_mapping((unsigned int)(a1), (uint32_t)(a2), (uint32_t)(a3), (unsigned int)(a4)); \
            break; \
        case __HYPERVISOR_set_timer_op: \
            ret = compat_set_timer_op((uint32_t)(a1), (int32_t)(a2)); \
            break; \
        case __HYPERVISOR_event_channel_op_compat: \
            ret = do_event_channel_op_compat((XEN_GUEST_HANDLE_PARAM(evtchn_op_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_xen_version: \
            ret = compat_xen_version((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_console_io: \
            ret = do_console_io((unsigned int)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(char)){ _p(a3) }); \
            break; \
        case __HYPERVISOR_physdev_op_compat: \
            ret = compat_physdev_op_compat((XEN_GUEST_HANDLE_PARAM(physdev_op_compat_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_grant_table_op: \
            ret = compat_grant_table_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }, (unsigned int)(a3)); \
            break; \
        case __HYPERVISOR_vm_assist: \
            ret = do_vm_assist((unsigned int)(a1), (unsigned int)(a2)); \
            break; \
        case __HYPERVISOR_update_va_mapping_otherdomain: \
            ret = compat_update_va_mapping_otherdomain((unsigned int)(a1), (uint32_t)(a2), (uint32_t)(a3), (unsigned int)(a4), (domid_t)(a5)); \
            break; \
        case __HYPERVISOR_vcpu_op: \
            ret = compat_vcpu_op((int)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a3) }); \
            break; \
        case __HYPERVISOR_xsm_op: \
            ret = compat_xsm_op((XEN_GUEST_HANDLE_PARAM(void)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_nmi_op: \
            ret = compat_nmi_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_sched_op: \
            ret = compat_sched_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_callback_op: \
            ret = compat_callback_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(const_void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_xenoprof_op: \
            ret = compat_xenoprof_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_event_channel_op: \
            ret = do_event_channel_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_physdev_op: \
            ret = compat_physdev_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_hvm_op: \
            ret = do_hvm_op((unsigned long)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_sysctl: \
            ret = do_sysctl((XEN_GUEST_HANDLE_PARAM(xen_sysctl_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_domctl: \
            ret = do_domctl((XEN_GUEST_HANDLE_PARAM(xen_domctl_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_kexec_op: \
            ret = compat_kexec_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_xenpmu_op: \
            ret = do_xenpmu_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_dm_op: \
            ret = compat_dm_op((domid_t)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a3) }); \
            break; \
        case __HYPERVISOR_hypfs_op: \
            ret = do_hypfs_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(const_char)){ _p(a2) }, (unsigned long)(a3), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a4) }, (unsigned long)(a5)); \
            break; \
        case __HYPERVISOR_mca: \
            ret = do_mca((XEN_GUEST_HANDLE_PARAM(xen_mc_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_paging_domctl_cont: \
            ret = do_paging_domctl_cont((XEN_GUEST_HANDLE_PARAM(xen_domctl_t)){ _p(a1) }); \
            break; \
        default: \
            ret = -ENOSYS; \
            break; \
        } \
}

#define hypercall_args_pv32 \
{ \
[__HYPERVISOR_set_trap_table] = 1, \
[__HYPERVISOR_mmu_update] = 4, \
[__HYPERVISOR_set_gdt] = 2, \
[__HYPERVISOR_stack_switch] = 2, \
[__HYPERVISOR_set_callbacks] = 4, \
[__HYPERVISOR_fpu_taskswitch] = 1, \
[__HYPERVISOR_sched_op_compat] = 2, \
[__HYPERVISOR_platform_op] = 1, \
[__HYPERVISOR_set_debugreg] = 2, \
[__HYPERVISOR_get_debugreg] = 1, \
[__HYPERVISOR_update_descriptor] = 4, \
[__HYPERVISOR_memory_op] = 2, \
[__HYPERVISOR_multicall] = 2, \
[__HYPERVISOR_update_va_mapping] = 4, \
[__HYPERVISOR_set_timer_op] = 2, \
[__HYPERVISOR_event_channel_op_compat] = 1, \
[__HYPERVISOR_xen_version] = 2, \
[__HYPERVISOR_console_io] = 3, \
[__HYPERVISOR_physdev_op_compat] = 1, \
[__HYPERVISOR_grant_table_op] = 3, \
[__HYPERVISOR_vm_assist] = 2, \
[__HYPERVISOR_update_va_mapping_otherdomain] = 5, \
[__HYPERVISOR_iret] = 0, \
[__HYPERVISOR_vcpu_op] = 3, \
[__HYPERVISOR_set_segment_base] = 2, \
[__HYPERVISOR_mmuext_op] = 4, \
[__HYPERVISOR_xsm_op] = 1, \
[__HYPERVISOR_nmi_op] = 2, \
[__HYPERVISOR_sched_op] = 2, \
[__HYPERVISOR_callback_op] = 2, \
[__HYPERVISOR_xenoprof_op] = 2, \
[__HYPERVISOR_event_channel_op] = 2, \
[__HYPERVISOR_physdev_op] = 2, \
[__HYPERVISOR_hvm_op] = 2, \
[__HYPERVISOR_sysctl] = 1, \
[__HYPERVISOR_domctl] = 1, \
[__HYPERVISOR_kexec_op] = 2, \
[__HYPERVISOR_xenpmu_op] = 2, \
[__HYPERVISOR_dm_op] = 3, \
[__HYPERVISOR_hypfs_op] = 5, \
[__HYPERVISOR_mca] = 1, \
[__HYPERVISOR_paging_domctl_cont] = 1, \
}

#define call_handlers_hvm32(num, ret, a1, a2, a3, a4, a5) \
{ \
    uint64_t mask = 1ULL << num; \
    if ( likely(mask & ((1ULL << __HYPERVISOR_vcpu_op) | (1ULL << __HYPERVISOR_event_channel_op))) ) \
    { \
        if ( num == __HYPERVISOR_vcpu_op ) \
            ret = compat_vcpu_op((int)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a3) }); \
        else \
            ret = do_event_channel_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
    } \
    else         switch ( num ) \
        { \
        case __HYPERVISOR_platform_op: \
            ret = compat_platform_op((XEN_GUEST_HANDLE_PARAM(compat_platform_op_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_memory_op: \
            ret = hvm_memory_op((unsigned long)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_multicall: \
            ret = compat_multicall((XEN_GUEST_HANDLE_PARAM(multicall_entry_compat_t)){ _p(a1) }, (uint32_t)(a2)); \
            break; \
        case __HYPERVISOR_set_timer_op: \
            ret = compat_set_timer_op((uint32_t)(a1), (int32_t)(a2)); \
            break; \
        case __HYPERVISOR_xen_version: \
            ret = compat_xen_version((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_console_io: \
            ret = do_console_io((unsigned int)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(char)){ _p(a3) }); \
            break; \
        case __HYPERVISOR_grant_table_op: \
            ret = hvm_grant_table_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }, (unsigned int)(a3)); \
            break; \
        case __HYPERVISOR_vm_assist: \
            ret = do_vm_assist((unsigned int)(a1), (unsigned int)(a2)); \
            break; \
        case __HYPERVISOR_mmuext_op: \
            ret = compat_mmuext_op((XEN_GUEST_HANDLE_PARAM(void)){ _p(a1) }, (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(uint)){ _p(a3) }, (unsigned int)(a4)); \
            break; \
        case __HYPERVISOR_xsm_op: \
            ret = compat_xsm_op((XEN_GUEST_HANDLE_PARAM(void)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_sched_op: \
            ret = compat_sched_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_physdev_op: \
            ret = hvm_physdev_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_hvm_op: \
            ret = do_hvm_op((unsigned long)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_sysctl: \
            ret = do_sysctl((XEN_GUEST_HANDLE_PARAM(xen_sysctl_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_domctl: \
            ret = do_domctl((XEN_GUEST_HANDLE_PARAM(xen_domctl_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_xenpmu_op: \
            ret = do_xenpmu_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_dm_op: \
            ret = compat_dm_op((domid_t)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a3) }); \
            break; \
        case __HYPERVISOR_hypfs_op: \
            ret = do_hypfs_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(const_char)){ _p(a2) }, (unsigned long)(a3), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a4) }, (unsigned long)(a5)); \
            break; \
        case __HYPERVISOR_paging_domctl_cont: \
            ret = do_paging_domctl_cont((XEN_GUEST_HANDLE_PARAM(xen_domctl_t)){ _p(a1) }); \
            break; \
        default: \
            ret = -ENOSYS; \
            break; \
        } \
}

#define hypercall_args_hvm32 \
{ \
[__HYPERVISOR_platform_op] = 1, \
[__HYPERVISOR_memory_op] = 2, \
[__HYPERVISOR_multicall] = 2, \
[__HYPERVISOR_set_timer_op] = 2, \
[__HYPERVISOR_xen_version] = 2, \
[__HYPERVISOR_console_io] = 3, \
[__HYPERVISOR_grant_table_op] = 3, \
[__HYPERVISOR_vm_assist] = 2, \
[__HYPERVISOR_vcpu_op] = 3, \
[__HYPERVISOR_mmuext_op] = 4, \
[__HYPERVISOR_xsm_op] = 1, \
[__HYPERVISOR_sched_op] = 2, \
[__HYPERVISOR_event_channel_op] = 2, \
[__HYPERVISOR_physdev_op] = 2, \
[__HYPERVISOR_hvm_op] = 2, \
[__HYPERVISOR_sysctl] = 1, \
[__HYPERVISOR_domctl] = 1, \
[__HYPERVISOR_xenpmu_op] = 2, \
[__HYPERVISOR_dm_op] = 3, \
[__HYPERVISOR_hypfs_op] = 5, \
[__HYPERVISOR_paging_domctl_cont] = 1, \
}

#define call_handlers_pv64(num, ret, a1, a2, a3, a4, a5) \
{ \
    uint64_t mask = 1ULL << num; \
    if ( likely(mask & ((1ULL << __HYPERVISOR_mmu_update) | (1ULL << __HYPERVISOR_iret))) ) \
    { \
        if ( num == __HYPERVISOR_mmu_update ) \
            ret = do_mmu_update((XEN_GUEST_HANDLE_PARAM(mmu_update_t)){ _p(a1) }, (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(uint)){ _p(a3) }, (unsigned int)(a4)); \
        else \
            ret = do_iret(); \
    } \
    else if ( likely(mask & ((1ULL << __HYPERVISOR_stack_switch) | (1ULL << __HYPERVISOR_multicall) | (1ULL << __HYPERVISOR_set_segment_base) | (1ULL << __HYPERVISOR_mmuext_op))) ) \
    { \
        switch ( num ) \
        { \
        case __HYPERVISOR_stack_switch: \
            ret = do_stack_switch((unsigned long)(a1), (unsigned long)(a2)); \
            break; \
        case __HYPERVISOR_multicall: \
            ret = do_multicall((XEN_GUEST_HANDLE_PARAM(multicall_entry_t)){ _p(a1) }, (unsigned int)(a2)); \
            break; \
        case __HYPERVISOR_set_segment_base: \
            ret = do_set_segment_base((unsigned int)(a1), (unsigned long)(a2)); \
            break; \
        case __HYPERVISOR_mmuext_op: \
            ret = do_mmuext_op((XEN_GUEST_HANDLE_PARAM(mmuext_op_t)){ _p(a1) }, (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(uint)){ _p(a3) }, (unsigned int)(a4)); \
            break; \
        default: \
            ret = -ENOSYS; \
            break; \
        } \
    } \
    else         switch ( num ) \
        { \
        case __HYPERVISOR_set_trap_table: \
            ret = do_set_trap_table((XEN_GUEST_HANDLE_PARAM(const_trap_info_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_set_gdt: \
            ret = do_set_gdt((XEN_GUEST_HANDLE_PARAM(xen_ulong_t)){ _p(a1) }, (unsigned int)(a2)); \
            break; \
        case __HYPERVISOR_set_callbacks: \
            ret = do_set_callbacks((unsigned long)(a1), (unsigned long)(a2), (unsigned long)(a3)); \
            break; \
        case __HYPERVISOR_fpu_taskswitch: \
            ret = do_fpu_taskswitch((int)(a1)); \
            break; \
        case __HYPERVISOR_sched_op_compat: \
            ret = do_sched_op_compat((int)(a1), (unsigned long)(a2)); \
            break; \
        case __HYPERVISOR_platform_op: \
            ret = do_platform_op((XEN_GUEST_HANDLE_PARAM(xen_platform_op_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_set_debugreg: \
            ret = do_set_debugreg((int)(a1), (unsigned long)(a2)); \
            break; \
        case __HYPERVISOR_get_debugreg: \
            ret = do_get_debugreg((int)(a1)); \
            break; \
        case __HYPERVISOR_update_descriptor: \
            ret = do_update_descriptor((uint64_t)(a1), (seg_desc_t)(a2)); \
            break; \
        case __HYPERVISOR_memory_op: \
            ret = do_memory_op((unsigned long)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_update_va_mapping: \
            ret = do_update_va_mapping((unsigned long)(a1), (uint64_t)(a2), (unsigned long)(a3)); \
            break; \
        case __HYPERVISOR_set_timer_op: \
            ret = do_set_timer_op((s_time_t)(a1)); \
            break; \
        case __HYPERVISOR_event_channel_op_compat: \
            ret = do_event_channel_op_compat((XEN_GUEST_HANDLE_PARAM(evtchn_op_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_xen_version: \
            ret = do_xen_version((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_console_io: \
            ret = do_console_io((unsigned int)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(char)){ _p(a3) }); \
            break; \
        case __HYPERVISOR_physdev_op_compat: \
            ret = do_physdev_op_compat((XEN_GUEST_HANDLE_PARAM(physdev_op_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_grant_table_op: \
            ret = do_grant_table_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }, (unsigned int)(a3)); \
            break; \
        case __HYPERVISOR_vm_assist: \
            ret = do_vm_assist((unsigned int)(a1), (unsigned int)(a2)); \
            break; \
        case __HYPERVISOR_update_va_mapping_otherdomain: \
            ret = do_update_va_mapping_otherdomain((unsigned long)(a1), (uint64_t)(a2), (unsigned long)(a3), (domid_t)(a4)); \
            break; \
        case __HYPERVISOR_vcpu_op: \
            ret = do_vcpu_op((int)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a3) }); \
            break; \
        case __HYPERVISOR_xsm_op: \
            ret = do_xsm_op((XEN_GUEST_HANDLE_PARAM(void)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_nmi_op: \
            ret = do_nmi_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_sched_op: \
            ret = do_sched_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_callback_op: \
            ret = do_callback_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(const_void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_xenoprof_op: \
            ret = do_xenoprof_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_event_channel_op: \
            ret = do_event_channel_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_physdev_op: \
            ret = do_physdev_op((int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_hvm_op: \
            ret = do_hvm_op((unsigned long)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_sysctl: \
            ret = do_sysctl((XEN_GUEST_HANDLE_PARAM(xen_sysctl_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_domctl: \
            ret = do_domctl((XEN_GUEST_HANDLE_PARAM(xen_domctl_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_kexec_op: \
            ret = do_kexec_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_xenpmu_op: \
            ret = do_xenpmu_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t)){ _p(a2) }); \
            break; \
        case __HYPERVISOR_dm_op: \
            ret = do_dm_op((domid_t)(a1), (unsigned int)(a2), (XEN_GUEST_HANDLE_PARAM(xen_dm_op_buf_t)){ _p(a3) }); \
            break; \
        case __HYPERVISOR_hypfs_op: \
            ret = do_hypfs_op((unsigned int)(a1), (XEN_GUEST_HANDLE_PARAM(const_char)){ _p(a2) }, (unsigned long)(a3), (XEN_GUEST_HANDLE_PARAM(void)){ _p(a4) }, (unsigned long)(a5)); \
            break; \
        case __HYPERVISOR_mca: \
            ret = do_mca((XEN_GUEST_HANDLE_PARAM(xen_mc_t)){ _p(a1) }); \
            break; \
        case __HYPERVISOR_paging_domctl_cont: \
            ret = do_paging_domctl_cont((XEN_GUEST_HANDLE_PARAM(xen_domctl_t)){ _p(a1) }); \
            break; \
        default: \
            ret = -ENOSYS; \
            break; \
        } \
}

#define hypercall_args_pv64 \
{ \
[__HYPERVISOR_set_trap_table] = 1, \
[__HYPERVISOR_mmu_update] = 4, \
[__HYPERVISOR_set_gdt] = 2, \
[__HYPERVISOR_stack_switch] = 2, \
[__HYPERVISOR_set_callbacks] = 3, \
[__HYPERVISOR_fpu_taskswitch] = 1, \
[__HYPERVISOR_sched_op_compat] = 2, \
[__HYPERVISOR_platform_op] = 1, \
[__HYPERVISOR_set_debugreg] = 2, \
[__HYPERVISOR_get_debugreg] = 1, \
[__HYPERVISOR_update_descriptor] = 2, \
[__HYPERVISOR_memory_op] = 2, \
[__HYPERVISOR_multicall] = 2, \
[__HYPERVISOR_update_va_mapping] = 3, \
[__HYPERVISOR_set_timer_op] = 1, \
[__HYPERVISOR_event_channel_op_compat] = 1, \
[__HYPERVISOR_xen_version] = 2, \
[__HYPERVISOR_console_io] = 3, \
[__HYPERVISOR_physdev_op_compat] = 1, \
[__HYPERVISOR_grant_table_op] = 3, \
[__HYPERVISOR_vm_assist] = 2, \
[__HYPERVISOR_update_va_mapping_otherdomain] = 4, \
[__HYPERVISOR_iret] = 0, \
[__HYPERVISOR_vcpu_op] = 3, \
[__HYPERVISOR_set_segment_base] = 2, \
[__HYPERVISOR_mmuext_op] = 4, \
[__HYPERVISOR_xsm_op] = 1, \
[__HYPERVISOR_nmi_op] = 2, \
[__HYPERVISOR_sched_op] = 2, \
[__HYPERVISOR_callback_op] = 2, \
[__HYPERVISOR_xenoprof_op] = 2, \
[__HYPERVISOR_event_channel_op] = 2, \
[__HYPERVISOR_physdev_op] = 2, \
[__HYPERVISOR_hvm_op] = 2, \
[__HYPERVISOR_sysctl] = 1, \
[__HYPERVISOR_domctl] = 1, \
[__HYPERVISOR_kexec_op] = 2, \
[__HYPERVISOR_xenpmu_op] = 2, \
[__HYPERVISOR_dm_op] = 3, \
[__HYPERVISOR_hypfs_op] = 5, \
[__HYPERVISOR_mca] = 1, \
[__HYPERVISOR_paging_domctl_cont] = 1, \
}

Attachment: OpenPGP_0xB0DE9DD628BF132F.asc
Description: OpenPGP public key

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

Reply via email to