|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 15/17] livepatch/x86/arm: Utilize the arch_livepatch_lookup_mfn
Without this patch on x86 we would get a DOUBLE FAULT
as the virt_to_mfn does not lookup virtual addresses
that are in vmap region. This means that the livepatch_vmap.funcs
would point to an incorrect MFN (with either garbage or all
zeros).
We only use the livepatch_vmap.funcs to save the old contents
of the instruction (f->opaque) so during patching all works fine.
But when we revert and copy the contents of f->opaque we would
either get the right values, or zeros (again, depending on where the
MFN is) - and then starting instructions in the unpatched function
would end up with 00000000 .. causing a double fault.
Using the arch_livepatch_lookup_mfn solves the problem and
the applying/reverting works on all platforms properly.
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
---
xen/common/livepatch.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/xen/common/livepatch.c b/xen/common/livepatch.c
index 2f5ee1ae75..2526d3a0ca 100644
--- a/xen/common/livepatch.c
+++ b/xen/common/livepatch.c
@@ -1073,7 +1073,10 @@ static int livepatch_quiesce(struct livepatch_func
*funcs, unsigned int nfuncs)
if ( livepatch_vmap.text || livepatch_vmap.funcs )
return -EINVAL;
- text_mfn = _mfn(virt_to_mfn(_start));
+ text_mfn = arch_livepatch_lookup_mfn((unsigned long)_start);
+ if ( mfn_eq(text_mfn, INVALID_MFN) )
+ return -EINVAL;
+
text_order = get_order_from_bytes(_end - _start);
/*
@@ -1093,7 +1096,14 @@ static int livepatch_quiesce(struct livepatch_func
*funcs, unsigned int nfuncs)
livepatch_vmap.text = vmap_addr;
livepatch_vmap.offset = offs;
- rodata_mfn = _mfn(virt_to_mfn(va & PAGE_MASK));
+ rodata_mfn = arch_livepatch_lookup_mfn(va & PAGE_MASK);
+ if ( mfn_eq(rodata_mfn, INVALID_MFN) )
+ {
+ vunmap(livepatch_vmap.text);
+ livepatch_vmap.text = NULL;
+ return -EINVAL;
+ }
+
vmap_addr = __vmap(&rodata_mfn, size, 1, 1, PAGE_HYPERVISOR,
VMAP_DEFAULT);
if ( !vmap_addr )
{
--
2.13.3
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |