Hello Sergej,
On 16/08/16 23:16, Sergej Proskurin wrote:
This commit moves the altp2m-related code from x86 to ARM. Functions
s/moves/copies/
However, this is not really true because the code is current patch is
not a verbatim copy.
Lastly, what is the status to have x86 and ARM implementation of
do_altp2m_op merged?
It would allow us to get code clean-up more easily. I have in mind the
recent patch [1] from Paul Lai.
I am also worry to see the code diverging, for instance the locking is
likely needed on x86 too.
that are no yet supported notify the caller or print a BUG message
stating their absence.
Also, the struct arch_domain is extended with the altp2m_active
attribute, representing the current altp2m activity configuration of the
domain.
Signed-off-by: Sergej Proskurin <prosku...@sec.in.tum.de>
---
Cc: Stefano Stabellini <sstabell...@kernel.org>
Cc: Julien Grall <julien.gr...@arm.com>
---
v2: Removed altp2m command-line option: Guard through HVM_PARAM_ALTP2M.
Removed not used altp2m helper stubs in altp2m.h.
v3: Cosmetic fixes.
Added domain lock in "do_altp2m_op" to avoid concurrent execution of
altp2m-related HVMOPs.
Added check making sure that HVM_PARAM_ALTP2M is set before
execution of altp2m-related HVMOPs.
---
xen/arch/arm/hvm.c | 89 ++++++++++++++++++++++++++++++++++++++++++++
xen/include/asm-arm/altp2m.h | 4 +-
xen/include/asm-arm/domain.h | 3 ++
3 files changed, 94 insertions(+), 2 deletions(-)
diff --git a/xen/arch/arm/hvm.c b/xen/arch/arm/hvm.c
index d999bde..45d51c6 100644
--- a/xen/arch/arm/hvm.c
+++ b/xen/arch/arm/hvm.c
@@ -32,6 +32,91 @@
#include <asm/hypercall.h>
+#include <asm/altp2m.h>
+
+static int do_altp2m_op(XEN_GUEST_HANDLE_PARAM(void) arg)
+{
+ struct xen_hvm_altp2m_op a;
+ struct domain *d = NULL;
+ int rc = 0;
+
+ if ( copy_from_guest(&a, arg, 1) )
+ return -EFAULT;
+
+ if ( a.pad1 || a.pad2 ||
+ (a.version != HVMOP_ALTP2M_INTERFACE_VERSION) ||
+ (a.cmd < HVMOP_altp2m_get_domain_state) ||
+ (a.cmd > HVMOP_altp2m_change_gfn) )
+ return -EINVAL;
+
+ d = (a.cmd != HVMOP_altp2m_vcpu_enable_notify) ?
+ rcu_lock_domain_by_any_id(a.domain) : rcu_lock_current_domain();
+
+ if ( d == NULL )
+ return -ESRCH;
+
+ /* Prevent concurrent execution of the following HVMOPs. */
+ domain_lock(d);
So you are not allowing concurrent call of set_mem_access on different
altp2m. Is it something that you plan to fix in the future?
+
+ if ( (a.cmd != HVMOP_altp2m_get_domain_state) &&
+ (a.cmd != HVMOP_altp2m_set_domain_state) &&
+ !altp2m_active(d) )
+ {
+ rc = -EOPNOTSUPP;
+ goto out;
+ }
+
+ if ( !(d)->arch.hvm_domain.params[HVM_PARAM_ALTP2M] )
+ {
+ rc = -EINVAL;
+ goto out;
+ }
+
+ if ( (rc = xsm_hvm_altp2mhvm_op(XSM_TARGET, d)) )
+ goto out;
+
+ switch ( a.cmd )
+ {
+ case HVMOP_altp2m_get_domain_state:
+ rc = -EOPNOTSUPP;
+ break;
+
+ case HVMOP_altp2m_set_domain_state:
+ rc = -EOPNOTSUPP;
+ break;
+
+ case HVMOP_altp2m_vcpu_enable_notify:
+ rc = -EOPNOTSUPP;
+ break;
+
+ case HVMOP_altp2m_create_p2m:
+ rc = -EOPNOTSUPP;
+ break;
+
+ case HVMOP_altp2m_destroy_p2m:
+ rc = -EOPNOTSUPP;
+ break;
+
+ case HVMOP_altp2m_switch_p2m:
+ rc = -EOPNOTSUPP;
+ break;
+
+ case HVMOP_altp2m_set_mem_access:
+ rc = -EOPNOTSUPP;
+ break;
+
+ case HVMOP_altp2m_change_gfn:
+ rc = -EOPNOTSUPP;
+ break;
+ }
+
+out:
+ domain_unlock(d);
+ rcu_unlock_domain(d);
+
+ return rc;
+}
+
long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
{
long rc = 0;
@@ -80,6 +165,10 @@ long do_hvm_op(unsigned long op,
XEN_GUEST_HANDLE_PARAM(void) arg)
rc = -EINVAL;
break;
+ case HVMOP_altp2m:
+ rc = do_altp2m_op(arg);
+ break;
+
default:
{
gdprintk(XENLOG_DEBUG, "HVMOP op=%lu: not implemented\n", op);
diff --git a/xen/include/asm-arm/altp2m.h b/xen/include/asm-arm/altp2m.h
index a87747a..0711796 100644
--- a/xen/include/asm-arm/altp2m.h
+++ b/xen/include/asm-arm/altp2m.h
@@ -2,6 +2,7 @@
* Alternate p2m
*
* Copyright (c) 2014, Intel Corporation.
+ * Copyright (c) 2016, Sergej Proskurin <prosku...@sec.in.tum.de>.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
@@ -24,8 +25,7 @@
/* Alternate p2m on/off per domain */
static inline bool_t altp2m_active(const struct domain *d)
{
- /* Not implemented on ARM. */
- return 0;
+ return d->arch.altp2m_active;
}
/* Alternate p2m VCPU */
diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h
index 9452fcd..cc4bda0 100644
--- a/xen/include/asm-arm/domain.h
+++ b/xen/include/asm-arm/domain.h
@@ -126,6 +126,9 @@ struct arch_domain
paddr_t efi_acpi_gpa;
paddr_t efi_acpi_len;
#endif
+
+ /* altp2m: allow multiple copies of host p2m */
+ bool_t altp2m_active;
} __cacheline_aligned;
struct arch_vcpu
Regards,
[1]
https://lists.xenproject.org/archives/html/xen-devel/2016-08/msg02407.html
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel