> 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);
>> 
> 
> 


Reply via email to