x86/HVM: grow MMIO cache data size to 64 bytes

This is needed before enabling any AVX512 insns in the emulator. Change
the way alignment is enforced at the same time.

Add a check that the buffer won't actually overflow, and while at it
also convert the check for accesses to not cross page boundaries.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Jan Beulich committed 2018-11-19 09:41:25 +01:00
1 parent 901abfef5d
commit d95da91fb4
2 files changed
+14 -4

No files matched your search

+12 -1
View File
@@ -876,7 +876,18 @@ static int hvmemul_phys_mmio_access(
int rc = X86EMUL_OKAY;
/* Accesses must fall within a page. */
BUG_ON((gpa & ~PAGE_MASK) + size > PAGE_SIZE);
if ( (gpa & ~PAGE_MASK) + size > PAGE_SIZE )
{
ASSERT_UNREACHABLE();
return X86EMUL_UNHANDLEABLE;
}
/* Accesses must not overflow the cache's buffer. */
if ( size > sizeof(cache->buffer) )
{
ASSERT_UNREACHABLE();
return X86EMUL_UNHANDLEABLE;
}
/*
* hvmemul_do_io() cannot handle non-power-of-2 accesses or
+2 -3
View File
@@ -42,15 +42,14 @@ struct hvm_vcpu_asid {
};
/*
* We may read or write up to m256 as a number of device-model
* We may read or write up to m512 as a number of device-model
* transactions.
*/
struct hvm_mmio_cache {
unsigned long gla;
unsigned int size;
uint8_t dir;
uint8_t pad[3]; /* make buffer[] long-aligned */
uint8_t buffer[32];
uint8_t buffer[64] __aligned(sizeof(long));
};
struct hvm_vcpu_io {
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.