[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86/Viridian: fold duplicate vpset retrieval code
commit 6a6ab829b6defb4165a65225fbbb9c1703845676 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Fri Dec 3 11:37:45 2021 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Fri Dec 3 11:37:45 2021 +0100 x86/Viridian: fold duplicate vpset retrieval code hvcall_{flush,ipi}_ex() use more almost identical code than what was isolated into hv_vpset_to_vpmask(). Move that code there as well, to have just one instance of it. This way all of HV_GENERIC_SET_SPARSE_4K processing now happens in a single place. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Paul Durrant <paul@xxxxxxx> --- xen/arch/x86/hvm/viridian/viridian.c | 73 +++++++++++++----------------------- 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/xen/arch/x86/hvm/viridian/viridian.c b/xen/arch/x86/hvm/viridian/viridian.c index 9e1363207f..8986b8e03c 100644 --- a/xen/arch/x86/hvm/viridian/viridian.c +++ b/xen/arch/x86/hvm/viridian/viridian.c @@ -621,10 +621,14 @@ static unsigned int hv_vpset_nr_banks(struct hv_vpset *vpset) return hweight64(vpset->valid_bank_mask); } -static int hv_vpset_to_vpmask(const struct hv_vpset *set, +static int hv_vpset_to_vpmask(const struct hv_vpset *in, paddr_t bank_gpa, struct hypercall_vpmask *vpmask) { #define NR_VPS_PER_BANK (HV_VPSET_BANK_SIZE * 8) + union hypercall_vpset *vpset = &this_cpu(hypercall_vpset); + struct hv_vpset *set = &vpset->set; + + *set = *in; switch ( set->format ) { @@ -636,6 +640,18 @@ static int hv_vpset_to_vpmask(const struct hv_vpset *set, { uint64_t bank_mask; unsigned int vp, bank = 0; + size_t size = sizeof(*set->bank_contents) * hv_vpset_nr_banks(set); + + if ( offsetof(typeof(*vpset), set.bank_contents[0]) + size > + sizeof(*vpset) ) + { + ASSERT_UNREACHABLE(); + return -EINVAL; + } + + if ( hvm_copy_from_guest_phys(&set->bank_contents, bank_gpa, + size) != HVMTRANS_okay ) + return -EINVAL; vpmask_empty(vpmask); for ( vp = 0, bank_mask = set->valid_bank_mask; @@ -760,31 +776,13 @@ static int hvcall_flush_ex(const union hypercall_input *input, vcpu_bitmap = NULL; else { - union hypercall_vpset *vpset = &this_cpu(hypercall_vpset); - struct hv_vpset *set = &vpset->set; - int rc; - - *set = input_params.set; - if ( set->format == HV_GENERIC_SET_SPARSE_4K ) - { - unsigned long offset = offsetof(typeof(input_params), + unsigned int bank_offset = offsetof(typeof(input_params), set.bank_contents); - size_t size = sizeof(*set->bank_contents) * hv_vpset_nr_banks(set); - - if ( offsetof(typeof(*vpset), set.bank_contents[0]) + size > - sizeof(*vpset) ) - { - ASSERT_UNREACHABLE(); - return -EINVAL; - } - - if ( hvm_copy_from_guest_phys(&set->bank_contents[0], - input_params_gpa + offset, - size) != HVMTRANS_okay) - return -EINVAL; - } + int rc; - rc = hv_vpset_to_vpmask(set, vpmask); + rc = hv_vpset_to_vpmask(&input_params.set, + input_params_gpa + bank_offset, + vpmask); if ( rc ) return rc; @@ -883,8 +881,8 @@ static int hvcall_ipi_ex(const union hypercall_input *input, uint8_t reserved_zero[3]; struct hv_vpset set; } input_params; - union hypercall_vpset *vpset = &this_cpu(hypercall_vpset); - struct hv_vpset *set = &vpset->set; + unsigned int bank_offset = offsetof(typeof(input_params), + set.bank_contents); int rc; /* These hypercalls should never use the fast-call convention. */ @@ -905,27 +903,8 @@ static int hvcall_ipi_ex(const union hypercall_input *input, if ( input_params.vector < 0x10 || input_params.vector > 0xff ) return -EINVAL; - *set = input_params.set; - if ( set->format == HV_GENERIC_SET_SPARSE_4K ) - { - unsigned long offset = offsetof(typeof(input_params), - set.bank_contents); - size_t size = sizeof(*set->bank_contents) * hv_vpset_nr_banks(set); - - if ( offsetof(typeof(*vpset), set.bank_contents[0]) + size > - sizeof(*vpset) ) - { - ASSERT_UNREACHABLE(); - return -EINVAL; - } - - if ( hvm_copy_from_guest_phys(&set->bank_contents, - input_params_gpa + offset, - size) != HVMTRANS_okay) - return -EINVAL; - } - - rc = hv_vpset_to_vpmask(set, vpmask); + rc = hv_vpset_to_vpmask(&input_params.set, input_params_gpa + bank_offset, + vpmask); if ( rc ) return rc; -- generated by git-patchbot for /home/xen/git/xen.git#master
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |