|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC v2 11/12] xen/arm: Enable the compilation of mem_access and mem_event on ARM.
This patch sets up the infrastructure to support mem_access and mem_event
on ARM and turns on compilation. We define the required XSM functions.
Signed-off-by: Tamas K Lengyel <tklengyel@xxxxxxxxxxxxx>
---
v2: Add CONFIG_MEM_PAGING and CONFIG_MEM_SHARING definitions and
use them instead of CONFIG_X86.
Split domctl copy-back and p2m type definitions into separate
patches and move this patch to the end of the series.
Signed-off-by: Tamas K Lengyel <tklengyel@xxxxxxxxxxxxx>
---
xen/common/mem_access.c | 7 +++++-
xen/common/mem_event.c | 28 ++++++++++++++++++---
xen/include/asm-arm/config.h | 3 +++
xen/include/asm-x86/config.h | 3 +++
xen/include/xen/mem_access.h | 19 ---------------
xen/include/xen/mem_event.h | 58 ++++----------------------------------------
xen/include/xsm/dummy.h | 24 +++++++++---------
xen/include/xsm/xsm.h | 24 +++++++++---------
xen/xsm/dummy.c | 4 +--
9 files changed, 68 insertions(+), 102 deletions(-)
diff --git a/xen/common/mem_access.c b/xen/common/mem_access.c
index 2bb3171..421f150 100644
--- a/xen/common/mem_access.c
+++ b/xen/common/mem_access.c
@@ -36,6 +36,12 @@ static inline bool_t mem_access_sanity_check(struct domain
*d)
return 0;
return 1;
}
+#elif CONFIG_ARM
+static inline bool_t mem_access_sanity_check(struct domain *d)
+{
+ return 1;
+}
+#endif
int mem_access_memop(unsigned long cmd,
XEN_GUEST_HANDLE_PARAM(xen_mem_access_op_t) arg)
@@ -133,7 +139,6 @@ int mem_access_send_req(struct domain *d,
mem_event_request_t *req)
return 0;
}
-#endif /* CONFIG_X86 */
/*
* Local variables:
diff --git a/xen/common/mem_event.c b/xen/common/mem_event.c
index 8bf0cf1..1d8a281 100644
--- a/xen/common/mem_event.c
+++ b/xen/common/mem_event.c
@@ -20,16 +20,22 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#ifdef CONFIG_X86
-
+#include <xen/sched.h>
#include <asm/domain.h>
#include <xen/event.h>
#include <xen/wait.h>
#include <asm/p2m.h>
#include <xen/mem_event.h>
#include <xen/mem_access.h>
+
+#if CONFIG_MEM_PAGING==1
#include <asm/mem_paging.h>
+#endif
+
+#if CONFIG_MEM_SHARING==1
#include <asm/mem_sharing.h>
+#endif
+
#include <xsm/xsm.h>
/* for public/io/ring.h macros */
@@ -424,6 +430,7 @@ int __mem_event_claim_slot(struct domain *d, struct
mem_event_domain *med,
return mem_event_grab_slot(med, (current->domain != d));
}
+#ifdef CONFIG_X86
static inline bool_t mem_event_sanity_check(struct domain *d)
{
/* Only HAP is supported */
@@ -436,13 +443,21 @@ static inline bool_t mem_event_sanity_check(struct domain
*d)
return 1;
}
+#elif CONFIG_ARM
+static inline bool_t mem_event_sanity_check(struct domain *d)
+{
+ return 1;
+}
+#endif
+#if CONFIG_MEM_PAGING==1
/* Registered with Xen-bound event channel for incoming notifications. */
static void mem_paging_notification(struct vcpu *v, unsigned int port)
{
if ( likely(v->domain->mem_event->paging.ring_page != NULL) )
p2m_mem_paging_resume(v->domain);
}
+#endif
/* Registered with Xen-bound event channel for incoming notifications. */
static void mem_access_notification(struct vcpu *v, unsigned int port)
@@ -451,13 +466,16 @@ static void mem_access_notification(struct vcpu *v,
unsigned int port)
p2m_mem_access_resume(v->domain);
}
+#if CONFIG_MEM_SHARING==1
/* Registered with Xen-bound event channel for incoming notifications. */
static void mem_sharing_notification(struct vcpu *v, unsigned int port)
{
if ( likely(v->domain->mem_event->share.ring_page != NULL) )
mem_sharing_sharing_resume(v->domain);
}
+#endif
+#if CONFIG_MEM_PAGING==1 || CONFIG_MEM_SHARING==1
int do_mem_event_op(int op, uint32_t domain, void *arg)
{
int ret;
@@ -487,6 +505,7 @@ int do_mem_event_op(int op, uint32_t domain, void *arg)
rcu_unlock_domain(d);
return ret;
}
+#endif
/* Clean up on domain destruction */
void mem_event_cleanup(struct domain *d)
@@ -546,6 +565,7 @@ int mem_event_domctl(struct domain *d,
xen_domctl_mem_event_op_t *mec,
switch ( mec->mode )
{
+#if CONFIG_MEM_PAGING==1
case XEN_DOMCTL_MEM_EVENT_OP_PAGING:
{
struct mem_event_domain *med = &d->mem_event->paging;
@@ -597,6 +617,7 @@ int mem_event_domctl(struct domain *d,
xen_domctl_mem_event_op_t *mec,
}
}
break;
+#endif
case XEN_DOMCTL_MEM_EVENT_OP_ACCESS:
{
@@ -633,6 +654,7 @@ int mem_event_domctl(struct domain *d,
xen_domctl_mem_event_op_t *mec,
}
break;
+#if CONFIG_MEM_SHARING==1
case XEN_DOMCTL_MEM_EVENT_OP_SHARING:
{
struct mem_event_domain *med = &d->mem_event->share;
@@ -671,6 +693,7 @@ int mem_event_domctl(struct domain *d,
xen_domctl_mem_event_op_t *mec,
}
}
break;
+#endif
default:
rc = -ENOSYS;
@@ -710,7 +733,6 @@ void mem_event_vcpu_unpause(struct vcpu *v)
vcpu_unpause(v);
}
-#endif
/*
* Local variables:
diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h
index 1c3abcf..537727a 100644
--- a/xen/include/asm-arm/config.h
+++ b/xen/include/asm-arm/config.h
@@ -55,6 +55,9 @@
#define __LINUX_ARM_ARCH__ 7
#define CONFIG_AEABI
+#define CONFIG_MEM_SHARING 0
+#define CONFIG_MEM_PAGING 0
+
/* Linkage for ARM */
#define __ALIGN .align 2
#define __ALIGN_STR ".align 2"
diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h
index 210ff57..525ac44 100644
--- a/xen/include/asm-x86/config.h
+++ b/xen/include/asm-x86/config.h
@@ -57,6 +57,9 @@
#define CONFIG_LATE_HWDOM 1
#endif
+#define CONFIG_MEM_SHARING 1
+#define CONFIG_MEM_PAGING 1
+
#define HZ 100
#define OPT_CONSOLE_STR "vga"
diff --git a/xen/include/xen/mem_access.h b/xen/include/xen/mem_access.h
index c7dfc48..22e469f 100644
--- a/xen/include/xen/mem_access.h
+++ b/xen/include/xen/mem_access.h
@@ -23,29 +23,10 @@
#ifndef _XEN_ASM_MEM_ACCESS_H
#define _XEN_ASM_MEM_ACCESS_H
-#ifdef CONFIG_X86
-
int mem_access_memop(unsigned long cmd,
XEN_GUEST_HANDLE_PARAM(xen_mem_access_op_t) arg);
int mem_access_send_req(struct domain *d, mem_event_request_t *req);
-#else
-
-static inline
-int mem_access_memop(unsigned long cmd,
- XEN_GUEST_HANDLE_PARAM(xen_mem_access_op_t) arg)
-{
- return -ENOSYS;
-}
-
-static inline
-int mem_access_send_req(struct domain *d, mem_event_request_t *req)
-{
- return -ENOSYS;
-}
-
-#endif /* CONFIG_X86 */
-
#endif /* _XEN_ASM_MEM_ACCESS_H */
/*
diff --git a/xen/include/xen/mem_event.h b/xen/include/xen/mem_event.h
index 774909e..cb68463 100644
--- a/xen/include/xen/mem_event.h
+++ b/xen/include/xen/mem_event.h
@@ -24,8 +24,6 @@
#ifndef __MEM_EVENT_H__
#define __MEM_EVENT_H__
-#ifdef CONFIG_X86
-
/* Clean up on domain destruction */
void mem_event_cleanup(struct domain *d);
@@ -67,66 +65,20 @@ void mem_event_put_request(struct domain *d, struct
mem_event_domain *med,
int mem_event_get_response(struct domain *d, struct mem_event_domain *med,
mem_event_response_t *rsp);
+#if CONFIG_MEM_PAGING==1 || CONFIG_MEM_SHARING==1
int do_mem_event_op(int op, uint32_t domain, void *arg);
-int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec,
- XEN_GUEST_HANDLE_PARAM(void) u_domctl);
-
-void mem_event_vcpu_pause(struct vcpu *v);
-void mem_event_vcpu_unpause(struct vcpu *v);
-
#else
-
-static inline void mem_event_cleanup(struct domain *d) {}
-
-static inline bool_t mem_event_check_ring(struct mem_event_domain *med)
-{
- return 0;
-}
-
-static inline int mem_event_claim_slot(struct domain *d,
- struct mem_event_domain *med)
-{
- return -ENOSYS;
-}
-
-static inline int mem_event_claim_slot_nosleep(struct domain *d,
- struct mem_event_domain *med)
-{
- return -ENOSYS;
-}
-
-static inline
-void mem_event_cancel_slot(struct domain *d, struct mem_event_domain *med)
-{}
-
-static inline
-void mem_event_put_request(struct domain *d, struct mem_event_domain *med,
- mem_event_request_t *req)
-{}
-
-static inline
-int mem_event_get_response(struct domain *d, struct mem_event_domain *med,
- mem_event_response_t *rsp)
-{
- return -ENOSYS;
-}
-
static inline int do_mem_event_op(int op, uint32_t domain, void *arg)
{
return -ENOSYS;
}
+#endif
-static inline
int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec,
- XEN_GUEST_HANDLE_PARAM(void) u_domctl)
-{
- return -ENOSYS;
-}
-
-static inline void mem_event_vcpu_pause(struct vcpu *v) {}
-static inline void mem_event_vcpu_unpause(struct vcpu *v) {}
+ XEN_GUEST_HANDLE_PARAM(void) u_domctl);
-#endif /* CONFIG_X86 */
+void mem_event_vcpu_pause(struct vcpu *v);
+void mem_event_vcpu_unpause(struct vcpu *v);
#endif /* __MEM_EVENT_H__ */
diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h
index c5aa316..61677ea 100644
--- a/xen/include/xsm/dummy.h
+++ b/xen/include/xsm/dummy.h
@@ -507,6 +507,18 @@ static XSM_INLINE int xsm_hvm_param_nested(XSM_DEFAULT_ARG
struct domain *d)
return xsm_default_action(action, current->domain, d);
}
+static XSM_INLINE int xsm_mem_event_control(XSM_DEFAULT_ARG struct domain *d,
int mode, int op)
+{
+ XSM_ASSERT_ACTION(XSM_PRIV);
+ return xsm_default_action(action, current->domain, d);
+}
+
+static XSM_INLINE int xsm_mem_event_op(XSM_DEFAULT_ARG struct domain *d, int
op)
+{
+ XSM_ASSERT_ACTION(XSM_DM_PRIV);
+ return xsm_default_action(action, current->domain, d);
+}
+
#ifdef CONFIG_X86
static XSM_INLINE int xsm_do_mca(XSM_DEFAULT_VOID)
{
@@ -550,18 +562,6 @@ static XSM_INLINE int xsm_hvm_ioreq_server(XSM_DEFAULT_ARG
struct domain *d, int
return xsm_default_action(action, current->domain, d);
}
-static XSM_INLINE int xsm_mem_event_control(XSM_DEFAULT_ARG struct domain *d,
int mode, int op)
-{
- XSM_ASSERT_ACTION(XSM_PRIV);
- return xsm_default_action(action, current->domain, d);
-}
-
-static XSM_INLINE int xsm_mem_event_op(XSM_DEFAULT_ARG struct domain *d, int
op)
-{
- XSM_ASSERT_ACTION(XSM_DM_PRIV);
- return xsm_default_action(action, current->domain, d);
-}
-
static XSM_INLINE int xsm_mem_sharing_op(XSM_DEFAULT_ARG struct domain *d,
struct domain *cd, int op)
{
XSM_ASSERT_ACTION(XSM_DM_PRIV);
diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
index a85045d..0b77a4b 100644
--- a/xen/include/xsm/xsm.h
+++ b/xen/include/xsm/xsm.h
@@ -139,6 +139,8 @@ struct xsm_operations {
int (*hvm_param) (struct domain *d, unsigned long op);
int (*hvm_control) (struct domain *d, unsigned long op);
int (*hvm_param_nested) (struct domain *d);
+ int (*mem_event_control) (struct domain *d, int mode, int op);
+ int (*mem_event_op) (struct domain *d, int op);
#ifdef CONFIG_X86
int (*do_mca) (void);
@@ -148,8 +150,6 @@ struct xsm_operations {
int (*hvm_set_pci_link_route) (struct domain *d);
int (*hvm_inject_msi) (struct domain *d);
int (*hvm_ioreq_server) (struct domain *d, int op);
- int (*mem_event_control) (struct domain *d, int mode, int op);
- int (*mem_event_op) (struct domain *d, int op);
int (*mem_sharing_op) (struct domain *d, struct domain *cd, int op);
int (*apic) (struct domain *d, int cmd);
int (*memtype) (uint32_t access);
@@ -534,6 +534,16 @@ static inline int xsm_hvm_param_nested (xsm_default_t def,
struct domain *d)
return xsm_ops->hvm_param_nested(d);
}
+static inline int xsm_mem_event_control (xsm_default_t def, struct domain *d,
int mode, int op)
+{
+ return xsm_ops->mem_event_control(d, mode, op);
+}
+
+static inline int xsm_mem_event_op (xsm_default_t def, struct domain *d, int
op)
+{
+ return xsm_ops->mem_event_op(d, op);
+}
+
#ifdef CONFIG_X86
static inline int xsm_do_mca(xsm_default_t def)
{
@@ -570,16 +580,6 @@ static inline int xsm_hvm_ioreq_server (xsm_default_t def,
struct domain *d, int
return xsm_ops->hvm_ioreq_server(d, op);
}
-static inline int xsm_mem_event_control (xsm_default_t def, struct domain *d,
int mode, int op)
-{
- return xsm_ops->mem_event_control(d, mode, op);
-}
-
-static inline int xsm_mem_event_op (xsm_default_t def, struct domain *d, int
op)
-{
- return xsm_ops->mem_event_op(d, op);
-}
-
static inline int xsm_mem_sharing_op (xsm_default_t def, struct domain *d,
struct domain *cd, int op)
{
return xsm_ops->mem_sharing_op(d, cd, op);
diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
index c95c803..9df9d81 100644
--- a/xen/xsm/dummy.c
+++ b/xen/xsm/dummy.c
@@ -116,6 +116,8 @@ void xsm_fixup_ops (struct xsm_operations *ops)
set_to_dummy_if_null(ops, add_to_physmap);
set_to_dummy_if_null(ops, remove_from_physmap);
set_to_dummy_if_null(ops, map_gmfn_foreign);
+ set_to_dummy_if_null(ops, mem_event_control);
+ set_to_dummy_if_null(ops, mem_event_op);
#ifdef CONFIG_X86
set_to_dummy_if_null(ops, do_mca);
@@ -125,8 +127,6 @@ void xsm_fixup_ops (struct xsm_operations *ops)
set_to_dummy_if_null(ops, hvm_set_pci_link_route);
set_to_dummy_if_null(ops, hvm_inject_msi);
set_to_dummy_if_null(ops, hvm_ioreq_server);
- set_to_dummy_if_null(ops, mem_event_control);
- set_to_dummy_if_null(ops, mem_event_op);
set_to_dummy_if_null(ops, mem_sharing_op);
set_to_dummy_if_null(ops, apic);
set_to_dummy_if_null(ops, platform_op);
--
2.1.0.rc1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |