Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP2:GA
xen.4698
55795a52-x86-vMSI-X-support-qword-MMIO-access.p...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 55795a52-x86-vMSI-X-support-qword-MMIO-access.patch of Package xen.4698
References: bsc#907514 bsc#910258 bsc#918984 bsc#923967 # Commit 284ffb4f9b0d5c3a33c4c5bd87645d0cc342ca96 # Date 2015-06-11 11:52:18 +0200 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> x86/vMSI-X: support qword MMIO access The specification explicitly provides for this, so we should have supported this from the beginning. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -232,7 +232,7 @@ static int msixtbl_read( unsigned int nr_entry, index; int r = X86EMUL_UNHANDLEABLE; - if ( len != 4 || (address & 3) ) + if ( (len != 4 && len != 8) || (address & (len - 1)) ) return r; rcu_read_lock(&msixtbl_rcu_lock); @@ -250,13 +250,25 @@ static int msixtbl_read( !acc_bit(test, entry, nr_entry, index) ) goto out; *pval = entry->gentries[nr_entry].msi_ad[index]; + if ( len == 8 ) + { + if ( index ) + offset = PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET; + else if ( acc_bit(test, entry, nr_entry, 1) ) + *pval |= (u64)entry->gentries[nr_entry].msi_ad[1] << 32; + else + goto out; + } } - else + if ( offset == PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET ) { virt = msixtbl_addr_to_virt(entry, address); if ( !virt ) goto out; - *pval = readl(virt); + if ( len == 4 ) + *pval = readl(virt); + else + *pval |= (u64)readl(virt) << 32; } r = X86EMUL_OKAY; @@ -277,7 +289,7 @@ static int msixtbl_write(struct vcpu *v, unsigned long flags, orig; struct irq_desc *desc; - if ( len != 4 || (address & 3) ) + if ( (len != 4 && len != 8) || (address & (len - 1)) ) return r; rcu_read_lock(&msixtbl_rcu_lock); @@ -288,16 +300,23 @@ static int msixtbl_write(struct vcpu *v, nr_entry = (address - entry->gtable) / PCI_MSIX_ENTRY_SIZE; offset = address & (PCI_MSIX_ENTRY_SIZE - 1); - if ( offset != PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET) + if ( offset != PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET ) { + index = offset / sizeof(uint32_t); if ( nr_entry < MAX_MSIX_ACC_ENTRIES ) { - index = offset / sizeof(uint32_t); entry->gentries[nr_entry].msi_ad[index] = val; acc_bit(set, entry, nr_entry, index); + if ( len == 8 && !index ) + { + entry->gentries[nr_entry].msi_ad[1] = val >> 32; + acc_bit(set, entry, nr_entry, 1); + } } set_bit(nr_entry, &entry->table_flags); - goto out; + if ( len != 8 || !index ) + goto out; + val >>= 32; } /* Exit to device model when unmasking and address/data got modified. */ @@ -361,7 +380,8 @@ static int msixtbl_write(struct vcpu *v, unlock: spin_unlock_irqrestore(&desc->lock, flags); - r = X86EMUL_OKAY; + if ( len == 4 ) + r = X86EMUL_OKAY; out: rcu_read_unlock(&msixtbl_rcu_lock);
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