> On 25 May 2026, at 7:46 PM, Luigi Leonardi <[email protected]> wrote:
> 
> On Mon, May 25, 2026 at 07:37:55PM +0530, Ani Sinha wrote:
>> 
>> 
>>> On 25 May 2026, at 4:26 PM, Luigi Leonardi <[email protected]> wrote:
>>> 
>>> The IGVM spec defines bit 31 of the variable header type as an
>>> optional flag: if set, a loader that does not recognize the header
>>> type may safely skip it. If clear, the loader must reject the file.


This description is very confusing. Where is this text written? I can’t find it.

>>> 
>>> Currently, all the types with the optional bit set are not
>>> recognized as valid headers.
>>> 
>>> Implement optional header handling by masking bit 31 before matching
>>> against the handler table, and skip with a warning any unrecognized
>>> header that has the optional bit set.
>>> 
>>> Fixes: c1d466d267cf ("backends/igvm: Add IGVM loader and configuration")
>>> Signed-off-by: Luigi Leonardi <[email protected]>
>>> ---
>>> backends/igvm.c | 24 +++++++++++++++++++++---
>>> 1 file changed, 21 insertions(+), 3 deletions(-)
>>> 
>>> diff --git a/backends/igvm.c b/backends/igvm.c
>>> index c347d0c17e..408917f826 100644
>>> --- a/backends/igvm.c
>>> +++ b/backends/igvm.c
>>> @@ -26,6 +26,7 @@
>>> #include <igvm/igvm.h>
>>> #include <igvm/igvm_defs.h>
>>> 
>>> +#define IGVM_VHT_OPTIONAL_BIT (1U << 31)
>>> 
>>> /*
>>> * Some directives are specific to particular confidential computing 
>>> platforms.
>>> @@ -139,8 +140,16 @@ static int qigvm_handler(QIgvm *ctx, uint32_t type, 
>>> Error **errp)
>>>    const uint8_t *header_data;
>>>    int result;
>>> 
>>> +    /*
>>> +     * Bit 31 of the variable header type indicates that the header is
>>> +     * optional and can be safely ignored by a loader that does not
>>> +     * support it. If the bit is clear, the file cannot be loaded.
>>> +     * 
>>> https://docs.rs/igvm_defs/0.4.0/igvm_defs/struct.IgvmVariableHeaderType.html
>>> +     */
>>> +    IgvmVariableHeaderType base_type = type & ~IGVM_VHT_OPTIONAL_BIT;
>>> +
>>>    for (handler = 0; handler < G_N_ELEMENTS(handlers); handler++) {
>>> -        if (handlers[handler].type != type) {
>>> +        if (handlers[handler].type != base_type) {
>>>            continue;
>>>        }
>>>        header_handle = igvm_get_header(ctx->file, handlers[handler].section,
>>> @@ -166,6 +175,13 @@ static int qigvm_handler(QIgvm *ctx, uint32_t type, 
>>> Error **errp)
>>>        igvm_free_buffer(ctx->file, header_handle);
>>>        return result;
>>>    }
>>> +
>>> +    if (type & IGVM_VHT_OPTIONAL_BIT) {
>>> +        warn_report("IGVM: Skipping unsupported optional header type 0x%"
>>> +                    PRIX32, type);
>>> +        return 0;
>>> +    }
>>> +
>> 
>> I think this check should be at the top of the loop. If the bit is set, 
>> simply return with that warning message. No further processing is needed.
> 
> IIUC, in this way we would always skip optional parameter, right? My idea is 
> to
> always process optional parameters if we support it.

The spec says:

"The top bit of this type may be set to indicate a loader may safely ignore 
that structure.”

So if the bit is set, the way I understand it, there is no need for further 
processing.

> 
>> 
>> 
>>>    error_setg(errp,
>>>               "IGVM: Unknown header type encountered when processing file: "
>>>               "(type 0x%X)",
>>> @@ -787,7 +803,8 @@ static int qigvm_supported_platform_compat_mask(QIgvm 
>>> *ctx, Error **errp)
>>>         header_index++) {
>>>        IgvmVariableHeaderType typ = igvm_get_header_type(
>>>            ctx->file, IGVM_HEADER_SECTION_PLATFORM, header_index);
>>> -        if (typ == IGVM_VHT_SUPPORTED_PLATFORM) {
>>> +        IgvmVariableHeaderType base_type = typ & ~IGVM_VHT_OPTIONAL_BIT;
>>> +        if (base_type == IGVM_VHT_SUPPORTED_PLATFORM) {
>>>            header_handle = igvm_get_header(
>>>                ctx->file, IGVM_HEADER_SECTION_PLATFORM, header_index);
>>>            if (header_handle < 0) {
>>> @@ -947,7 +964,8 @@ int qigvm_process_file(IgvmCfg *cfg, MachineState 
>>> *machine_state,
>>>         ctx.current_header_index++) {
>>>        IgvmVariableHeaderType type = igvm_get_header_type(
>>>            ctx.file, IGVM_HEADER_SECTION_DIRECTIVE, 
>>> ctx.current_header_index);
>>> -        if (!onlyVpContext || (type == IGVM_VHT_VP_CONTEXT)) {
>>> +        IgvmVariableHeaderType base_type = type & ~IGVM_VHT_OPTIONAL_BIT;
>>> +        if (!onlyVpContext || base_type == IGVM_VHT_VP_CONTEXT) {
>>>            if (qigvm_handler(&ctx, type, errp) < 0) {
>>>                goto cleanup_parameters;
>>>            }
>>> 
>>> ---
>>> base-commit: cbf877d67a812be17a9ce404a589e1bdf722c1f6
>>> change-id: 20260525-igvm_optional-ca1592b613be
>>> 
>>> Best regards,
>>> --
>>> Luigi Leonardi <[email protected]>



Reply via email to