On Thu, May 26, 2022 at 03:33:10PM +0800,
Xiaoyao Li <[email protected]> wrote:
> On 5/24/2022 3:37 PM, Gerd Hoffmann wrote:
> > 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.
>
> I implement as below. Please help review.
>
> +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;
> + }
> +
> + /*
> + * The to-be-accepted ram range must be fully contained by one
> + * RAM entries
> + */
> + if (e->address > address ||
> + e->address + e->length < address + length) {
> + return -EINVAL;
> + }
> +
> + if (e->type == TDX_RAM_ADDED) {
> + return -EINVAL;
> + }
> +
> + 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 = e->address;
> + tdx_add_ram_entry(head_start, head_length, TDX_RAM_UNACCEPTED);
tdx_add_ram_entry() increments tdx_guest->nr_ram_entries. I think it's worth
for comments why this is safe regarding to this for-loop.
--
Isaku Yamahata <[email protected]>