On Thu, May 26, 2022 at 03:33:10PM +0800, Xiaoyao Li <xiaoyao.li@xxxxxxxxx> 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 <isaku.yamahata@xxxxxxxxx>