diff options
author | Keir Fraser <keir@xensource.com> | 2007-10-18 10:55:26 +0100 |
---|---|---|
committer | Keir Fraser <keir@xensource.com> | 2007-10-18 10:55:26 +0100 |
commit | 676f7c7b8a1d0966d2aa4c74eb2ad7cf19099459 (patch) | |
tree | 4abda4a24ac7dbf3c1e6f287a22a917135f32a2e /xen/include/asm-x86/hvm/support.h | |
parent | 2a61b8af7e694460b8615d449f2e6a8e09085280 (diff) | |
download | xen-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.h | 139 |
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 *); |