x86/HVM: drop stdvga's "lock" struct member

No state is left to protect. It being the last field, drop the struct
itself as well. Similarly for then ending up empty, drop the .complete
handler.

This is part of XSA-463 / CVE-2024-45818

Suggested-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
(cherry picked from commit b180a50326)
This commit is contained in:
Jan Beulich committed 2024-11-12 14:14:43 +01:00
1 parent 1430b41348
commit 1eb843cd24
3 files changed
+2 -33

No files matched your search

+2 -28
View File
@@ -69,61 +69,35 @@ static int stdvga_mem_write(const struct hvm_io_handler *handler,
static bool_t stdvga_mem_accept(const struct hvm_io_handler *handler,
const ioreq_t *p)
{
struct hvm_hw_stdvga *s = &current->domain->arch.hvm.stdvga;
/*
* The range check must be done without taking the lock, to avoid
* deadlock when hvm_mmio_internal() is called from
* hvm_copy_to/from_guest_phys() in hvm_process_io_intercept().
*/
if ( (ioreq_mmio_first_byte(p) < VGA_MEM_BASE) ||
(ioreq_mmio_last_byte(p) >= (VGA_MEM_BASE + VGA_MEM_SIZE)) )
return 0;
spin_lock(&s->lock);
if ( p->dir != IOREQ_WRITE || p->data_is_ptr || p->count != 1 )
{
/*
* Only accept single direct writes, as that's the only thing we can
* accelerate using buffered ioreq handling.
*/
goto reject;
return false;
}
/* s->lock intentionally held */
return 1;
reject:
spin_unlock(&s->lock);
return 0;
}
static void stdvga_mem_complete(const struct hvm_io_handler *handler)
{
struct hvm_hw_stdvga *s = &current->domain->arch.hvm.stdvga;
spin_unlock(&s->lock);
return true;
}
static const struct hvm_io_ops stdvga_mem_ops = {
.accept = stdvga_mem_accept,
.read = stdvga_mem_read,
.write = stdvga_mem_write,
.complete = stdvga_mem_complete
};
void stdvga_init(struct domain *d)
{
struct hvm_hw_stdvga *s = &d->arch.hvm.stdvga;
struct hvm_io_handler *handler;
if ( !has_vvga(d) )
return;
memset(s, 0, sizeof(*s));
spin_lock_init(&s->lock);
/* VGA memory */
handler = hvm_next_io_handler(d);
if ( handler )
-1
View File
@@ -83,7 +83,6 @@ struct hvm_domain {
struct hvm_hw_vpic vpic[2]; /* 0=master; 1=slave */
struct hvm_vioapic **vioapic;
unsigned int nr_vioapics;
struct hvm_hw_stdvga stdvga;
/*
* hvm_hw_pmtimer is a publicly-visible name. We will defer renaming
-4
View File
@@ -121,10 +121,6 @@ struct vpci_arch_msix_entry {
int pirq;
};
struct hvm_hw_stdvga {
spinlock_t lock;
};
void stdvga_init(struct domain *d);
extern void hvm_dpci_msi_eoi(struct domain *d, int vector);
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.