qemu/target/i386/hvf
Phil Dennis-Jordan 3e2c6727cb i386/hvf: Fixes dirty memory tracking by page granularity RX->RWX change
When using x86 macOS Hypervisor.framework as accelerator, detection of
dirty memory regions is implemented by marking logged memory region
slots as read-only in the EPT, then setting the dirty flag when a
guest write causes a fault. The area marked dirty should then be marked
writable in order for subsequent writes to succeed without a VM exit.

However, dirty bits are tracked on a per-page basis, whereas the fault
handler was marking the whole logged memory region as writable. This
change fixes the fault handler so only the protection of the single
faulting page is marked as dirty.

(Note: the dirty page tracking appeared to work despite this error
because HVF’s hv_vcpu_run() function generated unnecessary EPT fault
exits, which ended up causing the dirty marking handler to run even
when the memory region had been marked RW. When using
hv_vcpu_run_until(), a change planned for a subsequent commit, these
spurious exits no longer occur, so dirty memory tracking malfunctions.)

Additionally, the dirty page is set to permit code execution, the same
as all other guest memory; changing memory protection from RX to RW not
RWX appears to have been an oversight.

Signed-off-by: Phil Dennis-Jordan <phil@philjordan.eu>
Reviewed-by: Roman Bolshakov <roman@roolebo.dev>
Tested-by: Roman Bolshakov <roman@roolebo.dev>
Message-ID: <20240605112556.43193-5-phil@philjordan.eu>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2024-06-08 10:33:38 +02:00
..
hvf-cpu.c sysemu/kvm: Restrict hvf_get_supported_cpuid() to x86 targets 2023-10-07 19:02:32 +02:00
hvf-i386.h sysemu/kvm: Restrict hvf_get_supported_cpuid() to x86 targets 2023-10-07 19:02:32 +02:00
hvf.c i386/hvf: Fixes dirty memory tracking by page granularity RX->RWX change 2024-06-08 10:33:38 +02:00
meson.build meson: Replace softmmu_ss -> system_ss 2023-06-20 10:01:30 +02:00
panic.h x86 hvf cpus: Fix Lesser GPL version number 2020-11-15 16:45:27 +01:00
README.md system/cpus: rename qemu_mutex_lock_iothread() to bql_lock() 2024-01-08 10:45:43 -05:00
vmcs.h hvf: Enable RDTSCP support 2022-07-13 00:05:39 +02:00
vmx.h i386/hvf: Fixes some compilation warnings 2024-06-08 10:33:38 +02:00
x86_cpuid.c i386/hvf: Adds support for INVTSC cpuid bit 2024-06-08 10:33:38 +02:00
x86_decode.c i386/hvf: Fixes some compilation warnings 2024-06-08 10:33:38 +02:00
x86_decode.h x86 hvf cpus: Fix Lesser GPL version number 2020-11-15 16:45:27 +01:00
x86_descr.c target/i386/hvf: Use CPUState typedef 2024-03-12 12:03:58 +01:00
x86_descr.h target/i386/hvf: Use CPUState typedef 2024-03-12 12:03:58 +01:00
x86_emu.c i386/hvf: Fixes some compilation warnings 2024-06-08 10:33:38 +02:00
x86_emu.h target/i386/hvf: Use CPUState typedef 2024-03-12 12:03:58 +01:00
x86_flags.c Remove qemu-common.h include from most units 2022-04-06 14:31:55 +02:00
x86_flags.h x86 hvf cpus: Fix Lesser GPL version number 2020-11-15 16:45:27 +01:00
x86_mmu.c target/i386/hvf: Use CPUState typedef 2024-03-12 12:03:58 +01:00
x86_mmu.h target/i386/hvf: Use CPUState typedef 2024-03-12 12:03:58 +01:00
x86_task.c accel: Rename HVF 'struct hvf_vcpu_state' -> AccelCPUState 2023-06-28 14:14:22 +02:00
x86_task.h Clean up header guards that don't match their file name 2019-05-13 08:58:55 +02:00
x86.c target/i386/hvf: Use CPUState typedef 2024-03-12 12:03:58 +01:00
x86.h target/i386/hvf: Use CPUState typedef 2024-03-12 12:03:58 +01:00
x86hvf.c accel/hvf: Use accel-specific per-vcpu @dirty field 2024-04-26 17:03:00 +02:00
x86hvf.h accel: Rename 'cpu_state' -> 'cs' 2023-06-28 13:55:35 +02:00

OS X Hypervisor.framework support in QEMU

These sources (and ../hvf-all.c) are adapted from Veertu Inc's vdhh (Veertu Desktop Hosted Hypervisor) (last known location: https://github.com/veertuinc/vdhh) with some minor changes, the most significant of which were:

  1. Adapt to our current QEMU's CPUState structure and address_space_rw API; many struct members have been moved around (emulated x86 state, xsave_buf) due to historical differences + QEMU needing to handle more emulation targets.
  2. Removal of apic_page and hyperv-related functionality.
  3. More relaxed use of bql_lock.