On Tue, Jul 01, 2025 at 07:28:15PM +0200, Magnus Kulke wrote:
> Create the MSHV virtual machine by opening a partition and issuing
> the necessary ioctl to initialize it. This sets up the basic VM
> structure and initial configuration used by MSHV to manage guest state.
>
> Signed-off-by: Magnus Kulke <[email protected]>
> ---
> accel/mshv/mshv-all.c | 210 ++++++++++++++++++++++++++++++++++-
> accel/mshv/trace-events | 3 +
> accel/mshv/trace.h | 1 +
> include/system/mshv.h | 20 +++-
> meson.build | 1 +
> target/i386/mshv/meson.build | 1 +
> target/i386/mshv/mshv-cpu.c | 71 ++++++++++++
> 7 files changed, 300 insertions(+), 7 deletions(-)
> create mode 100644 accel/mshv/trace-events
> create mode 100644 accel/mshv/trace.h
> create mode 100644 target/i386/mshv/mshv-cpu.c
>
> diff --git a/accel/mshv/mshv-all.c b/accel/mshv/mshv-all.c
> index 9e0590c4f9..712e651627 100644
> --- a/accel/mshv/mshv-all.c
> +++ b/accel/mshv/mshv-all.c
> @@ -46,8 +46,177 @@ DECLARE_INSTANCE_CHECKER(MshvState, MSHV_STATE,
> TYPE_MSHV_ACCEL)
>
> bool mshv_allowed;
>
> -MshvState *mshv_state;
> +MshvState *mshv_state = NULL;
This is not needed. Global variables are initialized to zero by default.
>
> +static int init_mshv(int *mshv_fd)
> +{
> + int fd = open("/dev/mshv", O_RDWR | O_CLOEXEC);
> + if (fd < 0) {
> + error_report("Failed to open /dev/mshv: %s", strerror(errno));
> + return -1;
> + }
> + *mshv_fd = fd;
> + return 0;
Tabs here.
> +}
> +
> +/* freeze 1 to pause, 0 to resume */
> +static int set_time_freeze(int vm_fd, int freeze)
> +{
> + int ret;
> +
> + if (freeze != 0 && freeze != 1) {
> + error_report("Invalid time freeze value");
> + return -1;
> + }
> +
This is a static function. You know all callers already, so you can
dro the check here.
> + struct hv_input_set_partition_property in = {0};
> + in.property_code = HV_PARTITION_PROPERTY_TIME_FREEZE;
> + in.property_value = freeze;
> +
> + struct mshv_root_hvcall args = {0};
> + args.code = HVCALL_SET_PARTITION_PROPERTY;
> + args.in_sz = sizeof(in);
> + args.in_ptr = (uint64_t)∈
> +
> + ret = mshv_hvcall(vm_fd, &args);
> + if (ret < 0) {
> + error_report("Failed to set time freeze");
> + return -1;
> + }
> +
> + return 0;
> +}
> +
[...]
> typedef struct MshvState {
> - AccelState parent_obj;
> - int vm;
> - MshvMemoryListener memory_listener;
> - /* number of listeners */
> - int nr_as;
> - MshvAddressSpace *as;
> + AccelState parent_obj;
> + int vm;
> + MshvMemoryListener memory_listener;
> + /* number of listeners */
> + int nr_as;
> + MshvAddressSpace *as;
Unnecessary changes due to tabs.
> + int fd;
> } MshvState;
> extern MshvState *mshv_state;
Wei