Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP2:GA
xen.3680
5576f143-x86-adjust-PV-I-O-emulation-functions-...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5576f143-x86-adjust-PV-I-O-emulation-functions-types.patch of Package xen.3680
References: bsc#907514 bsc#910258 bsc#918984 bsc#923967 # Commit 85baced14dec2fafa9fe560969dba2ae28e8bebb # Date 2015-06-09 15:59:31 +0200 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> x86: adjust PV I/O emulation functions' types admin_io_okay(), guest_io_read(), and guest_io_write() all don't need their current "regs" parameter at all, and they don't use the vCPU passed to them for other than obtaining its domain. Drop the former and replace the latter by a struct domain pointer. pci_cfg_okay() returns a boolean type, and its "write" parameter is of boolean kind too. All of them get called for the current vCPU (and hence current domain) only, so name the domain parameters accordingly except in the admin_io_okay() case, which a subsequent patch will use for simplifying setup_io_bitmap(). Latch current->domain into a local variable in emulate_privileged_op(). Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> # Commit 2d67a7a4d37a4759bcd7f2ee2d740497ad669c7d # Date 2015-06-18 15:07:10 +0200 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> x86: synchronize PCI config space access decoding Both PV and HVM logic have similar but not similar enough code here. Synchronize the two so that - in the HVM case we don't unconditionally try to access extended config space - in the PV case we pass a correct range to the XSM hook - in the PV case we don't needlessly deny access when the operation isn't really on PCI config space All this along with sharing the macros HVM already had here. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> Backport stripped down to just the pci_cfg_ok() adjustments. Index: xen-4.4.4-testing/xen/arch/x86/traps.c =================================================================== --- xen-4.4.4-testing.orig/xen/arch/x86/traps.c +++ xen-4.4.4-testing/xen/arch/x86/traps.c @@ -1661,14 +1661,18 @@ static int admin_io_okay( return ioports_access_permitted(v->domain, port, port + bytes - 1); } -static int pci_cfg_ok(struct domain *d, int write, int size) +static bool_t pci_cfg_ok(struct domain *currd, bool_t write, + unsigned int start, unsigned int size) { uint32_t machine_bdf; - uint16_t start, end; - if (!is_hardware_domain(d)) + + if ( !is_hardware_domain(currd) ) return 0; - machine_bdf = (d->arch.pci_cf8 >> 8) & 0xFFFF; + if ( !CF8_ENABLED(currd->arch.pci_cf8) ) + return 1; + + machine_bdf = CF8_BDF(currd->arch.pci_cf8); if ( write ) { const unsigned long *ro_map = pci_get_ro_map(0); @@ -1676,9 +1680,9 @@ static int pci_cfg_ok(struct domain *d, if ( ro_map && test_bit(machine_bdf, ro_map) ) return 0; } - start = d->arch.pci_cf8 & 0xFF; + start |= CF8_ADDR_LO(currd->arch.pci_cf8); /* AMD extended configuration space access? */ - if ( (d->arch.pci_cf8 & 0x0F000000) && + if ( CF8_ADDR_HI(currd->arch.pci_cf8) && boot_cpu_data.x86_vendor == X86_VENDOR_AMD && boot_cpu_data.x86 >= 0x10 && boot_cpu_data.x86 <= 0x17 ) { @@ -1687,12 +1691,11 @@ static int pci_cfg_ok(struct domain *d, if ( rdmsr_safe(MSR_AMD64_NB_CFG, msr_val) ) return 0; if ( msr_val & (1ULL << AMD64_NB_CFG_CF8_EXT_ENABLE_BIT) ) - start |= (d->arch.pci_cf8 >> 16) & 0xF00; + start |= CF8_ADDR_HI(currd->arch.pci_cf8); } - end = start + size - 1; - if (xsm_pci_config_permission(XSM_HOOK, d, machine_bdf, start, end, write)) - return 0; - return 1; + + return !xsm_pci_config_permission(XSM_HOOK, currd, machine_bdf, + start, start + size - 1, write); } uint32_t guest_io_read( @@ -1746,7 +1749,7 @@ uint32_t guest_io_read( size = min(bytes, 4 - (port & 3)); if ( size == 3 ) size = 2; - if ( pci_cfg_ok(v->domain, 0, size) ) + if ( pci_cfg_ok(v->domain, 0, port & 3, size) ) sub_data = pci_conf_read(v->domain->arch.pci_cf8, port & 3, size); } @@ -1819,7 +1822,7 @@ void guest_io_write( size = min(bytes, 4 - (port & 3)); if ( size == 3 ) size = 2; - if ( pci_cfg_ok(v->domain, 1, size) ) + if ( pci_cfg_ok(v->domain, 1, port & 3, size) ) pci_conf_write(v->domain->arch.pci_cf8, port & 3, size, data); } Index: xen-4.4.4-testing/xen/include/asm-x86/pci.h =================================================================== --- xen-4.4.4-testing.orig/xen/include/asm-x86/pci.h +++ xen-4.4.4-testing/xen/include/asm-x86/pci.h @@ -1,6 +1,11 @@ #ifndef __X86_PCI_H__ #define __X86_PCI_H__ +#define CF8_BDF(cf8) ( ((cf8) & 0x00ffff00) >> 8) +#define CF8_ADDR_LO(cf8) ( (cf8) & 0x000000fc) +#define CF8_ADDR_HI(cf8) ( ((cf8) & 0x0f000000) >> 16) +#define CF8_ENABLED(cf8) (!!((cf8) & 0x80000000)) + #define IS_SNB_GFX(id) (id == 0x01068086 || id == 0x01168086 \ || id == 0x01268086 || id == 0x01028086 \ || id == 0x01128086 || id == 0x01228086 \
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor