aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-12-17 06:27:55 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-12-17 06:27:55 +0000
commit35b1c10cb4210e14a579e3030d65bb08949ab709 (patch)
tree7351941b115cadf4fc55495dcd23843e51d8263b
parentb41ecc03e9d1527905dc955b14ada0e8c7171f52 (diff)
downloadxen-35b1c10cb4210e14a579e3030d65bb08949ab709.tar.gz
xen-35b1c10cb4210e14a579e3030d65bb08949ab709.tar.bz2
xen-35b1c10cb4210e14a579e3030d65bb08949ab709.zip
Memory paging domctl support, which is a sub-operation of the generic memory
event domctl support. Signed-off-by: Patrick Colp <Patrick.Colp@citrix.com>
-rw-r--r--xen/arch/x86/mm/Makefile1
-rw-r--r--xen/arch/x86/mm/mem_event.c6
-rw-r--r--xen/arch/x86/mm/mem_paging.c79
-rw-r--r--xen/include/asm-x86/mem_paging.h35
-rw-r--r--xen/include/public/domctl.h12
5 files changed, 133 insertions, 0 deletions
diff --git a/xen/arch/x86/mm/Makefile b/xen/arch/x86/mm/Makefile
index d4ffe37af5..c68cb8b0df 100644
--- a/xen/arch/x86/mm/Makefile
+++ b/xen/arch/x86/mm/Makefile
@@ -7,6 +7,7 @@ obj-y += guest_walk_2.o
obj-y += guest_walk_3.o
obj-$(x86_64) += guest_walk_4.o
obj-y += mem_event.o
+obj-y += mem_paging.o
guest_walk_%.o: guest_walk.c Makefile
$(CC) $(CFLAGS) -DGUEST_PAGING_LEVELS=$* -c $< -o $@
diff --git a/xen/arch/x86/mm/mem_event.c b/xen/arch/x86/mm/mem_event.c
index 5701bfee42..a89c7b9b50 100644
--- a/xen/arch/x86/mm/mem_event.c
+++ b/xen/arch/x86/mm/mem_event.c
@@ -24,6 +24,7 @@
#include <xen/event.h>
#include <asm/p2m.h>
#include <asm/mem_event.h>
+#include <asm/mem_paging.h>
#define xen_mb() mb()
@@ -274,8 +275,13 @@ int mem_event_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec,
}
}
else
+ {
rc = -ENOSYS;
+ if ( mec->mode & XEN_DOMCTL_MEM_EVENT_OP_PAGING )
+ rc = mem_paging_domctl(d, mec, u_domctl);
+ }
+
return rc;
}
diff --git a/xen/arch/x86/mm/mem_paging.c b/xen/arch/x86/mm/mem_paging.c
new file mode 100644
index 0000000000..6b41d674c3
--- /dev/null
+++ b/xen/arch/x86/mm/mem_paging.c
@@ -0,0 +1,79 @@
+/******************************************************************************
+ * arch/x86/mm/mem_paging.c
+ *
+ * Memory paging support.
+ *
+ * Copyright (c) 2009 Citrix (R)&D) Ltd. (Patrick Colp)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include <asm/p2m.h>
+#include <asm/mem_event.h>
+
+
+int mem_paging_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec,
+ XEN_GUEST_HANDLE(void) u_domctl)
+{
+ int rc;
+
+ switch( mec->op )
+ {
+ case XEN_DOMCTL_MEM_EVENT_OP_PAGING_NOMINATE:
+ {
+ unsigned long gfn = mec->gfn;
+ rc = p2m_mem_paging_nominate(d, gfn);
+ }
+ break;
+
+ case XEN_DOMCTL_MEM_EVENT_OP_PAGING_EVICT:
+ {
+ unsigned long gfn = mec->gfn;
+ rc = p2m_mem_paging_evict(d, gfn);
+ }
+ break;
+
+ case XEN_DOMCTL_MEM_EVENT_OP_PAGING_PREP:
+ {
+ unsigned long gfn = mec->gfn;
+ rc = p2m_mem_paging_prep(d, gfn);
+ }
+ break;
+
+ case XEN_DOMCTL_MEM_EVENT_OP_PAGING_RESUME:
+ {
+ p2m_mem_paging_resume(d);
+ rc = 0;
+ }
+ break;
+
+ default:
+ rc = -ENOSYS;
+ break;
+ }
+
+ return rc;
+}
+
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-x86/mem_paging.h b/xen/include/asm-x86/mem_paging.h
new file mode 100644
index 0000000000..d66f6e62b1
--- /dev/null
+++ b/xen/include/asm-x86/mem_paging.h
@@ -0,0 +1,35 @@
+/******************************************************************************
+ * include/asm-x86/mem_paging.h
+ *
+ * Memory paging support.
+ *
+ * Copyright (c) 2009 Citrix (R)&D) Ltd. (Patrick Colp)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+int mem_paging_domctl(struct domain *d, xen_domctl_mem_event_op_t *mec,
+ XEN_GUEST_HANDLE(void) u_domctl);
+
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
index 7a378a3519..a9faa876e2 100644
--- a/xen/include/public/domctl.h
+++ b/xen/include/public/domctl.h
@@ -140,6 +140,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_getmemlist_t);
#define XEN_DOMCTL_PFINFO_LTABTYPE_MASK (0x7U<<28)
#define XEN_DOMCTL_PFINFO_LPINTAB (0x1U<<31)
#define XEN_DOMCTL_PFINFO_XTAB (0xfU<<28) /* invalid page */
+#define XEN_DOMCTL_PFINFO_PAGEDTAB (0x8U<<28)
#define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU<<28)
struct xen_domctl_getpageframeinfo {
@@ -701,6 +702,17 @@ struct xen_domctl_gdbsx_domstatus {
#define XEN_DOMCTL_MEM_EVENT_OP_ENABLE 0
#define XEN_DOMCTL_MEM_EVENT_OP_DISABLE 1
+/*
+ * Page memory in and out.
+ */
+#define XEN_DOMCTL_MEM_EVENT_OP_PAGING (1 << 0)
+
+/* Domain memory paging */
+#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_NOMINATE 0
+#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_EVICT 1
+#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_PREP 2
+#define XEN_DOMCTL_MEM_EVENT_OP_PAGING_RESUME 3
+
struct xen_domctl_mem_event_op {
uint32_t op; /* XEN_DOMCTL_MEM_EVENT_OP_* */
uint32_t mode; /* XEN_DOMCTL_MEM_EVENT_ENABLE_* */