[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XEN PATCH v1 1/1] x86/domctl: add gva_to_gfn command
gva_to_gfn command used for fast address translation in LibVMI project. With such a command it is possible to perform address translation in single call instead of series of queries to get every page table. Thanks to Dmitry Isaykin for involvement. Signed-off-by: Sergey Kovalev <valor@xxxxxxx> --- Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: "Roger Pau Monné" <roger.pau@xxxxxxxxxx> Cc: Wei Liu <wl@xxxxxxx> Cc: George Dunlap <george.dunlap@xxxxxxxxxx> Cc: Julien Grall <julien@xxxxxxx> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx> Cc: Tamas K Lengyel <tamas@xxxxxxxxxxxxx> Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx --- --- xen/arch/x86/domctl.c | 17 +++++++++++++++++ xen/include/public/domctl.h | 13 +++++++++++++ 2 files changed, 30 insertions(+) diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index 2118fcad5d..0c9706ea0a 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -1364,6 +1364,23 @@ long arch_do_domctl( copyback = true; break; + case XEN_DOMCTL_gva_to_gfn: + { + uint64_t ga = domctl->u.gva_to_gfn.addr; + uint64_t cr3 = domctl->u.gva_to_gfn.cr3; + struct vcpu* v = d->vcpu[0]; + uint32_t pfec = PFEC_page_present; + unsigned int page_order; ++ uint64_t gfn = paging_ga_to_gfn_cr3(v, cr3, ga, &pfec, &page_order); + domctl->u.gva_to_gfn.addr = gfn; + domctl->u.gva_to_gfn.page_order = page_order; + if ( __copy_to_guest(u_domctl, domctl, 1) ) + ret = -EFAULT; + + break; + } + default: ret = -ENOSYS; break; diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 51be28c3de..628dfc68fd 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -948,6 +948,17 @@ struct xen_domctl_paging_mempool { uint64_aligned_t size; /* Size in bytes. */ }; +/* + * XEN_DOMCTL_gva_to_gfn. + * + * Get the guest virtual to guest physicall address translated. + */ +struct xen_domctl_gva_to_gfn { + uint64_aligned_t addr; + uint64_aligned_t cr3; + uint64_aligned_t page_order; +}; + #if defined(__i386__) || defined(__x86_64__) struct xen_domctl_vcpu_msr { uint32_t index; @@ -1278,6 +1289,7 @@ struct xen_domctl { #define XEN_DOMCTL_vmtrace_op 84 #define XEN_DOMCTL_get_paging_mempool_size 85 #define XEN_DOMCTL_set_paging_mempool_size 86 +#define XEN_DOMCTL_gva_to_gfn 87 #define XEN_DOMCTL_gdbsx_guestmemio 1000 #define XEN_DOMCTL_gdbsx_pausevcpu 1001 #define XEN_DOMCTL_gdbsx_unpausevcpu 1002 @@ -1340,6 +1352,7 @@ struct xen_domctl { struct xen_domctl_vuart_op vuart_op; struct xen_domctl_vmtrace_op vmtrace_op; struct xen_domctl_paging_mempool paging_mempool; + struct xen_domctl_gva_to_gfn gva_to_gfn; uint8_t pad[128]; } u; }; -- 2.38.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |