|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86/pv: Clean up cr3 handling in arch_set_info_guest()
All of this code lives inside CONFIG_PV which means gfn == mfn, and the
fill_ro_mpt() calls clearly show that the value is used untranslated.
Change cr3_gfn to a suitably typed cr3_mfn, and replace get_page_from_gfn()
with a straight mfn_to_page/get_page sequence, to avoid the implication that
translation is going on.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Wei Liu <wei.liu2@xxxxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
CC: Julien Grall <julien.grall@xxxxxxx>
Julien: This should simplify your "xen: Switch parameter in get_page_from_gfn
to use typesafe gfn" patch. In particular, I did a doubletake at
fill_ro_mpt(_mfn(gfn_x(cr3_gfn))); when reviewing it.
---
xen/arch/x86/domain.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 32dc4253..da94ab4 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -827,8 +827,8 @@ int arch_set_info_guest(
unsigned long flags;
bool compat;
#ifdef CONFIG_PV
- unsigned long cr3_gfn;
- struct page_info *cr3_page;
+ mfn_t cr3_mfn;
+ struct page_info *cr3_page = NULL;
unsigned long cr4;
int rc = 0;
#endif
@@ -1091,12 +1091,12 @@ int arch_set_info_guest(
set_bit(_VPF_in_reset, &v->pause_flags);
if ( !compat )
- cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[3]);
+ cr3_mfn = _mfn(xen_cr3_to_pfn(c.nat->ctrlreg[3]));
else
- cr3_gfn = compat_cr3_to_pfn(c.cmp->ctrlreg[3]);
- cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC);
+ cr3_mfn = _mfn(compat_cr3_to_pfn(c.cmp->ctrlreg[3]));
- if ( !cr3_page )
+ if ( !mfn_valid(cr3_mfn) ||
+ !(cr3_page = mfn_to_page(cr3_mfn), get_page(cr3_page, d)) )
rc = -EINVAL;
else if ( paging_mode_refcounts(d) )
/* nothing */;
@@ -1122,7 +1122,7 @@ int arch_set_info_guest(
case 0:
if ( !compat && !VM_ASSIST(d, m2p_strict) &&
!paging_mode_refcounts(d) )
- fill_ro_mpt(_mfn(cr3_gfn));
+ fill_ro_mpt(cr3_mfn);
break;
default:
if ( cr3_page == current->arch.old_guest_table )
@@ -1137,10 +1137,10 @@ int arch_set_info_guest(
v->arch.guest_table = pagetable_from_page(cr3_page);
if ( c.nat->ctrlreg[1] )
{
- cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[1]);
- cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC);
+ cr3_mfn = _mfn(xen_cr3_to_pfn(c.nat->ctrlreg[1]));
- if ( !cr3_page )
+ if ( !mfn_valid(cr3_mfn) ||
+ !(cr3_page = mfn_to_page(cr3_mfn), get_page(cr3_page, d)) )
rc = -EINVAL;
else if ( !paging_mode_refcounts(d) )
{
@@ -1162,7 +1162,7 @@ int arch_set_info_guest(
break;
case 0:
if ( VM_ASSIST(d, m2p_strict) )
- zap_ro_mpt(_mfn(cr3_gfn));
+ zap_ro_mpt(cr3_mfn);
break;
}
}
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |