lkml.org 
[lkml]   [2024]   [Feb]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v19 003/130] x86/virt/tdx: Unbind global metadata read with 'struct tdx_tdmr_sysinfo'
    Date
    From: Kai Huang <kai.huang@intel.com>

    For now the kernel only reads TDMR related global metadata fields for
    module initialization, and the metadata read code only works with the
    'struct tdx_tdmr_sysinfo'.

    KVM will need to read a bunch of non-TDMR related metadata to create and
    run TDX guests. It's essential to provide a generic metadata read
    infrastructure which is not bound to any specific structure.

    To start providing such infrastructure, unbound the metadata read with
    the 'struct tdx_tdmr_sysinfo'.

    Signed-off-by: Kai Huang <kai.huang@intel.com>
    Reviewed-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    ---
    arch/x86/virt/vmx/tdx/tdx.c | 25 ++++++++++++++-----------
    1 file changed, 14 insertions(+), 11 deletions(-)

    diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
    index cdcb3332bc5d..eb208da4ff63 100644
    --- a/arch/x86/virt/vmx/tdx/tdx.c
    +++ b/arch/x86/virt/vmx/tdx/tdx.c
    @@ -273,9 +273,9 @@ static int read_sys_metadata_field(u64 field_id, u64 *data)

    static int read_sys_metadata_field16(u64 field_id,
    int offset,
    - struct tdx_tdmr_sysinfo *ts)
    + void *stbuf)
    {
    - u16 *ts_member = ((void *)ts) + offset;
    + u16 *st_member = stbuf + offset;
    u64 tmp;
    int ret;

    @@ -287,7 +287,7 @@ static int read_sys_metadata_field16(u64 field_id,
    if (ret)
    return ret;

    - *ts_member = tmp;
    + *st_member = tmp;

    return 0;
    }
    @@ -297,19 +297,22 @@ struct field_mapping {
    int offset;
    };

    -#define TD_SYSINFO_MAP(_field_id, _member) \
    - { .field_id = MD_FIELD_ID_##_field_id, \
    - .offset = offsetof(struct tdx_tdmr_sysinfo, _member) }
    +#define TD_SYSINFO_MAP(_field_id, _struct, _member) \
    + { .field_id = MD_FIELD_ID_##_field_id, \
    + .offset = offsetof(_struct, _member) }
    +
    +#define TD_SYSINFO_MAP_TDMR_INFO(_field_id, _member) \
    + TD_SYSINFO_MAP(_field_id, struct tdx_tdmr_sysinfo, _member)

    static int get_tdx_tdmr_sysinfo(struct tdx_tdmr_sysinfo *tdmr_sysinfo)
    {
    /* Map TD_SYSINFO fields into 'struct tdx_tdmr_sysinfo': */
    const struct field_mapping fields[] = {
    - TD_SYSINFO_MAP(MAX_TDMRS, max_tdmrs),
    - TD_SYSINFO_MAP(MAX_RESERVED_PER_TDMR, max_reserved_per_tdmr),
    - TD_SYSINFO_MAP(PAMT_4K_ENTRY_SIZE, pamt_entry_size[TDX_PS_4K]),
    - TD_SYSINFO_MAP(PAMT_2M_ENTRY_SIZE, pamt_entry_size[TDX_PS_2M]),
    - TD_SYSINFO_MAP(PAMT_1G_ENTRY_SIZE, pamt_entry_size[TDX_PS_1G]),
    + TD_SYSINFO_MAP_TDMR_INFO(MAX_TDMRS, max_tdmrs),
    + TD_SYSINFO_MAP_TDMR_INFO(MAX_RESERVED_PER_TDMR, max_reserved_per_tdmr),
    + TD_SYSINFO_MAP_TDMR_INFO(PAMT_4K_ENTRY_SIZE, pamt_entry_size[TDX_PS_4K]),
    + TD_SYSINFO_MAP_TDMR_INFO(PAMT_2M_ENTRY_SIZE, pamt_entry_size[TDX_PS_2M]),
    + TD_SYSINFO_MAP_TDMR_INFO(PAMT_1G_ENTRY_SIZE, pamt_entry_size[TDX_PS_1G]),
    };
    int ret;
    int i;
    --
    2.25.1

    \
     
     \ /
      Last update: 2024-05-27 15:21    [W:4.582 / U:0.432 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site