fix a few compat mode issues
PATCH 1/1 fix a few compat mode issues
- handle VCPUOP_register_vcpu_info and VCPUOP_get_physid (and add respective layout checks)
- add missing structure size check for struct vcpu_info
- add missing layout check for vcpu_set_periodic_timer
- handle VCPUOP_set_singleshot_timer via argument translation as the structure sizes differ (due to padding in 64-bits)
Signed-off-by Jan Beulich <[email protected]>
xen/arch/x86/x86_64/domain.c +16 -3
@@ -9,11 +9,23 @@#include <asm/hypercall.h> #include <compat/vcpu.h> +#define xen_vcpu_info vcpu_info +CHECK_SIZE_ (struct, vcpu_info); +#undef xen_vcpu_info + +#define xen_vcpu_register_vcpu_info vcpu_register_vcpu_info +CHECK_vcpu_register_vcpu_info; +#undef xen_vcpu_register_vcpu_info + +#define xen_vcpu_get_physid vcpu_get_physid +CHECK_vcpu_get_physid; +#undef xen_vcpu_get_physid +int arch_compat_vcpu_op (int cmd,struct vcpu *v,XEN_GUEST_HANDLE (void ) arg) { -long rc =0 ; +int rc = -ENOSYS ;switch ( cmd ) {
@@ -51,8 +63,9 @@ arch_compat_vcpu_op(break ; } -default : - rc = -ENOSYS ; +case VCPUOP_register_vcpu_info: +case VCPUOP_get_physid: + rc =arch_do_vcpu_op (cmd, v, arg);break ; }
xen/common/compat/domain.c +18 -2
@@ -11,11 +11,15 @@#include <xen/hypercall.h> #include <compat/vcpu.h> +#define xen_vcpu_set_periodic_timer vcpu_set_periodic_timer +CHECK_vcpu_set_periodic_timer; +#undef xen_vcpu_set_periodic_timer +int compat_vcpu_op (int cmd,int vcpuid,XEN_GUEST_HANDLE (void ) arg) {struct domain *d = current->domain;struct vcpu *v; -long rc =0 ; +int rc =0 ;if ( (vcpuid <0 ) || (vcpuid >=MAX_VIRT_CPUS ) )return -EINVAL ;
@@ -57,7 +61,6 @@ int compat_vcpu_op(int cmd, int vcpuid,case VCPUOP_is_up:case VCPUOP_set_periodic_timer:case VCPUOP_stop_periodic_timer: -case VCPUOP_set_singleshot_timer:case VCPUOP_stop_singleshot_timer:case VCPUOP_send_nmi: rc =do_vcpu_op (cmd, vcpuid, arg);
@@ -77,6 +80,19 @@ int compat_vcpu_op(int cmd, int vcpuid,break ; } +case VCPUOP_set_singleshot_timer: + { +struct compat_vcpu_set_singleshot_timer cmp; +struct vcpu_set_singleshot_timer *nat; + +if (copy_from_guest (&cmp, arg,1 ) ) +return -EFAULT ; + nat = (void *)COMPAT_ARG_XLAT_VIRT_START (current->vcpu_id); +XLAT_vcpu_set_singleshot_timer (nat, &cmp); + rc =do_vcpu_op (cmd, vcpuid,guest_handle_from_ptr (nat, void)); +break ; + } +default : rc =arch_compat_vcpu_op (cmd, v, arg);break ;
xen/include/xlat.lst +5 -0
@@ -5,6 +5,7 @@ ? mmu_update xen.h ! mmuext_op xen.h ! start_info xen.h +? vcpu_info xen.h ? vcpu_time_info xen.h ! cpu_user_regs arch-x86/xen-@[email protected] ! trap_info arch-x86/xen.h
@@ -41,7 +42,11 @@ ? sched_remote_shutdown sched.h ? sched_shutdown sched.h ? t_buf trace.h +? vcpu_get_physid vcpu.h +? vcpu_register_vcpu_info vcpu.h ! vcpu_runstate_info vcpu.h +? vcpu_set_periodic_timer vcpu.h +! vcpu_set_singleshot_timer vcpu.h ? xenoprof_init xenoprof.h ? xenoprof_passive xenoprof.h ! power_register platform.h
xen/tools/get-fields.sh +0 -1
@@ -310,7 +310,6 @@ build_body () done echo " \\" echo "} while (0)" - echo "" } check_field ()