mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
accel/mshv: Register memory region listeners
Add memory listener hooks for the MSHV accelerator to track guest memory regions. This enables the backend to respond to region additions, removals and will be used to manage guest memory mappings inside the hypervisor. Actually registering physical memory in the hypervisor is still stubbed out. Signed-off-by: Magnus Kulke <magnuskulke@linux.microsoft.com> Link: https://lore.kernel.org/r/20250916164847.77883-9-magnuskulke@linux.microsoft.com [mshv.h/mshv_int.h split. - Paolo] Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
d0d2918f96
commit
5006ea1344
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* QEMU MSHV support
|
||||
*
|
||||
* Copyright Microsoft, Corp. 2025
|
||||
*
|
||||
* Authors:
|
||||
* Magnus Kulke <magnuskulke@microsoft.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "system/address-spaces.h"
|
||||
#include "system/mshv.h"
|
||||
#include "system/mshv_int.h"
|
||||
|
||||
void mshv_set_phys_mem(MshvMemoryListener *mml, MemoryRegionSection *section,
|
||||
bool add)
|
||||
{
|
||||
error_report("unimplemented");
|
||||
abort();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
mshv_ss = ss.source_set()
|
||||
mshv_ss.add(if_true: files(
|
||||
'mem.c',
|
||||
'mshv-all.c'
|
||||
))
|
||||
|
||||
|
||||
+65
-2
@@ -49,10 +49,73 @@ bool mshv_allowed;
|
||||
|
||||
MshvState *mshv_state;
|
||||
|
||||
static void mem_region_add(MemoryListener *listener,
|
||||
MemoryRegionSection *section)
|
||||
{
|
||||
MshvMemoryListener *mml;
|
||||
mml = container_of(listener, MshvMemoryListener, listener);
|
||||
memory_region_ref(section->mr);
|
||||
mshv_set_phys_mem(mml, section, true);
|
||||
}
|
||||
|
||||
static void mem_region_del(MemoryListener *listener,
|
||||
MemoryRegionSection *section)
|
||||
{
|
||||
MshvMemoryListener *mml;
|
||||
mml = container_of(listener, MshvMemoryListener, listener);
|
||||
mshv_set_phys_mem(mml, section, false);
|
||||
memory_region_unref(section->mr);
|
||||
}
|
||||
|
||||
static MemoryListener mshv_memory_listener = {
|
||||
.name = "mshv",
|
||||
.priority = MEMORY_LISTENER_PRIORITY_ACCEL,
|
||||
.region_add = mem_region_add,
|
||||
.region_del = mem_region_del,
|
||||
};
|
||||
|
||||
static MemoryListener mshv_io_listener = {
|
||||
.name = "mshv", .priority = MEMORY_LISTENER_PRIORITY_DEV_BACKEND,
|
||||
/* MSHV does not support PIO eventfd */
|
||||
};
|
||||
|
||||
static void register_mshv_memory_listener(MshvState *s, MshvMemoryListener *mml,
|
||||
AddressSpace *as, int as_id,
|
||||
const char *name)
|
||||
{
|
||||
int i;
|
||||
|
||||
mml->listener = mshv_memory_listener;
|
||||
mml->listener.name = name;
|
||||
memory_listener_register(&mml->listener, as);
|
||||
for (i = 0; i < s->nr_as; ++i) {
|
||||
if (!s->as[i].as) {
|
||||
s->as[i].as = as;
|
||||
s->as[i].ml = mml;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int mshv_init(AccelState *as, MachineState *ms)
|
||||
{
|
||||
error_report("unimplemented");
|
||||
abort();
|
||||
MshvState *s;
|
||||
s = MSHV_STATE(as);
|
||||
|
||||
accel_blocker_init();
|
||||
|
||||
s->vm = 0;
|
||||
|
||||
s->nr_as = 1;
|
||||
s->as = g_new0(MshvAddressSpace, s->nr_as);
|
||||
|
||||
mshv_state = s;
|
||||
|
||||
register_mshv_memory_listener(s, &s->memory_listener, &address_space_memory,
|
||||
0, "mshv-memory");
|
||||
memory_listener_register(&mshv_io_listener, &address_space_io);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mshv_start_vcpu_thread(CPUState *cpu)
|
||||
|
||||
@@ -38,4 +38,8 @@ struct MshvState {
|
||||
MshvAddressSpace *as;
|
||||
};
|
||||
|
||||
/* memory */
|
||||
void mshv_set_phys_mem(MshvMemoryListener *mml, MemoryRegionSection *section,
|
||||
bool add);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user