Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
---
accel/hvf/hvf-all.c | 7 +++++--
hw/arm/virt.c | 41 ++++----------------------------------
include/hw/boards.h | 4 ++--
include/system/hvf_int.h | 2 ++
target/arm/hvf-stub.c | 20 -------------------
target/arm/hvf/hvf.c | 6 +++---
target/arm/hvf_arm.h | 3 ---
target/arm/meson.build | 1 -
target/arm/whpx/whpx-all.c | 5 +++--
target/i386/hvf/hvf.c | 10 ++++++++++
10 files changed, 29 insertions(+), 70 deletions(-)
delete mode 100644 target/arm/hvf-stub.c
diff --git a/accel/hvf/hvf-all.c b/accel/hvf/hvf-all.c
index 0a4b498e83..8229ad8640 100644
--- a/accel/hvf/hvf-all.c
+++ b/accel/hvf/hvf-all.c
@@ -17,6 +17,7 @@
#include "system/hvf_int.h"
#include "hw/core/cpu.h"
#include "hw/boards.h"
+#include "target/arm/hvf_arm.h"
#include "trace.h"
bool hvf_allowed;
@@ -256,8 +257,10 @@ static int hvf_accel_init(AccelState *as, MachineState *ms)
int pa_range = 36;
MachineClass *mc = MACHINE_GET_CLASS(ms);
- if (mc->hvf_get_physical_address_range) {
- pa_range = mc->hvf_get_physical_address_range(ms);
+
+ if (mc->get_physical_address_range) {
+ pa_range = mc->get_physical_address_range(ms,
+ hvf_arch_get_default_ipa_bit_size(), hvf_arch_get_max_ipa_bit_size());
if (pa_range < 0) {
return -EINVAL;
}
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index f90c3fc113..c980f59e82 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -3163,43 +3163,11 @@ static int virt_kvm_type(MachineState *ms, const char *type_str)
return fixed_ipa ? 0 : requested_pa_size;
}
-static int virt_whpx_get_physical_address_range(MachineState *ms)
+static int virt_get_physical_address_range(MachineState *ms,
+ int default_ipa_size, int max_ipa_size)
{
VirtMachineState *vms = VIRT_MACHINE(ms);
- int max_ipa_size = whpx_arm_get_ipa_bit_size();
-
- /* We freeze the memory map to compute the highest gpa */
- virt_set_memmap(vms, max_ipa_size);
-
- int requested_ipa_size = 64 - clz64(vms->highest_gpa);
-
- /*
- * If we're <= the default IPA size just use the default.
- * If we're above the default but below the maximum, round up to
- * the maximum. hvf_arm_get_max_ipa_bit_size() conveniently only
- * returns values that are valid ARM PARange values.
- */
- if (requested_ipa_size <= max_ipa_size) {
- requested_ipa_size = max_ipa_size;
- } else {
- error_report("-m and ,maxmem option values "
- "require an IPA range (%d bits) larger than "
- "the one supported by the host (%d bits)",
- requested_ipa_size, max_ipa_size);
- return -1;
- }
-
- return requested_ipa_size;
-}
-
-static int virt_hvf_get_physical_address_range(MachineState *ms)
-{
- VirtMachineState *vms = VIRT_MACHINE(ms);
-
- int default_ipa_size = hvf_arm_get_default_ipa_bit_size();
- int max_ipa_size = hvf_arm_get_max_ipa_bit_size();
-
/* We freeze the memory map to compute the highest gpa */
virt_set_memmap(vms, max_ipa_size);
@@ -3208,7 +3176,7 @@ static int virt_hvf_get_physical_address_range(MachineState *ms)
/*
* If we're <= the default IPA size just use the default.
* If we're above the default but below the maximum, round up to
- * the maximum. hvf_arm_get_max_ipa_bit_size() conveniently only
+ * the maximum. hvf_arch_get_max_ipa_bit_size() conveniently only
* returns values that are valid ARM PARange values.
*/
if (requested_ipa_size <= default_ipa_size) {
@@ -3286,8 +3254,7 @@ static void virt_machine_class_init(ObjectClass *oc, const void *data)
mc->valid_cpu_types = valid_cpu_types;
mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
mc->kvm_type = virt_kvm_type;
- mc->hvf_get_physical_address_range = virt_hvf_get_physical_address_range;
- mc->whpx_get_physical_address_range = virt_whpx_get_physical_address_range;
+ mc->get_physical_address_range = virt_get_physical_address_range;
assert(!mc->get_hotplug_handler);
mc->get_hotplug_handler = virt_machine_get_hotplug_handler;
hc->pre_plug = virt_machine_device_pre_plug_cb;
diff --git a/include/hw/boards.h b/include/hw/boards.h
index dde8013bd7..fa3843a11b 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -275,8 +275,8 @@ struct MachineClass {
void (*reset)(MachineState *state, ResetType type);
void (*wakeup)(MachineState *state);
int (*kvm_type)(MachineState *machine, const char *arg);
- int (*hvf_get_physical_address_range)(MachineState *machine);
- int (*whpx_get_physical_address_range)(MachineState *machine);
+ int (*get_physical_address_range)(MachineState *machine,
+ int default_ipa_size, int max_ipa_size);
BlockInterfaceType block_default_type;
int units_per_default_bus;
diff --git a/include/system/hvf_int.h b/include/system/hvf_int.h
index a3b06a3e75..8b6447c238 100644
--- a/include/system/hvf_int.h
+++ b/include/system/hvf_int.h
@@ -71,6 +71,8 @@ void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line,
const char *hvf_return_string(hv_return_t ret);
int hvf_arch_init(void);
hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range);
+uint32_t hvf_arch_get_default_ipa_bit_size(void);
+uint32_t hvf_arch_get_max_ipa_bit_size(void);
int hvf_arch_init_vcpu(CPUState *cpu);
void hvf_arch_vcpu_destroy(CPUState *cpu);
int hvf_vcpu_exec(CPUState *);
diff --git a/target/arm/hvf-stub.c b/target/arm/hvf-stub.c
deleted file mode 100644
index ff137267a0..0000000000
--- a/target/arm/hvf-stub.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * QEMU Hypervisor.framework (HVF) stubs for ARM
- *
- * Copyright (c) Linaro
- *
- * SPDX-License-Identifier: GPL-2.0-or-later
- */
-
-#include "qemu/osdep.h"
-#include "hvf_arm.h"
-
-uint32_t hvf_arm_get_default_ipa_bit_size(void)
-{
- g_assert_not_reached();
-}
-
-uint32_t hvf_arm_get_max_ipa_bit_size(void)
-{
- g_assert_not_reached();
-}
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
index 47b0cd3a35..58135d1e18 100644
--- a/target/arm/hvf/hvf.c
+++ b/target/arm/hvf/hvf.c
@@ -850,7 +850,7 @@ static uint64_t hvf_get_reg(CPUState *cpu, int rt)
static void clamp_id_aa64mmfr0_parange_to_ipa_size(ARMISARegisters *isar)
{
uint32_t ipa_size = chosen_ipa_bit_size ?
- chosen_ipa_bit_size : hvf_arm_get_max_ipa_bit_size();
+ chosen_ipa_bit_size : hvf_arch_get_max_ipa_bit_size();
uint64_t id_aa64mmfr0;
/* Clamp down the PARange to the IPA size the kernel supports. */
@@ -940,7 +940,7 @@ static bool hvf_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
return r == HV_SUCCESS;
}
-uint32_t hvf_arm_get_default_ipa_bit_size(void)
+uint32_t hvf_arch_get_default_ipa_bit_size(void)
{
uint32_t default_ipa_size;
hv_return_t ret = hv_vm_config_get_default_ipa_size(&default_ipa_size);
@@ -949,7 +949,7 @@ uint32_t hvf_arm_get_default_ipa_bit_size(void)
return default_ipa_size;
}
-uint32_t hvf_arm_get_max_ipa_bit_size(void)
+uint32_t hvf_arch_get_max_ipa_bit_size(void)
{
uint32_t max_ipa_size;
hv_return_t ret = hv_vm_config_get_max_ipa_size(&max_ipa_size);
diff --git a/target/arm/hvf_arm.h b/target/arm/hvf_arm.h
index ea82f2691d..5d19d82e5d 100644
--- a/target/arm/hvf_arm.h
+++ b/target/arm/hvf_arm.h
@@ -22,7 +22,4 @@ void hvf_arm_init_debug(void);
void hvf_arm_set_cpu_features_from_host(ARMCPU *cpu);
-uint32_t hvf_arm_get_default_ipa_bit_size(void);
-uint32_t hvf_arm_get_max_ipa_bit_size(void);
-
#endif
diff --git a/target/arm/meson.build b/target/arm/meson.build
index e28bd3f8e2..f0f1b55e43 100644
--- a/target/arm/meson.build
+++ b/target/arm/meson.build
@@ -32,7 +32,6 @@ arm_common_system_ss.add(files('cpu.c'))
arm_common_system_ss.add(when: 'TARGET_AARCH64', if_false: files(
'cpu32-stubs.c'))
arm_common_system_ss.add(when: 'CONFIG_KVM', if_false: files('kvm-stub.c'))
-arm_common_system_ss.add(when: 'CONFIG_HVF', if_false: files('hvf-stub.c'))
arm_common_system_ss.add(files(
'arch_dump.c',
'arm-powerctl.c',
diff --git a/target/arm/whpx/whpx-all.c b/target/arm/whpx/whpx-all.c
index ed447bf014..7f76c9d52e 100644
--- a/target/arm/whpx/whpx-all.c
+++ b/target/arm/whpx/whpx-all.c
@@ -805,8 +805,9 @@ int whpx_accel_init(AccelState *as, MachineState *ms)
goto error;
}
- if (mc->whpx_get_physical_address_range) {
- pa_range = mc->whpx_get_physical_address_range(ms);
+ if (mc->get_physical_address_range) {
+ pa_range = mc->get_physical_address_range(ms,
+ whpx_arm_get_ipa_bit_size(), whpx_arm_get_ipa_bit_size());
if (pa_range < 0) {
return -EINVAL;
}
diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
index 818b50419f..fa06e3b815 100644
--- a/target/i386/hvf/hvf.c
+++ b/target/i386/hvf/hvf.c
@@ -225,6 +225,16 @@ int hvf_arch_init(void)
return 0;
}
+uint32_t hvf_arch_get_default_ipa_bit_size(void)
+{
+ return 48;
+}
+
+uint32_t hvf_arch_get_max_ipa_bit_size(void)
+{
+ return 48;
+}
+
hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range)
{
return hv_vm_create(HV_VM_DEFAULT);
--
2.39.5 (Apple Git-154)
On 4/8/25 16:23, Mohamed Mediouni wrote:
> Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
> ---
> accel/hvf/hvf-all.c | 7 +++++--
> hw/arm/virt.c | 41 ++++----------------------------------
> include/hw/boards.h | 4 ++--
> include/system/hvf_int.h | 2 ++
> target/arm/hvf-stub.c | 20 -------------------
> target/arm/hvf/hvf.c | 6 +++---
> target/arm/hvf_arm.h | 3 ---
> target/arm/meson.build | 1 -
> target/arm/whpx/whpx-all.c | 5 +++--
> target/i386/hvf/hvf.c | 10 ++++++++++
> 10 files changed, 29 insertions(+), 70 deletions(-)
> delete mode 100644 target/arm/hvf-stub.c
> diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
> index 818b50419f..fa06e3b815 100644
> --- a/target/i386/hvf/hvf.c
> +++ b/target/i386/hvf/hvf.c
> @@ -225,6 +225,16 @@ int hvf_arch_init(void)
> return 0;
> }
>
> +uint32_t hvf_arch_get_default_ipa_bit_size(void)
> +{
> + return 48;
> +}
> +
> +uint32_t hvf_arch_get_max_ipa_bit_size(void)
> +{
> + return 48;
These don't make much sense on x86...
> +}
On 8/4/25 4:03 PM, Philippe Mathieu-Daudé wrote:
> On 4/8/25 16:23, Mohamed Mediouni wrote:
>> Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
>> ---
>> accel/hvf/hvf-all.c | 7 +++++--
>> hw/arm/virt.c | 41 ++++----------------------------------
>> include/hw/boards.h | 4 ++--
>> include/system/hvf_int.h | 2 ++
>> target/arm/hvf-stub.c | 20 -------------------
>> target/arm/hvf/hvf.c | 6 +++---
>> target/arm/hvf_arm.h | 3 ---
>> target/arm/meson.build | 1 -
>> target/arm/whpx/whpx-all.c | 5 +++--
>> target/i386/hvf/hvf.c | 10 ++++++++++
>> 10 files changed, 29 insertions(+), 70 deletions(-)
>> delete mode 100644 target/arm/hvf-stub.c
>
>
>> diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
>> index 818b50419f..fa06e3b815 100644
>> --- a/target/i386/hvf/hvf.c
>> +++ b/target/i386/hvf/hvf.c
>> @@ -225,6 +225,16 @@ int hvf_arch_init(void)
>> return 0;
>> }
>>
>> +uint32_t hvf_arch_get_default_ipa_bit_size(void)
>> +{
>> + return 48;
>> +}
>> +
>> +uint32_t hvf_arch_get_max_ipa_bit_size(void)
>> +{
>> + return 48;
>
> These don't make much sense on x86...
>
Common path in accel/hvf/hvf-all.c makes use of it, so it's not a bad
idea to have an architecture agnostic function for it, instead of:
if (arm_function) {...}.
It happens that on x64, VA space is 48 bits.
>> +}
>
>
On 8/5/25 09:03, Philippe Mathieu-Daudé wrote:
> On 4/8/25 16:23, Mohamed Mediouni wrote:
>> Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
>> ---
>> accel/hvf/hvf-all.c | 7 +++++--
>> hw/arm/virt.c | 41 ++++----------------------------------
>> include/hw/boards.h | 4 ++--
>> include/system/hvf_int.h | 2 ++
>> target/arm/hvf-stub.c | 20 -------------------
>> target/arm/hvf/hvf.c | 6 +++---
>> target/arm/hvf_arm.h | 3 ---
>> target/arm/meson.build | 1 -
>> target/arm/whpx/whpx-all.c | 5 +++--
>> target/i386/hvf/hvf.c | 10 ++++++++++
>> 10 files changed, 29 insertions(+), 70 deletions(-)
>> delete mode 100644 target/arm/hvf-stub.c
>
>
>> diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
>> index 818b50419f..fa06e3b815 100644
>> --- a/target/i386/hvf/hvf.c
>> +++ b/target/i386/hvf/hvf.c
>> @@ -225,6 +225,16 @@ int hvf_arch_init(void)
>> return 0;
>> }
>> +uint32_t hvf_arch_get_default_ipa_bit_size(void)
>> +{
>> + return 48;
>> +}
>> +
>> +uint32_t hvf_arch_get_max_ipa_bit_size(void)
>> +{
>> + return 48;
>
> These don't make much sense on x86...
They don't *not* make sense. x86 does have two-stage translation, though it has both
48-bit and 52-bit translation.
While this is only invoked from hw/arm/virt.c at present, I can see that by piping the
path through accel/hvf/ means that x86 needs to provide the symbols. Though perhaps they
should just be g_assert_not_reached() stubs for now.
r~
> On 5. Aug 2025, at 01:13, Richard Henderson <richard.henderson@linaro.org> wrote:
>
> On 8/5/25 09:03, Philippe Mathieu-Daudé wrote:
>> On 4/8/25 16:23, Mohamed Mediouni wrote:
>>> Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
>>> ---
>>> accel/hvf/hvf-all.c | 7 +++++--
>>> hw/arm/virt.c | 41 ++++----------------------------------
>>> include/hw/boards.h | 4 ++--
>>> include/system/hvf_int.h | 2 ++
>>> target/arm/hvf-stub.c | 20 -------------------
>>> target/arm/hvf/hvf.c | 6 +++---
>>> target/arm/hvf_arm.h | 3 ---
>>> target/arm/meson.build | 1 -
>>> target/arm/whpx/whpx-all.c | 5 +++--
>>> target/i386/hvf/hvf.c | 10 ++++++++++
>>> 10 files changed, 29 insertions(+), 70 deletions(-)
>>> delete mode 100644 target/arm/hvf-stub.c
>>> diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
>>> index 818b50419f..fa06e3b815 100644
>>> --- a/target/i386/hvf/hvf.c
>>> +++ b/target/i386/hvf/hvf.c
>>> @@ -225,6 +225,16 @@ int hvf_arch_init(void)
>>> return 0;
>>> }
>>> +uint32_t hvf_arch_get_default_ipa_bit_size(void)
>>> +{
>>> + return 48;
>>> +}
>>> +
>>> +uint32_t hvf_arch_get_max_ipa_bit_size(void)
>>> +{
>>> + return 48;
>> These don't make much sense on x86...
>
> They don't *not* make sense. x86 does have two-stage translation, though it has both 48-bit and 52-bit translation.
>
> While this is only invoked from hw/arm/virt.c at present, I can see that by piping the path through accel/hvf/ means that x86 needs to provide the symbols. Though perhaps they should just be g_assert_not_reached() stubs for now.
Random note that probably doesn’t change things: every Intel Mac has 48-bit, and extended addressing will never happen as macOS 26 is the last x86 macOS release.
The other option I think is just #ifdefing out if (mc->get_physical_address_range) in hvf_accel_init based on arch...
>
> r~
> On 5. Aug 2025, at 01:41, Mohamed Mediouni <mohamed@unpredictable.fr> wrote:
>
>
>
>> On 5. Aug 2025, at 01:13, Richard Henderson <richard.henderson@linaro.org> wrote:
>>
>> On 8/5/25 09:03, Philippe Mathieu-Daudé wrote:
>>> On 4/8/25 16:23, Mohamed Mediouni wrote:
>>>> Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
>>>> ---
>>>> accel/hvf/hvf-all.c | 7 +++++--
>>>> hw/arm/virt.c | 41 ++++----------------------------------
>>>> include/hw/boards.h | 4 ++--
>>>> include/system/hvf_int.h | 2 ++
>>>> target/arm/hvf-stub.c | 20 -------------------
>>>> target/arm/hvf/hvf.c | 6 +++---
>>>> target/arm/hvf_arm.h | 3 ---
>>>> target/arm/meson.build | 1 -
>>>> target/arm/whpx/whpx-all.c | 5 +++--
>>>> target/i386/hvf/hvf.c | 10 ++++++++++
>>>> 10 files changed, 29 insertions(+), 70 deletions(-)
>>>> delete mode 100644 target/arm/hvf-stub.c
>>>> diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c
>>>> index 818b50419f..fa06e3b815 100644
>>>> --- a/target/i386/hvf/hvf.c
>>>> +++ b/target/i386/hvf/hvf.c
>>>> @@ -225,6 +225,16 @@ int hvf_arch_init(void)
>>>> return 0;
>>>> }
>>>> +uint32_t hvf_arch_get_default_ipa_bit_size(void)
>>>> +{
>>>> + return 48;
>>>> +}
>>>> +
>>>> +uint32_t hvf_arch_get_max_ipa_bit_size(void)
>>>> +{
>>>> + return 48;
>>> These don't make much sense on x86...
>>
>> They don't *not* make sense. x86 does have two-stage translation, though it has both 48-bit and 52-bit translation.
>>
>> While this is only invoked from hw/arm/virt.c at present, I can see that by piping the path through accel/hvf/ means that x86 needs to provide the symbols. Though perhaps they should just be g_assert_not_reached() stubs for now.
> Random note that probably doesn’t change things: every Intel Mac has 48-bit, and extended addressing will never happen as macOS 26 is the last x86 macOS release.
>
> The other option I think is just #ifdefing out if (mc->get_physical_address_range) in hvf_accel_init based on arch…
Think that I’ll just go the g_assert_not_reached route...
On 8/4/25 7:23 AM, Mohamed Mediouni wrote: > Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr> > --- > accel/hvf/hvf-all.c | 7 +++++-- > hw/arm/virt.c | 41 ++++---------------------------------- > include/hw/boards.h | 4 ++-- > include/system/hvf_int.h | 2 ++ > target/arm/hvf-stub.c | 20 ------------------- > target/arm/hvf/hvf.c | 6 +++--- > target/arm/hvf_arm.h | 3 --- > target/arm/meson.build | 1 - > target/arm/whpx/whpx-all.c | 5 +++-- > target/i386/hvf/hvf.c | 10 ++++++++++ > 10 files changed, 29 insertions(+), 70 deletions(-) > delete mode 100644 target/arm/hvf-stub.c Good cleanup! Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
© 2016 - 2025 Red Hat, Inc.