[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] libxc: Add xc_domain_hvm_get_mtrr_type() call
Add a xc_domain_hvm_get_mtrr_type() call to the libxc API, to support functionality similar to get_mtrr_type() (which is only available at the hypervisor level). Signed-off-by: Razvan Cojocaru <rzvncj@xxxxxxxxx> diff -r f50aab21f9f2 -r a23515aabc91 tools/libxc/xc_domain.c --- a/tools/libxc/xc_domain.c Thu Dec 13 14:39:31 2012 +0000 +++ b/tools/libxc/xc_domain.c Mon Dec 17 12:53:11 2012 +0200 @@ -379,6 +379,45 @@ int xc_domain_hvm_setcontext(xc_interfac return ret; } +#define MTRR_PHYSMASK_VALID_BIT 11 +#define MTRR_PHYSMASK_SHIFT 12 +#define MTRR_PHYSBASE_TYPE_MASK 0xff /* lowest 8 bits */ + +int xc_domain_hvm_get_mtrr_type(xc_interface *xch, + uint32_t domid, + unsigned long paddress, + uint8_t *type) +{ + struct hvm_hw_mtrr hw_mtrr; + int32_t seg; + uint8_t num_var_ranges; + uint64_t phys_base; + uint64_t phys_mask; + + if ( xc_domain_hvm_getcontext_partial(xch, domid, HVM_SAVE_CODE(MTRR), 0, &hw_mtrr, sizeof hw_mtrr) ) + return -1; + + num_var_ranges = hw_mtrr.msr_mtrr_cap & 0xff; + + for ( seg = 0; seg < num_var_ranges; seg++ ) + { + phys_base = hw_mtrr.msr_mtrr_var[seg*2]; + phys_mask = hw_mtrr.msr_mtrr_var[seg*2 + 1]; + + if ( phys_mask & (1 << MTRR_PHYSMASK_VALID_BIT) ) + { + if ( ((uint64_t) paddress & phys_mask) >> MTRR_PHYSMASK_SHIFT == + (phys_base & phys_mask) >> MTRR_PHYSMASK_SHIFT ) + { + *type = phys_base & MTRR_PHYSBASE_TYPE_MASK; + return 0; + } + } + } + + return -1; +} + int xc_vcpu_getcontext(xc_interface *xch, uint32_t domid, uint32_t vcpu, diff -r f50aab21f9f2 -r a23515aabc91 tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h Thu Dec 13 14:39:31 2012 +0000 +++ b/tools/libxc/xenctrl.h Mon Dec 17 12:53:11 2012 +0200 @@ -633,6 +633,15 @@ int xc_domain_hvm_setcontext(xc_interfac uint32_t size); /** + * This function returns information about the MTRR type of + * a given guest physical address/ + */ +int xc_domain_hvm_get_mtrr_type(xc_interface *xch, + uint32_t domid, + unsigned long paddress, + uint8_t *type); + +/** * This function returns information about the execution context of a * particular vcpu of a domain. * _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |