> On 19. Dec 2025, at 19:46, Mohamed Mediouni <[email protected]> wrote:
>
> Hello,
>
>> On 19. Dec 2025, at 19:37, Joelle van Dyne <[email protected]> wrote:
>>
>> The IPA granule is the smallest page size hv_vm_map() support. For Venus, we
>> need to support 4KiB pages. macOS 26 introduces a public API for setting
>> the granule size. We can only use this when compiled with macOS 26 SDK and
>> run on macOS 26+. Otherwise, we fall back to an older, private, API which
>> achieves the same purpose.
>>
>
> Let’s have an HVF_NO_PRIVATE_API define (or the opposite) to have a single
> toggle to disable all private API use at build time
>
>> +
>> + /* older macOS need to use a private API */
>> + if (!set_ipa_granule) {
>> + set_ipa_granule = dlsym(RTLD_NEXT, "_hv_vm_config_set_ipa_granule");
>> + }
>> + if (set_ipa_granule) {
>> + return set_ipa_granule(config, ipa_granule_size);
>> + } else if (ipa_granule_size != page_size) {
>> + error_report("Failed to find _hv_vm_config_set_ipa_granule");
>> + return HV_UNSUPPORTED;
>> + }
>> +
>> + return HV_SUCCESS;
>> +}
>> +
>> +hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range,
>> + uint32_t ipa_granule_size)
>> {
>> hv_return_t ret;
>> hv_vm_config_t config = hv_vm_config_create();
>> @@ -891,6 +932,13 @@ hv_return_t hvf_arch_vm_create(MachineState *ms,
>> uint32_t pa_range)
>> }
>> chosen_ipa_bit_size = pa_range;
>>
> The PA range is actually different depending on the IPA granule size.
>
> An example from M4 Max:
>
> % sysctl -a | grep ipa
> kern.hv.ipa_size_16k: 4398046511104
> kern.hv.ipa_size_4k: 1099511627776
>
Looks like the Apple APIs will always return the smallest supported IPA space
size instead of the current one
so this is actually ok - but doesn’t provide access to the bigger IPA space the
hardware supports unless explicitly queried via sysctl…
Something else to add as private API use I guess...
>> + if (ipa_granule_size) {
>> + ret = hvf_set_ipa_granule(config, ipa_granule_size);
>> + if (ret != HV_SUCCESS) {
>> + goto cleanup;
>> + }
>> + }
>> +
>> ret = hv_vm_create(config);
>>
>
>