From: Paul Durrant <paul.durrant@citrix.com>
To: xen-devel@lists.xenproject.org
Cc: Wei Liu <wei.liu2@citrix.com>,
Paul Durrant <paul.durrant@citrix.com>,
Ian Jackson <ian.jackson@eu.citrix.com>,
Jan Beulich <jbeulich@suse.com>,
Andrew Cooper <andrew.cooper3@citrix.com>
Subject: [PATCH 8/8] viridian: introduce struct viridian_page
Date: Mon, 29 Oct 2018 18:02:11 +0000 [thread overview]
Message-ID: <20181029180211.2155-11-paul.durrant@citrix.com> (raw)
In-Reply-To: <20181029180211.2155-1-paul.durrant@citrix.com>
The 'vp_assist' page is currently an example of a guest page which needs to
be kept mapped throughout the life-time of a guest, but there are other
such examples in the specifiction [1]. This patch therefore introduces a
generic 'viridian_page' type and converts the current vp_assist/apic_assist
related code to use it. Subsequent patches implementing other enlightments
can then also make use of it.
This patch also renames the 'vp_assist_pending' field in struct
hvm_viridian_vcpu_context to 'apic_assist_pending' to more accurately
reflect its meaning. The term 'vp_assist' applies to the whole page rather
than just the EOI-avoidance enlightenment. New versons of the specification
have defined data structures for other enlightenments within the same page.
No functional change.
[1] https://github.com/MicrosoftDocs/Virtualization-Documentation/raw/live/tlfs/Hypervisor%20Top%20Level%20Functional%20Specification%20v5.0C.pdf
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Cc: Wei Liu <wei.liu2@citrix.com>
Cc: Jan Beulich <jbeulich@suse.com>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
---
tools/misc/xen-hvmctx.c | 4 +--
xen/arch/x86/hvm/viridian/synic.c | 47 ++++++++++++++++------------------
xen/include/asm-x86/hvm/viridian.h | 13 ++++++----
xen/include/public/arch-x86/hvm/save.h | 2 +-
4 files changed, 33 insertions(+), 33 deletions(-)
diff --git a/tools/misc/xen-hvmctx.c b/tools/misc/xen-hvmctx.c
index 40e77851be..a4efadf307 100644
--- a/tools/misc/xen-hvmctx.c
+++ b/tools/misc/xen-hvmctx.c
@@ -370,9 +370,9 @@ static void dump_viridian_vcpu(void)
{
HVM_SAVE_TYPE(VIRIDIAN_VCPU) p;
READ(p);
- printf(" VIRIDIAN_VCPU: vp_assist_msr 0x%llx, vp_assist_pending %s\n",
+ printf(" VIRIDIAN_VCPU: vp_assist_msr 0x%llx, apic_assist_pending %s\n",
(unsigned long long) p.vp_assist_msr,
- p.vp_assist_pending ? "true" : "false");
+ p.apic_assist_pending ? "true" : "false");
}
static void dump_vmce_vcpu(void)
diff --git a/xen/arch/x86/hvm/viridian/synic.c b/xen/arch/x86/hvm/viridian/synic.c
index 735c4c897c..f9aa8fd898 100644
--- a/xen/arch/x86/hvm/viridian/synic.c
+++ b/xen/arch/x86/hvm/viridian/synic.c
@@ -36,14 +36,13 @@ static void dump_vp_assist(const struct vcpu *v)
v, (unsigned long)va->fields.pfn);
}
-static void initialize_vp_assist(struct vcpu *v)
+static void initialize_guest_page(struct vcpu *v, struct viridian_page *vp)
{
struct domain *d = v->domain;
- unsigned long gmfn = v->arch.hvm.viridian.vp_assist.msr.fields.pfn;
+ unsigned long gmfn = vp->msr.fields.pfn;
struct page_info *page = get_page_from_gfn(d, gmfn, NULL, P2M_ALLOC);
- HV_VP_ASSIST_PAGE *ptr;
- ASSERT(!v->arch.hvm.viridian.vp_assist.ptr);
+ ASSERT(!vp->ptr);
if ( !page )
goto fail;
@@ -54,16 +53,14 @@ static void initialize_vp_assist(struct vcpu *v)
goto fail;
}
- ptr = __map_domain_page_global(page);
- if ( !ptr )
+ vp->ptr = __map_domain_page_global(page);
+ if ( !vp->ptr )
{
put_page_and_type(page);
goto fail;
}
- clear_page(ptr);
-
- v->arch.hvm.viridian.vp_assist.ptr = ptr;
+ clear_page(vp->ptr);
return;
fail:
@@ -71,19 +68,18 @@ static void initialize_vp_assist(struct vcpu *v)
gmfn, mfn_x(page ? page_to_mfn(page) : INVALID_MFN));
}
-static void teardown_vp_assist(struct vcpu *v)
+static void teardown_guest_page(struct viridian_page *vp)
{
- HV_VP_ASSIST_PAGE *ptr = v->arch.hvm.viridian.vp_assist.ptr;
struct page_info *page;
- if ( !ptr )
+ if ( !vp->ptr )
return;
- v->arch.hvm.viridian.vp_assist.ptr = NULL;
+ page = mfn_to_page(domain_page_map_to_mfn(vp->ptr));
- page = mfn_to_page(domain_page_map_to_mfn(ptr));
+ unmap_domain_page_global(vp->ptr);
+ vp->ptr = NULL;
- unmap_domain_page_global(ptr);
put_page_and_type(page);
}
@@ -99,10 +95,10 @@ void viridian_apic_assist_set(struct vcpu *v)
* wrong and the VM will most likely hang so force a crash now
* to make the problem clear.
*/
- if ( v->arch.hvm.viridian.vp_assist.pending )
+ if ( v->arch.hvm.viridian.apic_assist_pending )
domain_crash(v->domain);
- v->arch.hvm.viridian.vp_assist.pending = true;
+ v->arch.hvm.viridian.apic_assist_pending = true;
ptr->ApicAssist.no_eoi = 1;
}
@@ -113,11 +109,11 @@ bool viridian_apic_assist_completed(struct vcpu *v)
if ( !ptr )
return false;
- if ( v->arch.hvm.viridian.vp_assist.pending &&
+ if ( v->arch.hvm.viridian.apic_assist_pending &&
!ptr->ApicAssist.no_eoi )
{
/* An EOI has been avoided */
- v->arch.hvm.viridian.vp_assist.pending = false;
+ v->arch.hvm.viridian.apic_assist_pending = false;
return true;
}
@@ -132,7 +128,7 @@ void viridian_apic_assist_clear(struct vcpu *v)
return;
ptr->ApicAssist.no_eoi = 0;
- v->arch.hvm.viridian.vp_assist.pending = false;
+ v->arch.hvm.viridian.apic_assist_pending = false;
}
int viridian_synic_wrmsr(struct vcpu *v, uint32_t idx, uint64_t val)
@@ -158,11 +154,12 @@ int viridian_synic_wrmsr(struct vcpu *v, uint32_t idx, uint64_t val)
break;
case HV_X64_MSR_VP_ASSIST_PAGE:
- teardown_vp_assist(v); /* release any previous mapping */
+ /* release any previous mapping */
+ teardown_guest_page(&v->arch.hvm.viridian.vp_assist);
v->arch.hvm.viridian.vp_assist.msr.raw = val;
dump_vp_assist(v);
if ( v->arch.hvm.viridian.vp_assist.msr.fields.enabled )
- initialize_vp_assist(v);
+ initialize_guest_page(v, &v->arch.hvm.viridian.vp_assist);
break;
default:
@@ -211,7 +208,7 @@ int viridian_synic_rdmsr(const struct vcpu *v, uint32_t idx, uint64_t *val)
void viridian_synic_save_vcpu_ctxt(const struct vcpu *v,
struct hvm_viridian_vcpu_context *ctxt)
{
- ctxt->vp_assist_pending = v->arch.hvm.viridian.vp_assist.pending;
+ ctxt->apic_assist_pending = v->arch.hvm.viridian.apic_assist_pending;
ctxt->vp_assist_msr = v->arch.hvm.viridian.vp_assist.msr.raw;
}
@@ -220,9 +217,9 @@ void viridian_synic_load_vcpu_ctxt(struct vcpu *v,
{
v->arch.hvm.viridian.vp_assist.msr.raw = ctxt->vp_assist_msr;
if ( v->arch.hvm.viridian.vp_assist.msr.fields.enabled )
- initialize_vp_assist(v);
+ initialize_guest_page(v, &v->arch.hvm.viridian.vp_assist);
- v->arch.hvm.viridian.vp_assist.pending = !!ctxt->vp_assist_pending;
+ v->arch.hvm.viridian.apic_assist_pending = !!ctxt->apic_assist_pending;
}
/*
diff --git a/xen/include/asm-x86/hvm/viridian.h b/xen/include/asm-x86/hvm/viridian.h
index 66aa24c43e..8d5690582e 100644
--- a/xen/include/asm-x86/hvm/viridian.h
+++ b/xen/include/asm-x86/hvm/viridian.h
@@ -88,13 +88,16 @@ union viridian_page_msr
} fields;
};
+struct viridian_page
+{
+ union viridian_page_msr msr;
+ void *ptr;
+};
+
struct viridian_vcpu
{
- struct {
- union viridian_page_msr msr;
- void *ptr;
- bool pending;
- } vp_assist;
+ struct viridian_page vp_assist;
+ bool apic_assist_pending;
uint64_t crash_param[5];
};
diff --git a/xen/include/public/arch-x86/hvm/save.h b/xen/include/public/arch-x86/hvm/save.h
index 4691d4d4aa..80e762c335 100644
--- a/xen/include/public/arch-x86/hvm/save.h
+++ b/xen/include/public/arch-x86/hvm/save.h
@@ -600,7 +600,7 @@ DECLARE_HVM_SAVE_TYPE(VIRIDIAN_DOMAIN, 15, struct hvm_viridian_domain_context);
struct hvm_viridian_vcpu_context {
uint64_t vp_assist_msr;
- uint8_t vp_assist_pending;
+ uint8_t apic_assist_pending;
uint8_t _pad[7];
};
--
2.11.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2018-10-29 18:29 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-29 18:02 [PATCH 0/8] viridian cleanup Paul Durrant
2018-10-29 18:02 ` [PATCH 1/8] viridian: move the code into its own sub-directory Paul Durrant
2018-10-30 9:25 ` Jan Beulich
2018-10-31 10:17 ` Jan Beulich
2018-10-31 10:30 ` Paul Durrant
2018-10-29 18:02 ` [PATCH 1/2] x86/mm/p2m: don't needlessly limit MMIO mapping order to 4k Paul Durrant
2018-10-29 18:03 ` Paul Durrant
2018-10-29 18:02 ` [PATCH 2/2] iommu / p2m: add a page_order parameter to iommu_map/unmap_page() Paul Durrant
2018-10-29 18:03 ` Paul Durrant
2018-10-29 18:02 ` [PATCH 2/8] viridian: remove MSR perf counters Paul Durrant
2018-10-30 16:25 ` Roger Pau Monné
2018-10-29 18:02 ` [PATCH 3/8] viridian: remove comments referencing section number in the spec Paul Durrant
2018-10-30 16:34 ` Roger Pau Monné
2018-10-30 17:07 ` Paul Durrant
2018-10-29 18:02 ` [PATCH 4/8] viridian: remove duplicate union types Paul Durrant
2018-10-30 16:40 ` Roger Pau Monné
2018-10-30 17:03 ` Paul Durrant
2018-10-31 8:44 ` Roger Pau Monné
2018-10-29 18:02 ` [PATCH 5/8] viridian: separate interrupt related enlightenment implementations Paul Durrant
2018-10-30 16:52 ` Roger Pau Monné
2018-10-30 17:06 ` Paul Durrant
2018-10-29 18:02 ` [PATCH 6/8] viridian: separate time " Paul Durrant
2018-10-30 17:03 ` Roger Pau Monné
2018-10-30 17:08 ` Paul Durrant
2018-10-29 18:02 ` [PATCH 7/8] viridian: define type for the 'virtual VP assist page' Paul Durrant
2018-10-30 17:08 ` Roger Pau Monné
2018-10-30 17:11 ` Paul Durrant
2018-10-31 8:53 ` Roger Pau Monné
2018-10-31 9:27 ` Paul Durrant
2018-10-31 9:41 ` Jan Beulich
2018-10-31 10:01 ` Paul Durrant
2018-10-31 10:16 ` Jan Beulich
2018-10-29 18:02 ` Paul Durrant [this message]
2018-10-30 17:17 ` [PATCH 8/8] viridian: introduce struct viridian_page Roger Pau Monné
2018-10-30 17:25 ` Paul Durrant
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181029180211.2155-11-paul.durrant@citrix.com \
--to=paul.durrant@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).