|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 3/3] 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>
--- a/xen/arch/x86/hvm/viridian/viridian.c
+++ b/xen/arch/x86/hvm/viridian/viridian.c
@@ -628,10 +628,14 @@ static unsigned int hv_vpset_nr_banks(st
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 )
{
@@ -643,6 +647,18 @@ static int hv_vpset_to_vpmask(const stru
{
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;
@@ -774,31 +790,13 @@ static int hvcall_flush_ex(const union h
vpmask_fill(vpmask);
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;
}
@@ -895,8 +893,8 @@ static int hvcall_ipi_ex(const union hyp
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. */
@@ -917,27 +915,8 @@ static int hvcall_ipi_ex(const union hyp
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;
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |