aboutsummaryrefslogtreecommitdiffstats
path: root/xen/include/asm-x86/hvm/support.h
diff options
context:
space:
mode:
authorKeir Fraser <keir@xensource.com>2007-10-18 10:55:26 +0100
committerKeir Fraser <keir@xensource.com>2007-10-18 10:55:26 +0100
commit676f7c7b8a1d0966d2aa4c74eb2ad7cf19099459 (patch)
tree4abda4a24ac7dbf3c1e6f287a22a917135f32a2e /xen/include/asm-x86/hvm/support.h
parent2a61b8af7e694460b8615d449f2e6a8e09085280 (diff)
downloadxen-676f7c7b8a1d0966d2aa4c74eb2ad7cf19099459.tar.gz
xen-676f7c7b8a1d0966d2aa4c74eb2ad7cf19099459.tar.bz2
xen-676f7c7b8a1d0966d2aa4c74eb2ad7cf19099459.zip
Split asm-x86/hvm/support into arch generic part and x86 specific part.
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Diffstat (limited to 'xen/include/asm-x86/hvm/support.h')
-rw-r--r--xen/include/asm-x86/hvm/support.h139
1 files changed, 1 insertions, 138 deletions
diff --git a/xen/include/asm-x86/hvm/support.h b/xen/include/asm-x86/hvm/support.h
index 62fd6fa04e..d24505989c 100644
--- a/xen/include/asm-x86/hvm/support.h
+++ b/xen/include/asm-x86/hvm/support.h
@@ -22,6 +22,7 @@
#define __ASM_X86_HVM_SUPPORT_H__
#include <xen/sched.h>
+#include <xen/hvm/save.h>
#include <asm/types.h>
#include <asm/regs.h>
#include <asm/processor.h>
@@ -76,144 +77,6 @@ extern unsigned int opt_hvm_debug_level;
#define HVM_DBG_LOG(level, _f, _a...)
#endif
-/*
- * Save/restore support
- */
-
-/* Marshalling and unmarshalling uses a buffer with size and cursor. */
-typedef struct hvm_domain_context {
- uint32_t cur;
- uint32_t size;
- uint8_t *data;
-} hvm_domain_context_t;
-
-/* Marshalling an entry: check space and fill in the header */
-static inline int _hvm_init_entry(struct hvm_domain_context *h,
- uint16_t tc, uint16_t inst, uint32_t len)
-{
- struct hvm_save_descriptor *d
- = (struct hvm_save_descriptor *)&h->data[h->cur];
- if ( h->size - h->cur < len + sizeof (*d) )
- {
- gdprintk(XENLOG_WARNING,
- "HVM save: no room for %"PRIu32" + %u bytes "
- "for typecode %"PRIu16"\n",
- len, (unsigned) sizeof (*d), tc);
- return -1;
- }
- d->typecode = tc;
- d->instance = inst;
- d->length = len;
- h->cur += sizeof (*d);
- return 0;
-}
-
-/* Marshalling: copy the contents in a type-safe way */
-#define _hvm_write_entry(_x, _h, _src) do { \
- *(HVM_SAVE_TYPE(_x) *)(&(_h)->data[(_h)->cur]) = *(_src); \
- (_h)->cur += HVM_SAVE_LENGTH(_x); \
-} while (0)
-
-/* Marshalling: init and copy; evaluates to zero on success */
-#define hvm_save_entry(_x, _inst, _h, _src) ({ \
- int r; \
- r = _hvm_init_entry((_h), HVM_SAVE_CODE(_x), \
- (_inst), HVM_SAVE_LENGTH(_x)); \
- if ( r == 0 ) \
- _hvm_write_entry(_x, (_h), (_src)); \
- r; })
-
-/* Unmarshalling: test an entry's size and typecode and record the instance */
-static inline int _hvm_check_entry(struct hvm_domain_context *h,
- uint16_t type, uint32_t len)
-{
- struct hvm_save_descriptor *d
- = (struct hvm_save_descriptor *)&h->data[h->cur];
- if ( len + sizeof (*d) > h->size - h->cur)
- {
- gdprintk(XENLOG_WARNING,
- "HVM restore: not enough data left to read %u bytes "
- "for type %u\n", len, type);
- return -1;
- }
- if ( type != d->typecode || len != d->length )
- {
- gdprintk(XENLOG_WARNING,
- "HVM restore mismatch: expected type %u length %u, "
- "saw type %u length %u\n", type, len, d->typecode, d->length);
- return -1;
- }
- h->cur += sizeof (*d);
- return 0;
-}
-
-/* Unmarshalling: copy the contents in a type-safe way */
-#define _hvm_read_entry(_x, _h, _dst) do { \
- *(_dst) = *(HVM_SAVE_TYPE(_x) *) (&(_h)->data[(_h)->cur]); \
- (_h)->cur += HVM_SAVE_LENGTH(_x); \
-} while (0)
-
-/* Unmarshalling: check, then copy. Evaluates to zero on success. */
-#define hvm_load_entry(_x, _h, _dst) ({ \
- int r; \
- r = _hvm_check_entry((_h), HVM_SAVE_CODE(_x), HVM_SAVE_LENGTH(_x)); \
- if ( r == 0 ) \
- _hvm_read_entry(_x, (_h), (_dst)); \
- r; })
-
-/* Unmarshalling: what is the instance ID of the next entry? */
-static inline uint16_t hvm_load_instance(struct hvm_domain_context *h)
-{
- struct hvm_save_descriptor *d
- = (struct hvm_save_descriptor *)&h->data[h->cur];
- return d->instance;
-}
-
-/* Handler types for different types of save-file entry.
- * The save handler may save multiple instances of a type into the buffer;
- * the load handler will be called once for each instance found when
- * restoring. Both return non-zero on error. */
-typedef int (*hvm_save_handler) (struct domain *d,
- hvm_domain_context_t *h);
-typedef int (*hvm_load_handler) (struct domain *d,
- hvm_domain_context_t *h);
-
-/* Init-time function to declare a pair of handlers for a type,
- * and the maximum buffer space needed to save this type of state */
-void hvm_register_savevm(uint16_t typecode,
- const char *name,
- hvm_save_handler save_state,
- hvm_load_handler load_state,
- size_t size, int kind);
-
-/* The space needed for saving can be per-domain or per-vcpu: */
-#define HVMSR_PER_DOM 0
-#define HVMSR_PER_VCPU 1
-
-/* Syntactic sugar around that function: specify the max number of
- * saves, and this calculates the size of buffer needed */
-#define HVM_REGISTER_SAVE_RESTORE(_x, _save, _load, _num, _k) \
-static int __hvm_register_##_x##_save_and_restore(void) \
-{ \
- hvm_register_savevm(HVM_SAVE_CODE(_x), \
- #_x, \
- &_save, \
- &_load, \
- (_num) * (HVM_SAVE_LENGTH(_x) \
- + sizeof (struct hvm_save_descriptor)), \
- _k); \
- return 0; \
-} \
-__initcall(__hvm_register_##_x##_save_and_restore);
-
-
-/* Entry points for saving and restoring HVM domain state */
-size_t hvm_save_size(struct domain *d);
-int hvm_save(struct domain *d, hvm_domain_context_t *h);
-int hvm_load(struct domain *d, hvm_domain_context_t *h);
-
-/* End of save/restore */
-
extern char hvm_io_bitmap[];
void hvm_enable(struct hvm_function_table *);