mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-08-05 05:17:07 +02:00
main/xen: upgrade to 4.10.1
This commit is contained in:
parent
895798a84e
commit
95c1be17ba
@ -2,8 +2,8 @@
|
||||
# Contributor: Roger Pau Monne <roger.pau@entel.upc.edu>
|
||||
# Maintainer: William Pitcock <nenolod@dereferenced.org>
|
||||
pkgname=xen
|
||||
pkgver=4.10.0
|
||||
pkgrel=3
|
||||
pkgver=4.10.1
|
||||
pkgrel=0
|
||||
pkgdesc="Xen hypervisor"
|
||||
url="http://www.xen.org/"
|
||||
arch="x86_64 armhf aarch64"
|
||||
@ -112,6 +112,9 @@ options="!strip"
|
||||
# - CVE-2018-7540 XSA-252
|
||||
# - CVE-2018-7541 XSA-255
|
||||
# - CVE-2018-7542 XSA-256
|
||||
# 4.10.1-r0:
|
||||
# - CVE-2018-10472 XSA-258
|
||||
# - CVE-2018-10471 XSA-259
|
||||
|
||||
case "$CARCH" in
|
||||
x86*)
|
||||
@ -159,13 +162,6 @@ source="https://downloads.xenproject.org/release/$pkgname/$pkgver/$pkgname-$pkgv
|
||||
http://xenbits.xen.org/xen-extfiles/zlib-$_ZLIB_VERSION.tar.gz
|
||||
http://xenbits.xen.org/xen-extfiles/ipxe-git-$_IPXE_GIT_TAG.tar.gz
|
||||
|
||||
xsa252.patch
|
||||
xsa253-4.10.patch
|
||||
xsa254-4.10.patch
|
||||
xsa255-1.patch
|
||||
xsa255-2.patch
|
||||
xsa256.patch
|
||||
|
||||
qemu-xen_paths.patch
|
||||
|
||||
hotplug-vif-vtrill.patch
|
||||
@ -416,7 +412,7 @@ EOF
|
||||
|
||||
}
|
||||
|
||||
sha512sums="5a37935c382f9cfe3641a35c3be0ba11689bca10c7d3c2401963513e3a834ee8d0c8a0ddcf3716dbf0a795aea1bab78caf19acf1272e5e054bf012cfa06a4690 xen-4.10.0.tar.gz
|
||||
sha512sums="236c02bee69e33644703ed26d323d4c491a91fc05bd0ee0990a7368579f7c82f5bb4510845bf80348fd923024d7d60d521f593dfd0365d971dc592f8ef10fbea xen-4.10.1.tar.gz
|
||||
2e0b0fd23e6f10742a5517981e5171c6e88b0a93c83da701b296f5c0861d72c19782daab589a7eac3f9032152a0fc7eff7f5362db8fccc4859564a9aa82329cf gmp-4.3.2.tar.bz2
|
||||
c2bc9ffc8583aeae71cee9ddcc4418969768d4e3764d47307da54f93981c0109fb07d84b061b3a3628bd00ba4d14a54742bc04848110eb3ae8ca25dbfbaabadb grub-0.97.tar.gz
|
||||
1465b58279af1647f909450e394fe002ca165f0ff4a0254bfa9fe0e64316f50facdde2729d79a4e632565b4500cf4d6c74192ac0dd3bc9fe09129bbd67ba089d lwip-1.3.0.tar.gz
|
||||
@ -426,12 +422,6 @@ c2bc9ffc8583aeae71cee9ddcc4418969768d4e3764d47307da54f93981c0109fb07d84b061b3a36
|
||||
4928b5b82f57645be9408362706ff2c4d9baa635b21b0d41b1c82930e8c60a759b1ea4fa74d7e6c7cae1b7692d006aa5cb72df0c3b88bf049779aa2b566f9d35 tpm_emulator-0.7.4.tar.gz
|
||||
021b958fcd0d346c4ba761bcf0cc40f3522de6186cf5a0a6ea34a70504ce9622b1c2626fce40675bc8282cf5f5ade18473656abc38050f72f5d6480507a2106e zlib-1.2.3.tar.gz
|
||||
bbcce5e55040e7e29adebd4a5253a046016a6e2e7ff34cf801a42d147e1ec1af57e0297318249bfa9c5bbeac969fe4b37c18cbf845a80b2136d65387a4fc31da ipxe-git-356f6c1b64d7a97746d1816cef8ca22bdd8d0b5d.tar.gz
|
||||
63fd6cee56ef04506efd6bf632998dc90514ff967e9435514a5ba8d2c5781735f986241344a479b6f44df9c6e6a278a165ba14834b0b3236064e24f71cd600f1 xsa252.patch
|
||||
58f288fb3087ecdd42075031b5604a493adef0754f68d596dce8576fbc46bfe8b1bf3dc429269cab3797b6f193036bdafeb32cf2c7cca34d9c89d5fe95a0453c xsa253-4.10.patch
|
||||
f15350c0b44d3a6d5a3056dfac81d25f2af047135c528f6258f3d42ef26e6d87511d8e148a63e8d7d88108e07dc5b3551ed54c915be6dc3fe3f978ab72094321 xsa254-4.10.patch
|
||||
d16ead93486beee767c3c80d11981d940dfce55d9aabfe7adee480d02f575a2df074bb83a1e62e455ac754f6d8f3fb83abe7139b93b94b77233c2918b46dc2e2 xsa255-1.patch
|
||||
2f0719fbbde261a51e1ec66eb677fb2b17c94e0631d583c0a99357b7c2dfb2c695b6970ebbe8e05f68154344af74fa31e8b47b0d25c778b3aef1b284101ae528 xsa255-2.patch
|
||||
3bd2697a8ad66197264af8a713bf97152ed414c4b11910cc986c6adaa85bd86b4d35319675799edccf04aaff9ae48a58ca5c438cb6b5b95f60fffbfeec5e4faf xsa256.patch
|
||||
1936ab39a1867957fa640eb81c4070214ca4856a2743ba7e49c0cd017917071a9680d015f002c57fa7b9600dbadd29dcea5887f50e6c133305df2669a7a933f3 qemu-xen_paths.patch
|
||||
f095ea373f36381491ad36f0662fb4f53665031973721256b23166e596318581da7cbb0146d0beb2446729adfdb321e01468e377793f6563a67d68b8b0f7ffe3 hotplug-vif-vtrill.patch
|
||||
77b08e9655e091b0352e4630d520b54c6ca6d659d1d38fbb4b3bfc9ff3e66db433a2e194ead32bb10ff962c382d800a670e82b7a62835b238e294b22808290ea musl-hvmloader-fix-stdint.patch
|
||||
|
@ -1,109 +0,0 @@
|
||||
From d4bc7833707351a5341a6bdf04c752a028d9560d Mon Sep 17 00:00:00 2001
|
||||
From: George Dunlap <george.dunlap@citrix.com>
|
||||
Date: Fri, 10 Nov 2017 16:53:55 +0000
|
||||
Subject: [PATCH 2/2] p2m: Check return value of p2m_set_entry() when
|
||||
decreasing reservation
|
||||
|
||||
If the entire range specified to p2m_pod_decrease_reservation() is marked
|
||||
populate-on-demand, then it will make a single p2m_set_entry() call,
|
||||
reducing its PoD entry count.
|
||||
|
||||
Unfortunately, in the right circumstances, this p2m_set_entry() call
|
||||
may fail. It that case, repeated calls to decrease_reservation() may
|
||||
cause p2m->pod.entry_count to fall below zero, potentially tripping
|
||||
over BUG_ON()s to the contrary.
|
||||
|
||||
Instead, check to see if the entry succeeded, and return false if not.
|
||||
The caller will then call guest_remove_page() on the gfns, which will
|
||||
return -EINVAL upon finding no valid memory there to return.
|
||||
|
||||
Unfortunately if the order > 0, the entry may have partially changed.
|
||||
A domain_crash() is probably the safest thing in that case.
|
||||
|
||||
Other p2m_set_entry() calls in the same function should be fine,
|
||||
because they are writing the entry at its current order. Nonetheless,
|
||||
check the return value and crash if our assumption turns otu to be
|
||||
wrong.
|
||||
|
||||
This is part of XSA-247.
|
||||
|
||||
Reported-by: XXX PERSON <XXX EMAIL>
|
||||
Signed-off-by: George Dunlap <george.dunlap@citrix.com>
|
||||
Reviewed-by: Jan Beulich <jbeulich@suse.com>
|
||||
---
|
||||
v2: Crash the domain if we're not sure it's safe (or if we think it
|
||||
can't happen)
|
||||
---
|
||||
xen/arch/x86/mm/p2m-pod.c | 42 +++++++++++++++++++++++++++++++++---------
|
||||
1 file changed, 33 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/xen/arch/x86/mm/p2m-pod.c b/xen/arch/x86/mm/p2m-pod.c
|
||||
index f2ed751892..473d6a6dbf 100644
|
||||
--- a/xen/arch/x86/mm/p2m-pod.c
|
||||
+++ b/xen/arch/x86/mm/p2m-pod.c
|
||||
@@ -555,11 +555,23 @@ p2m_pod_decrease_reservation(struct domain *d,
|
||||
|
||||
if ( !nonpod )
|
||||
{
|
||||
- /* All PoD: Mark the whole region invalid and tell caller
|
||||
- * we're done. */
|
||||
- p2m_set_entry(p2m, gpfn, INVALID_MFN, order, p2m_invalid,
|
||||
- p2m->default_access);
|
||||
- p2m->pod.entry_count-=(1<<order);
|
||||
+ /*
|
||||
+ * All PoD: Mark the whole region invalid and tell caller
|
||||
+ * we're done.
|
||||
+ */
|
||||
+ if ( p2m_set_entry(p2m, gpfn, INVALID_MFN, order, p2m_invalid,
|
||||
+ p2m->default_access) )
|
||||
+ {
|
||||
+ /*
|
||||
+ * If this fails, we can't tell how much of the range was changed.
|
||||
+ * Best to crash the domain unless we're sure a partial change is
|
||||
+ * impossible.
|
||||
+ */
|
||||
+ if ( order != 0 )
|
||||
+ domain_crash(d);
|
||||
+ goto out_unlock;
|
||||
+ }
|
||||
+ p2m->pod.entry_count -= 1UL << order;
|
||||
BUG_ON(p2m->pod.entry_count < 0);
|
||||
ret = 1;
|
||||
goto out_entry_check;
|
||||
@@ -600,8 +612,14 @@ p2m_pod_decrease_reservation(struct domain *d,
|
||||
n = 1UL << cur_order;
|
||||
if ( t == p2m_populate_on_demand )
|
||||
{
|
||||
- p2m_set_entry(p2m, gpfn + i, INVALID_MFN, cur_order,
|
||||
- p2m_invalid, p2m->default_access);
|
||||
+ /* This shouldn't be able to fail */
|
||||
+ if ( p2m_set_entry(p2m, gpfn + i, INVALID_MFN, cur_order,
|
||||
+ p2m_invalid, p2m->default_access) )
|
||||
+ {
|
||||
+ ASSERT_UNREACHABLE();
|
||||
+ domain_crash(d);
|
||||
+ goto out_unlock;
|
||||
+ }
|
||||
p2m->pod.entry_count -= n;
|
||||
BUG_ON(p2m->pod.entry_count < 0);
|
||||
pod -= n;
|
||||
@@ -622,8 +640,14 @@ p2m_pod_decrease_reservation(struct domain *d,
|
||||
|
||||
page = mfn_to_page(mfn);
|
||||
|
||||
- p2m_set_entry(p2m, gpfn + i, INVALID_MFN, cur_order,
|
||||
- p2m_invalid, p2m->default_access);
|
||||
+ /* This shouldn't be able to fail */
|
||||
+ if ( p2m_set_entry(p2m, gpfn + i, INVALID_MFN, cur_order,
|
||||
+ p2m_invalid, p2m->default_access) )
|
||||
+ {
|
||||
+ ASSERT_UNREACHABLE();
|
||||
+ domain_crash(d);
|
||||
+ goto out_unlock;
|
||||
+ }
|
||||
p2m_tlb_flush_sync(p2m);
|
||||
for ( j = 0; j < n; ++j )
|
||||
set_gpfn_from_mfn(mfn_x(mfn), INVALID_M2P_ENTRY);
|
||||
--
|
||||
2.15.0
|
||||
|
@ -1,27 +0,0 @@
|
||||
From: Jan Beulich <jbeulich@suse.com>
|
||||
Subject: memory: don't implicitly unpin for decrease-reservation
|
||||
|
||||
It very likely was a mistake (copy-and-paste from domain cleanup code)
|
||||
to implicitly unpin here: The caller should really unpin itself before
|
||||
(or after, if they so wish) requesting the page to be removed.
|
||||
|
||||
This is XSA-252.
|
||||
|
||||
Reported-by: Jann Horn <jannh@google.com>
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
|
||||
--- a/xen/common/memory.c
|
||||
+++ b/xen/common/memory.c
|
||||
@@ -357,11 +357,6 @@ int guest_remove_page(struct domain *d,
|
||||
|
||||
rc = guest_physmap_remove_page(d, _gfn(gmfn), mfn, 0);
|
||||
|
||||
-#ifdef _PGT_pinned
|
||||
- if ( !rc && test_and_clear_bit(_PGT_pinned, &page->u.inuse.type_info) )
|
||||
- put_page_and_type(page);
|
||||
-#endif
|
||||
-
|
||||
/*
|
||||
* With the lack of an IOMMU on some platforms, domains with DMA-capable
|
||||
* device must retrieve the same pfn when the hypercall populate_physmap
|
@ -1,26 +0,0 @@
|
||||
From: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
Subject: x86/msr: Free msr_vcpu_policy during vcpu destruction
|
||||
|
||||
c/s 4187f79dc7 "x86/msr: introduce struct msr_vcpu_policy" introduced a
|
||||
per-vcpu memory allocation, but failed to free it in the clean vcpu
|
||||
destruction case.
|
||||
|
||||
This is XSA-253
|
||||
|
||||
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
Reviewed-by: Jan Beulich <jbeulich@suse.com>
|
||||
|
||||
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
|
||||
index b17468c..0ae715d 100644
|
||||
--- a/xen/arch/x86/domain.c
|
||||
+++ b/xen/arch/x86/domain.c
|
||||
@@ -382,6 +382,9 @@ void vcpu_destroy(struct vcpu *v)
|
||||
|
||||
vcpu_destroy_fpu(v);
|
||||
|
||||
+ xfree(v->arch.msr);
|
||||
+ v->arch.msr = NULL;
|
||||
+
|
||||
if ( !is_idle_domain(v->domain) )
|
||||
vpmu_destroy(v);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,133 +0,0 @@
|
||||
From: Jan Beulich <jbeulich@suse.com>
|
||||
Subject: gnttab/ARM: don't corrupt shared GFN array
|
||||
|
||||
... by writing status GFNs to it. Introduce a second array instead.
|
||||
Also implement gnttab_status_gmfn() properly now that the information is
|
||||
suitably being tracked.
|
||||
|
||||
While touching it anyway, remove a misguided (but luckily benign) upper
|
||||
bound check from gnttab_shared_gmfn(): We should never access beyond the
|
||||
bounds of that array.
|
||||
|
||||
This is part of XSA-255.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
|
||||
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
---
|
||||
v3: Don't init the ARM GFN arrays to zero anymore, use INVALID_GFN.
|
||||
v2: New.
|
||||
|
||||
--- a/xen/common/grant_table.c
|
||||
+++ b/xen/common/grant_table.c
|
||||
@@ -3775,6 +3775,7 @@ int gnttab_map_frame(struct domain *d, u
|
||||
{
|
||||
int rc = 0;
|
||||
struct grant_table *gt = d->grant_table;
|
||||
+ bool status = false;
|
||||
|
||||
grant_write_lock(gt);
|
||||
|
||||
@@ -3785,6 +3786,7 @@ int gnttab_map_frame(struct domain *d, u
|
||||
(idx & XENMAPIDX_grant_table_status) )
|
||||
{
|
||||
idx &= ~XENMAPIDX_grant_table_status;
|
||||
+ status = true;
|
||||
if ( idx < nr_status_frames(gt) )
|
||||
*mfn = _mfn(virt_to_mfn(gt->status[idx]));
|
||||
else
|
||||
@@ -3802,7 +3804,7 @@ int gnttab_map_frame(struct domain *d, u
|
||||
}
|
||||
|
||||
if ( !rc )
|
||||
- gnttab_set_frame_gfn(gt, idx, gfn);
|
||||
+ gnttab_set_frame_gfn(gt, status, idx, gfn);
|
||||
|
||||
grant_write_unlock(gt);
|
||||
|
||||
--- a/xen/include/asm-arm/grant_table.h
|
||||
+++ b/xen/include/asm-arm/grant_table.h
|
||||
@@ -9,7 +9,8 @@
|
||||
#define INITIAL_NR_GRANT_FRAMES 1U
|
||||
|
||||
struct grant_table_arch {
|
||||
- gfn_t *gfn;
|
||||
+ gfn_t *shared_gfn;
|
||||
+ gfn_t *status_gfn;
|
||||
};
|
||||
|
||||
void gnttab_clear_flag(unsigned long nr, uint16_t *addr);
|
||||
@@ -21,7 +22,6 @@ int replace_grant_host_mapping(unsigned
|
||||
unsigned long new_gpaddr, unsigned int flags);
|
||||
void gnttab_mark_dirty(struct domain *d, unsigned long l);
|
||||
#define gnttab_create_status_page(d, t, i) do {} while (0)
|
||||
-#define gnttab_status_gmfn(d, t, i) (0)
|
||||
#define gnttab_release_host_mappings(domain) 1
|
||||
static inline int replace_grant_supported(void)
|
||||
{
|
||||
@@ -42,19 +42,35 @@ static inline unsigned int gnttab_dom0_m
|
||||
|
||||
#define gnttab_init_arch(gt) \
|
||||
({ \
|
||||
- (gt)->arch.gfn = xzalloc_array(gfn_t, (gt)->max_grant_frames); \
|
||||
- ( (gt)->arch.gfn ? 0 : -ENOMEM ); \
|
||||
+ unsigned int ngf_ = (gt)->max_grant_frames; \
|
||||
+ unsigned int nsf_ = grant_to_status_frames(ngf_); \
|
||||
+ \
|
||||
+ (gt)->arch.shared_gfn = xmalloc_array(gfn_t, ngf_); \
|
||||
+ (gt)->arch.status_gfn = xmalloc_array(gfn_t, nsf_); \
|
||||
+ if ( (gt)->arch.shared_gfn && (gt)->arch.status_gfn ) \
|
||||
+ { \
|
||||
+ while ( ngf_-- ) \
|
||||
+ (gt)->arch.shared_gfn[ngf_] = INVALID_GFN; \
|
||||
+ while ( nsf_-- ) \
|
||||
+ (gt)->arch.status_gfn[nsf_] = INVALID_GFN; \
|
||||
+ } \
|
||||
+ else \
|
||||
+ gnttab_destroy_arch(gt); \
|
||||
+ (gt)->arch.shared_gfn ? 0 : -ENOMEM; \
|
||||
})
|
||||
|
||||
#define gnttab_destroy_arch(gt) \
|
||||
do { \
|
||||
- xfree((gt)->arch.gfn); \
|
||||
- (gt)->arch.gfn = NULL; \
|
||||
+ xfree((gt)->arch.shared_gfn); \
|
||||
+ (gt)->arch.shared_gfn = NULL; \
|
||||
+ xfree((gt)->arch.status_gfn); \
|
||||
+ (gt)->arch.status_gfn = NULL; \
|
||||
} while ( 0 )
|
||||
|
||||
-#define gnttab_set_frame_gfn(gt, idx, gfn) \
|
||||
+#define gnttab_set_frame_gfn(gt, st, idx, gfn) \
|
||||
do { \
|
||||
- (gt)->arch.gfn[idx] = gfn; \
|
||||
+ ((st) ? (gt)->arch.status_gfn : (gt)->arch.shared_gfn)[idx] = \
|
||||
+ (gfn); \
|
||||
} while ( 0 )
|
||||
|
||||
#define gnttab_create_shared_page(d, t, i) \
|
||||
@@ -65,8 +81,10 @@ static inline unsigned int gnttab_dom0_m
|
||||
} while ( 0 )
|
||||
|
||||
#define gnttab_shared_gmfn(d, t, i) \
|
||||
- ( ((i >= nr_grant_frames(t)) && \
|
||||
- (i < (t)->max_grant_frames))? 0 : gfn_x((t)->arch.gfn[i]))
|
||||
+ gfn_x(((i) >= nr_grant_frames(t)) ? INVALID_GFN : (t)->arch.shared_gfn[i])
|
||||
+
|
||||
+#define gnttab_status_gmfn(d, t, i) \
|
||||
+ gfn_x(((i) >= nr_status_frames(t)) ? INVALID_GFN : (t)->arch.status_gfn[i])
|
||||
|
||||
#define gnttab_need_iommu_mapping(d) \
|
||||
(is_domain_direct_mapped(d) && need_iommu(d))
|
||||
--- a/xen/include/asm-x86/grant_table.h
|
||||
+++ b/xen/include/asm-x86/grant_table.h
|
||||
@@ -46,7 +46,7 @@ static inline unsigned int gnttab_dom0_m
|
||||
|
||||
#define gnttab_init_arch(gt) 0
|
||||
#define gnttab_destroy_arch(gt) do {} while ( 0 )
|
||||
-#define gnttab_set_frame_gfn(gt, idx, gfn) do {} while ( 0 )
|
||||
+#define gnttab_set_frame_gfn(gt, st, idx, gfn) do {} while ( 0 )
|
||||
|
||||
#define gnttab_create_shared_page(d, t, i) \
|
||||
do { \
|
@ -1,167 +0,0 @@
|
||||
From: Jan Beulich <jbeulich@suse.com>
|
||||
Subject: gnttab: don't blindly free status pages upon version change
|
||||
|
||||
There may still be active mappings, which would trigger the respective
|
||||
BUG_ON(). Split the loop into one dealing with the page attributes and
|
||||
the second (when the first fully passed) freeing the pages. Return an
|
||||
error if any pages still have pending references.
|
||||
|
||||
This is part of XSA-255.
|
||||
|
||||
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||||
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
|
||||
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
---
|
||||
v4: Add gprintk(XENLOG_ERR, ...) to domain_crash() invocations.
|
||||
v3: Call guest_physmap_remove_page() from gnttab_map_frame(), making the
|
||||
code unconditional at the same time. Re-base over changes to first
|
||||
patch.
|
||||
v2: Also deal with translated guests.
|
||||
|
||||
--- a/xen/common/grant_table.c
|
||||
+++ b/xen/common/grant_table.c
|
||||
@@ -1636,23 +1636,74 @@ status_alloc_failed:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
-static void
|
||||
+static int
|
||||
gnttab_unpopulate_status_frames(struct domain *d, struct grant_table *gt)
|
||||
{
|
||||
- int i;
|
||||
+ unsigned int i;
|
||||
|
||||
for ( i = 0; i < nr_status_frames(gt); i++ )
|
||||
{
|
||||
struct page_info *pg = virt_to_page(gt->status[i]);
|
||||
+ gfn_t gfn = gnttab_get_frame_gfn(gt, true, i);
|
||||
+
|
||||
+ /*
|
||||
+ * For translated domains, recovering from failure after partial
|
||||
+ * changes were made is more complicated than it seems worth
|
||||
+ * implementing at this time. Hence respective error paths below
|
||||
+ * crash the domain in such a case.
|
||||
+ */
|
||||
+ if ( paging_mode_translate(d) )
|
||||
+ {
|
||||
+ int rc = gfn_eq(gfn, INVALID_GFN)
|
||||
+ ? 0
|
||||
+ : guest_physmap_remove_page(d, gfn,
|
||||
+ _mfn(page_to_mfn(pg)), 0);
|
||||
+
|
||||
+ if ( rc )
|
||||
+ {
|
||||
+ gprintk(XENLOG_ERR,
|
||||
+ "Could not remove status frame %u (GFN %#lx) from P2M\n",
|
||||
+ i, gfn_x(gfn));
|
||||
+ domain_crash(d);
|
||||
+ return rc;
|
||||
+ }
|
||||
+ gnttab_set_frame_gfn(gt, true, i, INVALID_GFN);
|
||||
+ }
|
||||
|
||||
BUG_ON(page_get_owner(pg) != d);
|
||||
if ( test_and_clear_bit(_PGC_allocated, &pg->count_info) )
|
||||
put_page(pg);
|
||||
- BUG_ON(pg->count_info & ~PGC_xen_heap);
|
||||
+
|
||||
+ if ( pg->count_info & ~PGC_xen_heap )
|
||||
+ {
|
||||
+ if ( paging_mode_translate(d) )
|
||||
+ {
|
||||
+ gprintk(XENLOG_ERR,
|
||||
+ "Wrong page state %#lx of status frame %u (GFN %#lx)\n",
|
||||
+ pg->count_info, i, gfn_x(gfn));
|
||||
+ domain_crash(d);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if ( get_page(pg, d) )
|
||||
+ set_bit(_PGC_allocated, &pg->count_info);
|
||||
+ while ( i-- )
|
||||
+ gnttab_create_status_page(d, gt, i);
|
||||
+ }
|
||||
+ return -EBUSY;
|
||||
+ }
|
||||
+
|
||||
+ page_set_owner(pg, NULL);
|
||||
+ }
|
||||
+
|
||||
+ for ( i = 0; i < nr_status_frames(gt); i++ )
|
||||
+ {
|
||||
free_xenheap_page(gt->status[i]);
|
||||
gt->status[i] = NULL;
|
||||
}
|
||||
gt->nr_status_frames = 0;
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2962,8 +3013,9 @@ gnttab_set_version(XEN_GUEST_HANDLE_PARA
|
||||
break;
|
||||
}
|
||||
|
||||
- if ( op.version < 2 && gt->gt_version == 2 )
|
||||
- gnttab_unpopulate_status_frames(currd, gt);
|
||||
+ if ( op.version < 2 && gt->gt_version == 2 &&
|
||||
+ (res = gnttab_unpopulate_status_frames(currd, gt)) != 0 )
|
||||
+ goto out_unlock;
|
||||
|
||||
/* Make sure there's no crud left over from the old version. */
|
||||
for ( i = 0; i < nr_grant_frames(gt); i++ )
|
||||
@@ -3803,6 +3855,11 @@ int gnttab_map_frame(struct domain *d, u
|
||||
rc = -EINVAL;
|
||||
}
|
||||
|
||||
+ if ( !rc && paging_mode_translate(d) &&
|
||||
+ !gfn_eq(gnttab_get_frame_gfn(gt, status, idx), INVALID_GFN) )
|
||||
+ rc = guest_physmap_remove_page(d, gnttab_get_frame_gfn(gt, status, idx),
|
||||
+ *mfn, 0);
|
||||
+
|
||||
if ( !rc )
|
||||
gnttab_set_frame_gfn(gt, status, idx, gfn);
|
||||
|
||||
--- a/xen/include/asm-arm/grant_table.h
|
||||
+++ b/xen/include/asm-arm/grant_table.h
|
||||
@@ -73,6 +73,11 @@ static inline unsigned int gnttab_dom0_m
|
||||
(gfn); \
|
||||
} while ( 0 )
|
||||
|
||||
+#define gnttab_get_frame_gfn(gt, st, idx) ({ \
|
||||
+ _gfn((st) ? gnttab_status_gmfn(NULL, gt, idx) \
|
||||
+ : gnttab_shared_gmfn(NULL, gt, idx)); \
|
||||
+})
|
||||
+
|
||||
#define gnttab_create_shared_page(d, t, i) \
|
||||
do { \
|
||||
share_xen_page_with_guest( \
|
||||
--- a/xen/include/asm-x86/grant_table.h
|
||||
+++ b/xen/include/asm-x86/grant_table.h
|
||||
@@ -47,6 +47,12 @@ static inline unsigned int gnttab_dom0_m
|
||||
#define gnttab_init_arch(gt) 0
|
||||
#define gnttab_destroy_arch(gt) do {} while ( 0 )
|
||||
#define gnttab_set_frame_gfn(gt, st, idx, gfn) do {} while ( 0 )
|
||||
+#define gnttab_get_frame_gfn(gt, st, idx) ({ \
|
||||
+ unsigned long mfn_ = (st) ? gnttab_status_mfn(gt, idx) \
|
||||
+ : gnttab_shared_mfn(gt, idx); \
|
||||
+ unsigned long gpfn_ = get_gpfn_from_mfn(mfn_); \
|
||||
+ VALID_M2P(gpfn_) ? _gfn(gpfn_) : INVALID_GFN; \
|
||||
+})
|
||||
|
||||
#define gnttab_create_shared_page(d, t, i) \
|
||||
do { \
|
||||
@@ -63,11 +69,11 @@ static inline unsigned int gnttab_dom0_m
|
||||
} while ( 0 )
|
||||
|
||||
|
||||
-#define gnttab_shared_mfn(d, t, i) \
|
||||
+#define gnttab_shared_mfn(t, i) \
|
||||
((virt_to_maddr((t)->shared_raw[i]) >> PAGE_SHIFT))
|
||||
|
||||
#define gnttab_shared_gmfn(d, t, i) \
|
||||
- (mfn_to_gmfn(d, gnttab_shared_mfn(d, t, i)))
|
||||
+ (mfn_to_gmfn(d, gnttab_shared_mfn(t, i)))
|
||||
|
||||
|
||||
#define gnttab_status_mfn(t, i) \
|
@ -1,40 +0,0 @@
|
||||
From: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
Subject: x86/hvm: Disallow the creation of HVM domains without Local APIC emulation
|
||||
|
||||
There are multiple problems, not necesserily limited to:
|
||||
|
||||
* Guests which configure event channels via hvmop_set_evtchn_upcall_vector(),
|
||||
or which hit %cr8 emulation will cause Xen to fall over a NULL vlapic->regs
|
||||
pointer.
|
||||
|
||||
* On Intel hardware, disabling the TPR_SHADOW execution control without
|
||||
reenabling CR8_{LOAD,STORE} interception means that the guests %cr8
|
||||
accesses interact with the real TPR. Amongst other things, setting the
|
||||
real TPR to 0xf blocks even IPIs from interrupting this CPU.
|
||||
|
||||
* On hardware which sets up the use of Interrupt Posting, including
|
||||
IOMMU-Posting, guests run without the appropriate non-root configuration,
|
||||
which at a minimum will result in dropped interrupts.
|
||||
|
||||
Whether no-LAPIC mode is of any use at all remains to be seen.
|
||||
|
||||
This is XSA-256.
|
||||
|
||||
Reported-by: Ian Jackson <ian.jackson@eu.citrix.com>
|
||||
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
|
||||
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||||
Reviewed-by: Jan Beulich <jbeulich@suse.com>
|
||||
|
||||
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
|
||||
index f93327b..f65fc12 100644
|
||||
--- a/xen/arch/x86/domain.c
|
||||
+++ b/xen/arch/x86/domain.c
|
||||
@@ -413,7 +413,7 @@ static bool emulation_flags_ok(const struct domain *d, uint32_t emflags)
|
||||
if ( is_hardware_domain(d) &&
|
||||
emflags != (XEN_X86_EMU_LAPIC|XEN_X86_EMU_IOAPIC) )
|
||||
return false;
|
||||
- if ( !is_hardware_domain(d) && emflags &&
|
||||
+ if ( !is_hardware_domain(d) &&
|
||||
emflags != XEN_X86_EMU_ALL && emflags != XEN_X86_EMU_LAPIC )
|
||||
return false;
|
||||
}
|
Loading…
Reference in New Issue
Block a user