> +static int tdx_accept_ram_range(uint64_t address, uint64_t 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;
> + }
> +
> + if (e->address > address ||
> + e->address + e->length < address + length) {
> + return -EINVAL;
> + }
if (e->type == TDX_RAM_ADDED)
return -EINVAL
> + if (e->address == address && e->length == length) {
> + e->type = TDX_RAM_ADDED;
> + } else if (e->address == address) {
> + e->address += length;
> + e->length -= length;
> + tdx_add_ram_entry(address, length, TDX_RAM_ADDED);
> + } else if (e->address + e->length == address + length) {
> + e->length -= length;
> + tdx_add_ram_entry(address, length, TDX_RAM_ADDED);
> + } else {
> + TdxRamEntry tmp = {
> + .address = e->address,
> + .length = e->length,
> + };
> + e->length = address - tmp.address;
> +
> + tdx_add_ram_entry(address, length, TDX_RAM_ADDED);
> + tdx_add_ram_entry(address + length,
> + tmp.address + tmp.length - (address + length),
> + TDX_RAM_UNACCEPTED);
> + }
I think all this can be simplified, by
(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.
take care,
Gerd