Hi,

On 5/21/25 4:49 PM, Alejandro Jimenez wrote:
> Caution: External email. Do not open attachments or click links, unless this 
> email comes from a known sender and you know the content is safe.
> 
> 
> Hi Ethan,
> 
> On 5/20/25 6:18 AM, Ethan MILON wrote:
>> Hi,
>>
>> On 5/2/25 4:15 AM, Alejandro Jimenez wrote:
> 
>>> Extracting the DTE from a given AMDVIAddressSpace pointer structure is a
>>> common operation required for syncing the shadow page tables. Implement a
>>> helper to do it and check for common error conditions.
>>>
> 
>>> +/*
>>> + * These 'fault' reasons have an overloaded meaning since they are not only
>>> + * intended for describing reasons that generate an IO_PAGE_FAULT as per 
>>> the AMD
>>> + * IOMMU specification, but are also used to signal internal errors in the
>>> + * emulation code.
>>> + */
>>> +typedef enum AMDVIFaultReason {
>>> +    AMDVI_FR_DTE_RTR_ERR = 1,   /* Failure to retrieve DTE */
>>> +    AMDVI_FR_DTE_V,             /* DTE[V] = 0 */
>>> +    AMDVI_FR_DTE_TV,            /* DTE[TV] = 0 */
>>> +} AMDVIFaultReason;
>>> +
> 
>>>
>>> +static int amdvi_as_to_dte(AMDVIAddressSpace *as, uint64_t *dte)
>>> +{
>>> +    uint16_t devid = PCI_BUILD_BDF(as->bus_num, as->devfn);
>>> +    AMDVIState *s = as->iommu_state;
>>> +
>>> +    if (!amdvi_get_dte(s, devid, dte)) {
>>> +        /* Unable to retrieve DTE for devid */
>>> +        return -AMDVI_FR_DTE_RTR_ERR;
>>> +    }
>>> +
>>> +    if (!(dte[0] & AMDVI_DEV_VALID)) {
>>> +        /* DTE[V] not set, address is passed untranslated for devid */
>>> +        return -AMDVI_FR_DTE_V;
>>> +    }
>>> +
>>> +    if (!(dte[0] & AMDVI_DEV_TRANSLATION_VALID)) {
>>> +        /* DTE[TV] not set, host page table not valid for devid */
>>> +        return -AMDVI_FR_DTE_TV;
>>> +    }
>>> +    return 0;
>>> +}
>>> +
>>
>> I'm not sure the new amdvi_as_to_dte() helper adds much. It just wraps a
>> few checks and makes it harder to report faults properly in the future.
> 
> I am afraid I don't understand this argument. How does it make it
> harder? It returns 0 on success, and a negative value in case of error,
> and the error type can be checked and handled as needed by the caller.
> 

You're right, I initially thought the amdvi_as_to_dte() helper might
make proper fault reporting harder, but on second look, it shouldn't be
a problem.

> The current implementation checks for 3 basic possible failures and maps
> them to errors:
> 
> AMDVI_FR_DTE_RTR_ERR --> This generally means something is very wrong
> 

For AMDVI_FR_DTE_RTR_ERR, would it make sense to be more specific? Right
now, it could mean either a hardware issue or a malformed DTE. Or should
it be split up in a future patch with proper fault reporting implemented?

> AMDVI_FR_DTE_V and/or AMDVI_FR_DTE_TV i.e. V=1, TV=1 --> This is a basic
> condition that multiple DTE fields require to be considered valid.
> 
> Every time we need to retrieve a DTE (for current and future features)
> we need to minimally check for those conditions.
> 
>> Is there a reason this couldn't be handled inline?
> 
> Discounting future uses, just by the end of the series you have 5
> different callers of this function, that is a lot of code duplication...
> 

Ah, my mistake, I didn’t notice all the callers.

Thank,
Ethan

> Thank you,
> Alejandro
> 
> 
> 
> 

Reply via email to