|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 2/4] x86: Introduce MSR_UNHANDLED
When toolstack updates MSR policy, this MSR offset (which is an invalid
MSR index) is used to indicate hypervisor behavior when a guest accesses
an MSR which is not explicitly emulated.
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
---
xen/include/xen/lib/x86/msr.h | 17 ++++++++++++++++-
xen/lib/x86/msr.c | 16 +++++++++-------
2 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/xen/include/xen/lib/x86/msr.h b/xen/include/xen/lib/x86/msr.h
index 48ba4a59c036..7911ae31eb48 100644
--- a/xen/include/xen/lib/x86/msr.h
+++ b/xen/include/xen/lib/x86/msr.h
@@ -2,8 +2,21 @@
#ifndef XEN_LIB_X86_MSR_H
#define XEN_LIB_X86_MSR_H
+/*
+ * Behavior on accesses to MSRs that are not handled by emulation:
+ * 0 = return #GP, warning emitted
+ * 1 = read as 0, writes are dropped, no warning
+ * 2 = read as 0, writes are dropped, warning emitted
+ */
+#define MSR_UNHANDLED_NEVER 0
+#define MSR_UNHANDLED_SILENT 1
+#define MSR_UNHANDLED_VERBOSE 2
+
+/* MSR that is not explicitly processed by emulation */
+#define MSR_UNHANDLED -1
+
/* Maximum number of MSRs written when serialising msr_policy. */
-#define MSR_MAX_SERIALISED_ENTRIES 2
+#define MSR_MAX_SERIALISED_ENTRIES 3
/* MSR policy object for shared per-domain MSRs */
struct msr_policy
@@ -45,6 +58,8 @@ struct msr_policy
bool taa_no:1;
};
} arch_caps;
+
+ uint8_t ignore_msrs;
};
#ifdef __XEN__
diff --git a/xen/lib/x86/msr.c b/xen/lib/x86/msr.c
index 7d71e92a380a..cf53768dfa4e 100644
--- a/xen/lib/x86/msr.c
+++ b/xen/lib/x86/msr.c
@@ -6,11 +6,11 @@
* Copy a single MSR into the provided msr_entry_buffer_t buffer, performing a
* boundary check against the buffer size.
*/
-static int copy_msr_to_buffer(uint32_t idx, uint64_t val,
+static int copy_msr_to_buffer(uint32_t idx, uint64_t val, uint32_t flags,
msr_entry_buffer_t msrs,
uint32_t *curr_entry, const uint32_t nr_entries)
{
- const xen_msr_entry_t ent = { .idx = idx, .val = val };
+ const xen_msr_entry_t ent = { .idx = idx, .val = val, .flags = flags };
if ( *curr_entry == nr_entries )
return -ENOBUFS;
@@ -29,17 +29,18 @@ int x86_msr_copy_to_buffer(const struct msr_policy *p,
const uint32_t nr_entries = *nr_entries_p;
uint32_t curr_entry = 0;
-#define COPY_MSR(idx, val) \
+#define COPY_MSR(idx, val, flags) \
({ \
int ret; \
\
if ( (ret = copy_msr_to_buffer( \
- idx, val, msrs, &curr_entry, nr_entries)) ) \
+ idx, val, flags, msrs, &curr_entry, nr_entries)) ) \
return ret; \
})
- COPY_MSR(MSR_INTEL_PLATFORM_INFO, p->platform_info.raw);
- COPY_MSR(MSR_ARCH_CAPABILITIES, p->arch_caps.raw);
+ COPY_MSR(MSR_INTEL_PLATFORM_INFO, p->platform_info.raw, 0);
+ COPY_MSR(MSR_ARCH_CAPABILITIES, p->arch_caps.raw, 0);
+ COPY_MSR(MSR_UNHANDLED, 0, p->ignore_msrs);
#undef COPY_MSR
@@ -77,7 +78,7 @@ int x86_msr_copy_from_buffer(struct msr_policy *p,
if ( copy_from_buffer_offset(&data, msrs, i, 1) )
return -EFAULT;
- if ( data.flags ) /* .flags MBZ */
+ if ( data.idx != MSR_UNHANDLED && data.flags )
{
rc = -EINVAL;
goto err;
@@ -101,6 +102,7 @@ int x86_msr_copy_from_buffer(struct msr_policy *p,
case MSR_INTEL_PLATFORM_INFO: ASSIGN(platform_info.raw); break;
case MSR_ARCH_CAPABILITIES: ASSIGN(arch_caps.raw); break;
+ case MSR_UNHANDLED: p->ignore_msrs = data.flags & 0xff;
break;
#undef ASSIGN
--
1.8.3.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |