Hi Bertrand, On Wed, Feb 25, 2026 at 11:02 AM Bertrand Marquis <[email protected]> wrote: > > Windowed GET_REGS retrieval needs to emit VM entries starting from an > arbitrary index, but ffa_get_vm_partinfo() always starts from index 0. > > Add a start_index parameter to ffa_get_vm_partinfo() and skip entries > until the local index reaches start_index. Update > ffa_handle_partition_info_get() to pass start_index=0 to preserve > existing behavior. > > No functional changes. > > Signed-off-by: Bertrand Marquis <[email protected]> > --- > xen/arch/arm/tee/ffa_partinfo.c | 61 +++++++++++++++++++-------------- > 1 file changed, 35 insertions(+), 26 deletions(-)
Looks good: Reviewed-by: Jens Wiklander <[email protected]> Cheers, Jens > > diff --git a/xen/arch/arm/tee/ffa_partinfo.c b/xen/arch/arm/tee/ffa_partinfo.c > index fdb03dae9a0c..6a6f3ffb822e 100644 > --- a/xen/arch/arm/tee/ffa_partinfo.c > +++ b/xen/arch/arm/tee/ffa_partinfo.c > @@ -167,14 +167,15 @@ out: > return ret; > } > > -static int32_t ffa_get_vm_partinfo(struct ffa_uuid uuid, uint32_t *vm_count, > - void **dst_buf, void *end_buf, > - uint32_t dst_size) > +static int32_t ffa_get_vm_partinfo(struct ffa_uuid uuid, uint32_t > start_index, > + uint32_t *vm_count, void **dst_buf, > + void *end_buf, uint32_t dst_size) > { > struct domain *d = current->domain; > struct ffa_ctx *curr_ctx = d->arch.tee; > struct ffa_ctx *dest_ctx; > uint32_t count = 0; > + uint32_t idx = 0; > int32_t ret = FFA_RET_OK; > /* > * We do not have UUID info for VMs so use the 1.0 structure so that we > set > @@ -202,17 +203,21 @@ static int32_t ffa_get_vm_partinfo(struct ffa_uuid > uuid, uint32_t *vm_count, > if ( ACCESS_ONCE(curr_ctx->guest_vers) >= FFA_VERSION_1_2 ) > { > /* Add caller VM information */ > - info.id = curr_ctx->ffa_id; > - info.execution_context = curr_ctx->num_vcpus; > - info.partition_properties = FFA_PART_VM_PROP; > - if ( is_64bit_domain(d) ) > - info.partition_properties |= FFA_PART_PROP_AARCH64_STATE; > - > - ret = ffa_copy_info(dst_buf, end_buf, &info, dst_size, sizeof(info)); > - if ( ret ) > - return ret; > + if ( start_index == 0) > + { > + info.id = curr_ctx->ffa_id; > + info.execution_context = curr_ctx->num_vcpus; > + info.partition_properties = FFA_PART_VM_PROP; > + if ( is_64bit_domain(d) ) > + info.partition_properties |= FFA_PART_PROP_AARCH64_STATE; > > - count++; > + ret = ffa_copy_info(dst_buf, end_buf, &info, dst_size, > + sizeof(info)); > + if ( ret ) > + return ret; > + count++; > + } > + idx++; > } > > if ( IS_ENABLED(CONFIG_FFA_VM_TO_VM) ) > @@ -231,21 +236,25 @@ static int32_t ffa_get_vm_partinfo(struct ffa_uuid > uuid, uint32_t *vm_count, > if ( dest_ctx == curr_ctx ) > continue; > > - info.id = dest_ctx->ffa_id; > - info.execution_context = dest_ctx->num_vcpus; > - info.partition_properties = FFA_PART_VM_PROP; > - if ( dest_ctx->is_64bit ) > - info.partition_properties |= FFA_PART_PROP_AARCH64_STATE; > - > - ret = ffa_copy_info(dst_buf, end_buf, &info, dst_size, > - sizeof(info)); > - if ( ret ) > + if ( idx >= start_index ) > { > - read_unlock(&ffa_ctx_list_rwlock); > - return ret; > + info.id = dest_ctx->ffa_id; > + info.execution_context = dest_ctx->num_vcpus; > + info.partition_properties = FFA_PART_VM_PROP; > + if ( dest_ctx->is_64bit ) > + info.partition_properties |= FFA_PART_PROP_AARCH64_STATE; > + > + ret = ffa_copy_info(dst_buf, end_buf, &info, dst_size, > + sizeof(info)); > + if ( ret ) > + { > + read_unlock(&ffa_ctx_list_rwlock); > + return ret; > + } > + count++; > } > > - count++; > + idx++; > } > read_unlock(&ffa_ctx_list_rwlock); > } > @@ -355,7 +364,7 @@ void ffa_handle_partition_info_get(struct cpu_user_regs > *regs) > goto out_rx_release; > } > > - ret = ffa_get_vm_partinfo(uuid, &ffa_vm_count, &dst_buf, end_buf, > + ret = ffa_get_vm_partinfo(uuid, 0, &ffa_vm_count, &dst_buf, end_buf, > dst_size); > > out_rx_release: > -- > 2.52.0 >
