[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86: adjustments to guest handle treatment
commit dd5520f9df05b84116ad57f16fff45323042cc63 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Thu May 7 13:15:13 2020 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Thu May 7 13:15:13 2020 +0200 x86: adjustments to guest handle treatment First of all avoid excessive conversions. copy_{from,to}_guest(), for example, work fine with all of XEN_GUEST_HANDLE{,_64,_PARAM}(). Further - do_physdev_op_compat() didn't use the param form for its parameter, - {hap,shadow}_track_dirty_vram() wrongly used the param form, - compat processor Px logic failed to check compatibility of native and compat structures not further converted. As this eliminates all users of guest_handle_from_param() and as there's no real need to allow for conversions in both directions, drop the macros as well. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Acked-by: Julien Grall <jgrall@xxxxxxxxxx> --- xen/arch/x86/compat.c | 2 +- xen/arch/x86/cpu/microcode/core.c | 2 +- xen/arch/x86/mm.c | 16 +++++----------- xen/arch/x86/mm/hap/hap.c | 2 +- xen/arch/x86/mm/shadow/common.c | 2 +- xen/arch/x86/oprofile/backtrace.c | 5 +---- xen/arch/x86/platform_hypercall.c | 8 ++------ xen/arch/x86/x86_64/compat.c | 1 + xen/arch/x86/x86_64/cpu_idle.c | 8 ++------ xen/arch/x86/x86_64/cpufreq.c | 8 +++----- xen/drivers/acpi/pmstat.c | 2 +- xen/include/asm-arm/guest_access.h | 14 +------------- xen/include/asm-x86/guest_access.h | 12 +----------- xen/include/asm-x86/hap.h | 2 +- xen/include/asm-x86/microcode.h | 2 +- xen/include/asm-x86/shadow.h | 2 +- xen/include/xen/acpi.h | 4 ++-- 17 files changed, 26 insertions(+), 66 deletions(-) diff --git a/xen/arch/x86/compat.c b/xen/arch/x86/compat.c index a40ec295ae..58b202f701 100644 --- a/xen/arch/x86/compat.c +++ b/xen/arch/x86/compat.c @@ -15,7 +15,7 @@ typedef long ret_t; #endif /* Legacy hypercall (as of 0x00030202). */ -ret_t do_physdev_op_compat(XEN_GUEST_HANDLE(physdev_op_t) uop) +ret_t do_physdev_op_compat(XEN_GUEST_HANDLE_PARAM(physdev_op_t) uop) { typeof(do_physdev_op) *fn = (void *)pv_hypercall_table[__HYPERVISOR_physdev_op].native; diff --git a/xen/arch/x86/cpu/microcode/core.c b/xen/arch/x86/cpu/microcode/core.c index a220f908b8..d879d28787 100644 --- a/xen/arch/x86/cpu/microcode/core.c +++ b/xen/arch/x86/cpu/microcode/core.c @@ -678,7 +678,7 @@ static long microcode_update_helper(void *data) return ret; } -int microcode_update(XEN_GUEST_HANDLE_PARAM(const_void) buf, unsigned long len) +int microcode_update(XEN_GUEST_HANDLE(const_void) buf, unsigned long len) { int ret; struct ucode_buf *buffer; diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 355c50ff91..f2d8190b5e 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -4441,20 +4441,16 @@ static int _handle_iomem_range(unsigned long s, unsigned long e, { if ( s > ctxt->s && !(s >> (paddr_bits - PAGE_SHIFT)) ) { - e820entry_t ent; - XEN_GUEST_HANDLE_PARAM(e820entry_t) buffer_param; - XEN_GUEST_HANDLE(e820entry_t) buffer; - if ( !guest_handle_is_null(ctxt->map.buffer) ) { + e820entry_t ent; + if ( ctxt->n + 1 >= ctxt->map.nr_entries ) return -EINVAL; ent.addr = (uint64_t)ctxt->s << PAGE_SHIFT; ent.size = (uint64_t)(s - ctxt->s) << PAGE_SHIFT; ent.type = E820_RESERVED; - buffer_param = guest_handle_cast(ctxt->map.buffer, e820entry_t); - buffer = guest_handle_from_param(buffer_param, e820entry_t); - if ( __copy_to_guest_offset(buffer, ctxt->n, &ent, 1) ) + if ( __copy_to_guest_offset(ctxt->map.buffer, ctxt->n, &ent, 1) ) return -EFAULT; } ctxt->n++; @@ -4715,8 +4711,7 @@ long arch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) case XENMEM_machine_memory_map: { struct memory_map_context ctxt; - XEN_GUEST_HANDLE(e820entry_t) buffer; - XEN_GUEST_HANDLE_PARAM(e820entry_t) buffer_param; + XEN_GUEST_HANDLE_PARAM(e820entry_t) buffer; unsigned int i; bool store; @@ -4732,8 +4727,7 @@ long arch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) if ( store && ctxt.map.nr_entries < e820.nr_map + 1 ) return -EINVAL; - buffer_param = guest_handle_cast(ctxt.map.buffer, e820entry_t); - buffer = guest_handle_from_param(buffer_param, e820entry_t); + buffer = guest_handle_cast(ctxt.map.buffer, e820entry_t); if ( store && !guest_handle_okay(buffer, ctxt.map.nr_entries) ) return -EFAULT; diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c index 0275cdf5c8..7f84d0c6ea 100644 --- a/xen/arch/x86/mm/hap/hap.c +++ b/xen/arch/x86/mm/hap/hap.c @@ -59,7 +59,7 @@ int hap_track_dirty_vram(struct domain *d, unsigned long begin_pfn, unsigned long nr, - XEN_GUEST_HANDLE_PARAM(void) guest_dirty_bitmap) + XEN_GUEST_HANDLE(void) guest_dirty_bitmap) { long rc = 0; struct sh_dirty_vram *dirty_vram; diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 7ed8e7b71b..0ac3f880e1 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -3171,7 +3171,7 @@ static void sh_clean_dirty_bitmap(struct domain *d) int shadow_track_dirty_vram(struct domain *d, unsigned long begin_pfn, unsigned long nr, - XEN_GUEST_HANDLE_PARAM(void) guest_dirty_bitmap) + XEN_GUEST_HANDLE(void) guest_dirty_bitmap) { int rc = 0; unsigned long end_pfn = begin_pfn + nr; diff --git a/xen/arch/x86/oprofile/backtrace.c b/xen/arch/x86/oprofile/backtrace.c index 316821fd34..8233d87caa 100644 --- a/xen/arch/x86/oprofile/backtrace.c +++ b/xen/arch/x86/oprofile/backtrace.c @@ -74,11 +74,8 @@ dump_guest_backtrace(struct vcpu *vcpu, const struct frame_head *head, } else { - XEN_GUEST_HANDLE(const_frame_head_t) guest_head; - XEN_GUEST_HANDLE_PARAM(const_frame_head_t) guest_head_param = + XEN_GUEST_HANDLE_PARAM(const_frame_head_t) guest_head = const_guest_handle_from_ptr(head, frame_head_t); - guest_head = guest_handle_from_param(guest_head_param, - const_frame_head_t); /* Also check accessibility of one struct frame_head beyond */ if (!guest_handle_okay(guest_head, 2)) diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c index ee2efdd875..23fadbc782 100644 --- a/xen/arch/x86/platform_hypercall.c +++ b/xen/arch/x86/platform_hypercall.c @@ -285,9 +285,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) guest_from_compat_handle(data, op->u.microcode.data); - ret = microcode_update( - guest_handle_to_param(data, const_void), - op->u.microcode.length); + ret = microcode_update(data, op->u.microcode.length); } break; @@ -531,9 +529,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) XEN_GUEST_HANDLE(uint32) pdc; guest_from_compat_handle(pdc, op->u.set_pminfo.u.pdc); - ret = acpi_set_pdc_bits( - op->u.set_pminfo.id, - guest_handle_to_param(pdc, uint32)); + ret = acpi_set_pdc_bits(op->u.set_pminfo.id, pdc); } break; diff --git a/xen/arch/x86/x86_64/compat.c b/xen/arch/x86/x86_64/compat.c index 179d0c637a..0e4c71f2aa 100644 --- a/xen/arch/x86/x86_64/compat.c +++ b/xen/arch/x86/x86_64/compat.c @@ -15,6 +15,7 @@ EMIT_FILE; #define COMPAT #define _XEN_GUEST_HANDLE(t) XEN_GUEST_HANDLE(t) +#define _XEN_GUEST_HANDLE_PARAM(t) XEN_GUEST_HANDLE_PARAM(t) typedef int ret_t; #include "../compat.c" diff --git a/xen/arch/x86/x86_64/cpu_idle.c b/xen/arch/x86/x86_64/cpu_idle.c index f991fd900a..e2195d57be 100644 --- a/xen/arch/x86/x86_64/cpu_idle.c +++ b/xen/arch/x86/x86_64/cpu_idle.c @@ -52,13 +52,9 @@ static int copy_from_compat_state(xen_processor_cx_t *xen_state, compat_processor_cx_t *state) { #define XLAT_processor_cx_HNDL_dp(_d_, _s_) do { \ - XEN_GUEST_HANDLE(compat_processor_csd_t) dps; \ - XEN_GUEST_HANDLE_PARAM(xen_processor_csd_t) dps_param; \ if ( unlikely(!compat_handle_okay((_s_)->dp, (_s_)->dpcnt)) ) \ - return -EFAULT; \ - guest_from_compat_handle(dps, (_s_)->dp); \ - dps_param = guest_handle_cast(dps, xen_processor_csd_t); \ - (_d_)->dp = guest_handle_from_param(dps_param, xen_processor_csd_t); \ + return -EFAULT; \ + guest_from_compat_handle((_d_)->dp, (_s_)->dp); \ } while (0) XLAT_processor_cx(xen_state, state); #undef XLAT_processor_cx_HNDL_dp diff --git a/xen/arch/x86/x86_64/cpufreq.c b/xen/arch/x86/x86_64/cpufreq.c index e018b5e198..9e1e2050da 100644 --- a/xen/arch/x86/x86_64/cpufreq.c +++ b/xen/arch/x86/x86_64/cpufreq.c @@ -26,6 +26,8 @@ #include <xen/pmstat.h> #include <compat/platform.h> +CHECK_processor_px; + DEFINE_XEN_GUEST_HANDLE(compat_processor_px_t); int @@ -42,13 +44,9 @@ compat_set_px_pminfo(uint32_t cpu, struct compat_processor_performance *perf) return -EFAULT; #define XLAT_processor_performance_HNDL_states(_d_, _s_) do { \ - XEN_GUEST_HANDLE(compat_processor_px_t) states; \ - XEN_GUEST_HANDLE_PARAM(xen_processor_px_t) states_t; \ if ( unlikely(!compat_handle_okay((_s_)->states, (_s_)->state_count)) ) \ return -EFAULT; \ - guest_from_compat_handle(states, (_s_)->states); \ - states_t = guest_handle_cast(states, xen_processor_px_t); \ - (_d_)->states = guest_handle_from_param(states_t, xen_processor_px_t); \ + guest_from_compat_handle((_d_)->states, (_s_)->states); \ } while (0) XLAT_processor_performance(xen_perf, perf); diff --git a/xen/drivers/acpi/pmstat.c b/xen/drivers/acpi/pmstat.c index 426447e1a7..2f528f9ca3 100644 --- a/xen/drivers/acpi/pmstat.c +++ b/xen/drivers/acpi/pmstat.c @@ -492,7 +492,7 @@ int do_pm_op(struct xen_sysctl_pm_op *op) return ret; } -int acpi_set_pdc_bits(u32 acpi_id, XEN_GUEST_HANDLE_PARAM(uint32) pdc) +int acpi_set_pdc_bits(uint32_t acpi_id, XEN_GUEST_HANDLE(uint32) pdc) { u32 bits[3]; int ret; diff --git a/xen/include/asm-arm/guest_access.h b/xen/include/asm-arm/guest_access.h index 64d01951a9..31b9f03f00 100644 --- a/xen/include/asm-arm/guest_access.h +++ b/xen/include/asm-arm/guest_access.h @@ -40,7 +40,7 @@ int access_guest_memory_by_ipa(struct domain *d, paddr_t ipa, void *buf, (XEN_GUEST_HANDLE_PARAM(type)) { _x }; \ }) -/* Cast a XEN_GUEST_HANDLE to XEN_GUEST_HANDLE_PARAM */ +/* Convert a XEN_GUEST_HANDLE to XEN_GUEST_HANDLE_PARAM */ #define guest_handle_to_param(hnd, type) ({ \ typeof((hnd).p) _x = (hnd).p; \ XEN_GUEST_HANDLE_PARAM(type) _y = { _x }; \ @@ -51,18 +51,6 @@ int access_guest_memory_by_ipa(struct domain *d, paddr_t ipa, void *buf, _y; \ }) - -/* Cast a XEN_GUEST_HANDLE_PARAM to XEN_GUEST_HANDLE */ -#define guest_handle_from_param(hnd, type) ({ \ - typeof((hnd).p) _x = (hnd).p; \ - XEN_GUEST_HANDLE(type) _y = { _x }; \ - /* type checking: make sure that the pointers inside \ - * XEN_GUEST_HANDLE and XEN_GUEST_HANDLE_PARAM are of \ - * the same type, then return hnd */ \ - (void)(&_x == &_y.p); \ - _y; \ -}) - #define guest_handle_for_field(hnd, type, fld) \ ((XEN_GUEST_HANDLE(type)) { &(hnd).p->fld }) diff --git a/xen/include/asm-x86/guest_access.h b/xen/include/asm-x86/guest_access.h index 064527895f..2be3577bd3 100644 --- a/xen/include/asm-x86/guest_access.h +++ b/xen/include/asm-x86/guest_access.h @@ -52,7 +52,7 @@ (XEN_GUEST_HANDLE_PARAM(type)) { _x }; \ }) -/* Cast a XEN_GUEST_HANDLE to XEN_GUEST_HANDLE_PARAM */ +/* Convert a XEN_GUEST_HANDLE to XEN_GUEST_HANDLE_PARAM */ #define guest_handle_to_param(hnd, type) ({ \ /* type checking: make sure that the pointers inside \ * XEN_GUEST_HANDLE and XEN_GUEST_HANDLE_PARAM are of \ @@ -62,16 +62,6 @@ (hnd); \ }) -/* Cast a XEN_GUEST_HANDLE_PARAM to XEN_GUEST_HANDLE */ -#define guest_handle_from_param(hnd, type) ({ \ - /* type checking: make sure that the pointers inside \ - * XEN_GUEST_HANDLE and XEN_GUEST_HANDLE_PARAM are of \ - * the same type, then return hnd */ \ - (void)((typeof(&(hnd).p)) 0 == \ - (typeof(&((XEN_GUEST_HANDLE_PARAM(type)) {}).p)) 0); \ - (hnd); \ -}) - #define guest_handle_for_field(hnd, type, fld) \ ((XEN_GUEST_HANDLE(type)) { &(hnd).p->fld }) diff --git a/xen/include/asm-x86/hap.h b/xen/include/asm-x86/hap.h index 1bf07e49fe..faf856913a 100644 --- a/xen/include/asm-x86/hap.h +++ b/xen/include/asm-x86/hap.h @@ -41,7 +41,7 @@ void hap_vcpu_init(struct vcpu *v); int hap_track_dirty_vram(struct domain *d, unsigned long begin_pfn, unsigned long nr, - XEN_GUEST_HANDLE_PARAM(void) dirty_bitmap); + XEN_GUEST_HANDLE(void) dirty_bitmap); extern const struct paging_mode *hap_paging_get_mode(struct vcpu *); int hap_set_allocation(struct domain *d, unsigned int pages, bool *preempted); diff --git a/xen/include/asm-x86/microcode.h b/xen/include/asm-x86/microcode.h index cbbe28cb45..9da63f992e 100644 --- a/xen/include/asm-x86/microcode.h +++ b/xen/include/asm-x86/microcode.h @@ -20,7 +20,7 @@ struct cpu_signature { DECLARE_PER_CPU(struct cpu_signature, cpu_sig); void microcode_set_module(unsigned int idx); -int microcode_update(XEN_GUEST_HANDLE_PARAM(const_void), unsigned long len); +int microcode_update(XEN_GUEST_HANDLE(const_void), unsigned long len); int early_microcode_init(void); int microcode_update_one(bool start_update); diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h index 8335862c87..224d1bc2f9 100644 --- a/xen/include/asm-x86/shadow.h +++ b/xen/include/asm-x86/shadow.h @@ -65,7 +65,7 @@ int shadow_enable(struct domain *d, u32 mode); int shadow_track_dirty_vram(struct domain *d, unsigned long first_pfn, unsigned long nr, - XEN_GUEST_HANDLE_PARAM(void) dirty_bitmap); + XEN_GUEST_HANDLE(void) dirty_bitmap); /* Handler for shadow control ops: operations from user-space to enable * and disable ephemeral shadow modes (test mode and log-dirty mode) and diff --git a/xen/include/xen/acpi.h b/xen/include/xen/acpi.h index 5cfa06005b..c945ab05c8 100644 --- a/xen/include/xen/acpi.h +++ b/xen/include/xen/acpi.h @@ -184,8 +184,8 @@ static inline unsigned int acpi_get_csubstate_limit(void) { return 0; } static inline void acpi_set_csubstate_limit(unsigned int new_limit) { return; } #endif -#ifdef XEN_GUEST_HANDLE_PARAM -int acpi_set_pdc_bits(u32 acpi_id, XEN_GUEST_HANDLE_PARAM(uint32)); +#ifdef XEN_GUEST_HANDLE +int acpi_set_pdc_bits(uint32_t acpi_id, XEN_GUEST_HANDLE(uint32)); #endif int arch_acpi_set_pdc_bits(u32 acpi_id, u32 *, u32 mask); -- generated by git-patchbot for /home/xen/git/xen.git#master
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |