diff options
author | dietmar.hahn@fujitsu-siemens.com <dietmar.hahn@fujitsu-siemens.com> | 2008-11-17 09:19:45 +0100 |
---|---|---|
committer | dietmar.hahn@fujitsu-siemens.com <dietmar.hahn@fujitsu-siemens.com> | 2008-11-17 09:19:45 +0100 |
commit | 377d0a03ff772beed2f234791814959bbaf4e244 (patch) | |
tree | 2321a5967701cfe1ed080b5cb601029a810252f8 /extras | |
parent | 3c93f6d34a3c0d2be6f5151563469575fc9b2ef8 (diff) | |
download | xen-377d0a03ff772beed2f234791814959bbaf4e244.tar.gz xen-377d0a03ff772beed2f234791814959bbaf4e244.tar.bz2 xen-377d0a03ff772beed2f234791814959bbaf4e244.zip |
[IA64] minios: Clean up the hypervisor interface
move all hypervisor calls to xencomm
Signed-off-by: Dietmar Hahn <dietmar.hahn@fujitsu-siemens.com>
Diffstat (limited to 'extras')
-rw-r--r-- | extras/mini-os/arch/ia64/xencomm.c | 125 | ||||
-rw-r--r-- | extras/mini-os/include/ia64/hypercall-ia64.h | 129 | ||||
-rw-r--r-- | extras/mini-os/include/ia64/os.h | 15 |
3 files changed, 139 insertions, 130 deletions
diff --git a/extras/mini-os/arch/ia64/xencomm.c b/extras/mini-os/arch/ia64/xencomm.c index 03d163cb94..9745b8f820 100644 --- a/extras/mini-os/arch/ia64/xencomm.c +++ b/extras/mini-os/arch/ia64/xencomm.c @@ -24,6 +24,8 @@ #include <os.h> +#include <mini-os/errno.h> +#include <mini-os/lib.h> #include <hypervisor.h> #include <xen/xencomm.h> #include <xen/grant_table.h> @@ -38,6 +40,7 @@ struct xencomm_mini #define xen_guest_handle(hnd) ((hnd).p) +struct xencomm_handle; /* Translate virtual address to physical address. */ uint64_t @@ -52,6 +55,16 @@ xencomm_vaddr_to_paddr(uint64_t vaddr) return 0; } +/* Inline version. To be used only on linear space (kernel space). */ +static struct xencomm_handle * +xencomm_create_inline(void *buffer) +{ + unsigned long paddr; + + paddr = xencomm_vaddr_to_paddr((unsigned long)buffer); + return (struct xencomm_handle *)(paddr | XENCOMM_INLINE_FLAG); +} + #define min(a,b) (((a) < (b)) ? (a) : (b)) static int xencomm_init_desc(struct xencomm_desc *desc, void *buffer, unsigned long bytes) @@ -201,6 +214,14 @@ xencommize_mini_grant_table_op(struct xencomm_mini *xc_area, int *nbr_area, return rc; } +static inline int +xencomm_arch_hypercall_grant_table_op(unsigned int cmd, + struct xencomm_handle *uop, + unsigned int count) +{ + return _hypercall3(int, grant_table_op, cmd, uop, count); +} + int xencomm_mini_hypercall_grant_table_op(unsigned int cmd, void *op, unsigned int count) @@ -268,3 +289,107 @@ HYPERVISOR_suspend(unsigned long srec) return xencomm_arch_hypercall_suspend(xencomm_create_inline(&arg)); } +int +HYPERVISOR_event_channel_op(int cmd, void *arg) +{ + int rc; + struct xencomm_handle *newArg; + + newArg = xencomm_create_inline(arg); + rc = _hypercall2(int, event_channel_op, cmd, newArg); + if (unlikely(rc == -ENOSYS)) { + struct evtchn_op op; + + op.cmd = SWAP(cmd); + memcpy(&op.u, arg, sizeof(op.u)); + rc = _hypercall1(int, event_channel_op_compat, &op); + } + return rc; +} + +static int +xencomm_arch_xen_version(int cmd, struct xencomm_handle *arg) +{ + return _hypercall2(int, xen_version, cmd, arg); +} + +static int +xencomm_arch_xen_feature(int cmd, struct xencomm_handle *arg) +{ + struct xencomm_handle *newArg; + + newArg = xencomm_create_inline(arg); + return _hypercall2(int, xen_version, cmd, newArg); +} + +int +HYPERVISOR_xen_version(int cmd, void *arg) +{ + switch(cmd) { + case XENVER_version: + return xencomm_arch_xen_version(cmd, 0); + case XENVER_get_features: + return xencomm_arch_xen_feature(cmd, arg); + default: + return -1; + } +} + +int +HYPERVISOR_console_io(int cmd, int count, char *str) +{ + struct xencomm_handle *newStr; + + newStr = xencomm_create_inline(str); + return _hypercall3(int, console_io, cmd, count, newStr); +} + +int +HYPERVISOR_sched_op_compat(int cmd, unsigned long arg) +{ + return _hypercall2(int, sched_op_compat, cmd, arg); +} + +int +HYPERVISOR_sched_op(int cmd, void *arg) +{ + struct xencomm_handle *newArg; + + newArg = xencomm_create_inline(arg); + return _hypercall2(int, sched_op, cmd, newArg); +} + +int +HYPERVISOR_callback_op(int cmd, void *arg) +{ + struct xencomm_handle *newArg; + + newArg = xencomm_create_inline(arg); + return _hypercall2(int, callback_op, cmd, newArg); +} + +int +HYPERVISOR_opt_feature(void *arg) +{ + struct xencomm_handle *new_arg; + + new_arg = xencomm_create_inline(arg); + + return _hypercall1(int, opt_feature, new_arg); +} + +int +HYPERVISOR_shutdown(unsigned int reason) +{ + struct sched_shutdown sched_shutdown = { + .reason = reason + }; + + int rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown); + + if (rc == -ENOSYS) + rc = HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason); + + return rc; +} + diff --git a/extras/mini-os/include/ia64/hypercall-ia64.h b/extras/mini-os/include/ia64/hypercall-ia64.h index dbab3d55bf..06ddc8c774 100644 --- a/extras/mini-os/include/ia64/hypercall-ia64.h +++ b/extras/mini-os/include/ia64/hypercall-ia64.h @@ -34,8 +34,6 @@ #ifndef __HYPERCALL_H__ #define __HYPERCALL_H__ -#include <mini-os/lib.h> /* memcpy() */ -#include <mini-os/errno.h> /* ENOSYS() */ #include <xen/event_channel.h> #include <xen/sched.h> #include <xen/version.h> @@ -114,123 +112,24 @@ extern unsigned long __hypercall(unsigned long a1, unsigned long a2, }) -extern unsigned long xencomm_vaddr_to_paddr(unsigned long vaddr); -struct xencomm_handle; - -/* Inline version. To be used only on linear space (kernel space). */ -static inline struct xencomm_handle * -xencomm_create_inline(void *buffer) -{ - unsigned long paddr; - - paddr = xencomm_vaddr_to_paddr((unsigned long)buffer); - return (struct xencomm_handle *)(paddr | XENCOMM_INLINE_FLAG); -} - -static inline int -xencomm_arch_event_channel_op(int cmd, void *arg) -{ - int rc; - struct xencomm_handle *newArg; - - newArg = xencomm_create_inline(arg); - rc = _hypercall2(int, event_channel_op, cmd, newArg); - if (unlikely(rc == -ENOSYS)) { - struct evtchn_op op; - - op.cmd = SWAP(cmd); - memcpy(&op.u, arg, sizeof(op.u)); - rc = _hypercall1(int, event_channel_op_compat, &op); - } - return rc; -} -#define HYPERVISOR_event_channel_op xencomm_arch_event_channel_op - -static inline int -xencomm_arch_xen_version(int cmd, struct xencomm_handle *arg) -{ - return _hypercall2(int, xen_version, cmd, arg); -} - -static inline int -xencomm_arch_xen_feature(int cmd, struct xencomm_handle *arg) -{ - struct xencomm_handle *newArg; - - newArg = xencomm_create_inline(arg); - return _hypercall2(int, xen_version, cmd, newArg); -} - -static inline int -HYPERVISOR_xen_version(int cmd, void *arg) -{ - switch(cmd) { - case XENVER_version: - return xencomm_arch_xen_version(cmd, 0); - case XENVER_get_features: - return xencomm_arch_xen_feature(cmd, arg); - default: - return -1; - } -} - -static inline int -xencomm_arch_console_io(int cmd, int count, char *str) -{ - struct xencomm_handle *newStr; - - newStr = xencomm_create_inline(str); - return _hypercall3(int, console_io, cmd, count, newStr); -} - - -#define HYPERVISOR_console_io xencomm_arch_console_io - -static inline int -HYPERVISOR_sched_op_compat(int cmd, unsigned long arg) -{ - return _hypercall2(int, sched_op_compat, cmd, arg); -} - -static inline int -xencomm_arch_sched_op(int cmd, void *arg) -{ - struct xencomm_handle *newArg; - - newArg = xencomm_create_inline(arg); - return _hypercall2(int, sched_op, cmd, newArg); -} - -#define HYPERVISOR_sched_op xencomm_arch_sched_op - -static inline int -xencomm_arch_callback_op(int cmd, void *arg) -{ - struct xencomm_handle *newArg; - - newArg = xencomm_create_inline(arg); - return _hypercall2(int, callback_op, cmd, newArg); -} -#define HYPERVISOR_callback_op xencomm_arch_callback_op - -static inline int -xencomm_arch_hypercall_grant_table_op(unsigned int cmd, - struct xencomm_handle *uop, - unsigned int count) -{ - return _hypercall3(int, grant_table_op, cmd, uop, count); -} +int HYPERVISOR_event_channel_op(int cmd, void *arg); + +int HYPERVISOR_xen_version(int cmd, void *arg); + +int HYPERVISOR_console_io(int cmd, int count, char *str); + +int HYPERVISOR_sched_op_compat(int cmd, unsigned long arg); + +int HYPERVISOR_sched_op(int cmd, void *arg); + +int HYPERVISOR_callback_op(int cmd, void *arg); int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count); -static inline int -HYPERVISOR_opt_feature(void *arg) -{ - struct xencomm_handle *new_arg; +int HYPERVISOR_opt_feature(void *arg); - new_arg = xencomm_create_inline(arg); +int HYPERVISOR_suspend(unsigned long srec); - return _hypercall1(int, opt_feature, new_arg); -} +int HYPERVISOR_shutdown(unsigned int reason); #endif /* __HYPERCALL_H__ */ diff --git a/extras/mini-os/include/ia64/os.h b/extras/mini-os/include/ia64/os.h index 2cbfa424b7..133893acbd 100644 --- a/extras/mini-os/include/ia64/os.h +++ b/extras/mini-os/include/ia64/os.h @@ -192,21 +192,6 @@ __synch_cmpxchg(volatile void *ptr, uint64_t old, uint64_t new, int size) extern shared_info_t *HYPERVISOR_shared_info; -static inline int -HYPERVISOR_shutdown(unsigned int reason) -{ - struct sched_shutdown sched_shutdown = { - .reason = reason - }; - - int rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown); - - if (rc == -ENOSYS) - rc = HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason); - - return rc; -} - /* * This code is from the originally os.h and should be put in a |