On Fri, Aug 18, 2023 at 05:50:15AM -0400, Xiaoyao Li wrote:
> The RAM of TDX VM can be classified into two types:
>
> - TDX_RAM_UNACCEPTED: default type of TDX memory, which needs to be
> accepted by TDX guest before it can be used and will be all-zeros
> after being accepted.
>
> - TDX_RAM_ADDED: the RAM that is ADD'ed to TD guest before running, and
> can be used directly. E.g., TD HOB and TEMP MEM that needed by TDVF.
>
> Maintain TdxRamEntries[] which grabs the initial RAM info from e820 table
> and mark each RAM range as default type TDX_RAM_UNACCEPTED.
>
> Then turn the range of TD HOB and TEMP MEM to TDX_RAM_ADDED since these
> ranges will be ADD'ed before TD runs and no need to be accepted runtime.
>
> The TdxRamEntries[] are later used to setup the memory TD resource HOB
> that passes memory info from QEMU to TDVF.
>
> Signed-off-by: Xiaoyao Li <[email protected]>
> Acked-by: Gerd Hoffmann <[email protected]>
>
> ---
> Changes from RFC v4:
> - simplify the algorithm of tdx_accept_ram_range() (Suggested-by: Gerd
> Hoffman)
> (1) Change the existing entry to cover the accepted ram range.
> (2) If there is room before the accepted ram range add a
> TDX_RAM_UNACCEPTED entry for that.
> (3) If there is room after the accepted ram range add a
> TDX_RAM_UNACCEPTED entry for that.
> ---
> target/i386/kvm/tdx.c | 110 ++++++++++++++++++++++++++++++++++++++++++
> target/i386/kvm/tdx.h | 14 ++++++
> 2 files changed, 124 insertions(+)
>
> diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
> index bb806736b4ff..ed617ebab266 100644
> --- a/target/i386/kvm/tdx.c
> +++ b/target/i386/kvm/tdx.c
> +static int tdx_accept_ram_range(uint64_t address, uint64_t length)
> +{
> + uint64_t head_start, tail_start, head_length, tail_length;
> + uint64_t tmp_address, tmp_length;
> + TdxRamEntry *e;
> + int i;
> +
> + for (i = 0; i < tdx_guest->nr_ram_entries; i++) {
> + e = &tdx_guest->ram_entries[i];
> +
> + if (address + length <= e->address ||
> + e->address + e->length <= address) {
> + continue;
Indented too far
> + }
> +
> + /*
> + * The to-be-accepted ram range must be fully contained by one
> + * RAM entry.
> + */
> + if (e->address > address ||
> + e->address + e->length < address + length) {
> + return -EINVAL;
> + }
> +
> + if (e->type == TDX_RAM_ADDED) {
> + return -EINVAL;
> + }
> +
> + break;
> + }
> +
> + if (i == tdx_guest->nr_ram_entries) {
> + return -1;
> + }
> +
> + tmp_address = e->address;
> + tmp_length = e->length;
> +
> + e->address = address;
> + e->length = length;
> + e->type = TDX_RAM_ADDED;
> +
> + head_length = address - tmp_address;
> + if (head_length > 0) {
> + head_start = tmp_address;
> + tdx_add_ram_entry(head_start, head_length, TDX_RAM_UNACCEPTED);
> + }
> +
> + tail_start = address + length;
> + if (tail_start < tmp_address + tmp_length) {
> + tail_length = tmp_address + tmp_length - tail_start;
> + tdx_add_ram_entry(tail_start, tail_length, TDX_RAM_UNACCEPTED);
> + }
> +
> + return 0;
> +}
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|