/root/src/xen/xen/include/asm/hvm/save.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * save.h: HVM support routines for save/restore |
3 | | * |
4 | | * This program is free software; you can redistribute it and/or modify it |
5 | | * under the terms and conditions of the GNU General Public License, |
6 | | * version 2, as published by the Free Software Foundation. |
7 | | * |
8 | | * This program is distributed in the hope it will be useful, but WITHOUT |
9 | | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
10 | | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
11 | | * more details. |
12 | | * |
13 | | * You should have received a copy of the GNU General Public License along with |
14 | | * this program; If not, see <http://www.gnu.org/licenses/>. |
15 | | */ |
16 | | |
17 | | #ifndef __XEN_HVM_SAVE_H__ |
18 | | #define __XEN_HVM_SAVE_H__ |
19 | | |
20 | | #include <xen/types.h> |
21 | | #include <xen/init.h> |
22 | | #include <public/xen.h> |
23 | | #include <public/hvm/save.h> |
24 | | |
25 | | /* Marshalling and unmarshalling uses a buffer with size and cursor. */ |
26 | | typedef struct hvm_domain_context { |
27 | | uint32_t cur; |
28 | | uint32_t size; |
29 | | uint8_t *data; |
30 | | } hvm_domain_context_t; |
31 | | |
32 | | /* Marshalling an entry: check space and fill in the header */ |
33 | | int _hvm_init_entry(struct hvm_domain_context *h, |
34 | | uint16_t tc, uint16_t inst, uint32_t len); |
35 | | |
36 | | /* Marshalling: copy the contents in a type-safe way */ |
37 | | void _hvm_write_entry(struct hvm_domain_context *h, |
38 | | void *src, uint32_t src_len); |
39 | | |
40 | | /* Marshalling: init and copy; evaluates to zero on success */ |
41 | 0 | #define hvm_save_entry(_x, _inst, _h, _src) ({ \ |
42 | 0 | int r; \ |
43 | 0 | r = _hvm_init_entry((_h), HVM_SAVE_CODE(_x), \ |
44 | 0 | (_inst), HVM_SAVE_LENGTH(_x)); \ |
45 | 0 | if ( r == 0 ) \ |
46 | 0 | _hvm_write_entry((_h), (_src), HVM_SAVE_LENGTH(_x)); \ |
47 | 0 | r; }) |
48 | | |
49 | | /* Unmarshalling: test an entry's size and typecode and record the instance */ |
50 | | int _hvm_check_entry(struct hvm_domain_context *h, |
51 | | uint16_t type, uint32_t len, bool_t strict_length); |
52 | | |
53 | | /* Unmarshalling: copy the contents in a type-safe way */ |
54 | | void _hvm_read_entry(struct hvm_domain_context *h, |
55 | | void *dest, uint32_t dest_len); |
56 | | |
57 | | /* |
58 | | * Unmarshalling: check, then copy. Evaluates to zero on success. This load |
59 | | * function requires the save entry to be the same size as the dest structure. |
60 | | */ |
61 | 0 | #define _hvm_load_entry(_x, _h, _dst, _strict) ({ \ |
62 | 0 | int r; \ |
63 | 0 | struct hvm_save_descriptor *desc \ |
64 | 0 | = (struct hvm_save_descriptor *)&(_h)->data[(_h)->cur]; \ |
65 | 0 | if ( (r = _hvm_check_entry((_h), HVM_SAVE_CODE(_x), \ |
66 | 0 | HVM_SAVE_LENGTH(_x), (_strict))) == 0 ) \ |
67 | 0 | { \ |
68 | 0 | _hvm_read_entry((_h), (_dst), HVM_SAVE_LENGTH(_x)); \ |
69 | 0 | if ( HVM_SAVE_HAS_COMPAT(_x) && \ |
70 | 0 | desc->length != HVM_SAVE_LENGTH(_x) ) \ |
71 | 0 | r = HVM_SAVE_FIX_COMPAT(_x, (_dst), desc->length); \ |
72 | 0 | } \ |
73 | 0 | else if (HVM_SAVE_HAS_COMPAT(_x) \ |
74 | 0 | && (r = _hvm_check_entry((_h), HVM_SAVE_CODE(_x), \ |
75 | 0 | HVM_SAVE_LENGTH_COMPAT(_x), (_strict))) == 0 ) { \ |
76 | 0 | _hvm_read_entry((_h), (_dst), HVM_SAVE_LENGTH_COMPAT(_x)); \ |
77 | 0 | r = HVM_SAVE_FIX_COMPAT(_x, (_dst), desc->length); \ |
78 | 0 | } \ |
79 | 0 | r; }) |
80 | | |
81 | | #define hvm_load_entry(_x, _h, _dst) \ |
82 | 0 | _hvm_load_entry(_x, _h, _dst, 1) |
83 | | #define hvm_load_entry_zeroextend(_x, _h, _dst) \ |
84 | 0 | _hvm_load_entry(_x, _h, _dst, 0) |
85 | | |
86 | | /* Unmarshalling: what is the instance ID of the next entry? */ |
87 | | static inline uint16_t hvm_load_instance(struct hvm_domain_context *h) |
88 | 0 | { |
89 | 0 | struct hvm_save_descriptor *d |
90 | 0 | = (struct hvm_save_descriptor *)&h->data[h->cur]; |
91 | 0 | return d->instance; |
92 | 0 | } Unexecuted instantiation: xstate.c:hvm_load_instance Unexecuted instantiation: iret.c:hvm_load_instance Unexecuted instantiation: emul-priv-op.c:hvm_load_instance Unexecuted instantiation: emul-inv-op.c:hvm_load_instance Unexecuted instantiation: emul-gate-op.c:hvm_load_instance Unexecuted instantiation: descriptor-tables.c:hvm_load_instance Unexecuted instantiation: callback.c:hvm_load_instance Unexecuted instantiation: backtrace.c:hvm_load_instance Unexecuted instantiation: op_model_athlon.c:hvm_load_instance Unexecuted instantiation: nested_ept.c:hvm_load_instance Unexecuted instantiation: nested_hap.c:hvm_load_instance Unexecuted instantiation: hap.c:hvm_load_instance Unexecuted instantiation: multi.c:hvm_load_instance Unexecuted instantiation: common.c:hvm_load_instance Unexecuted instantiation: mem_sharing.c:hvm_load_instance Unexecuted instantiation: mem_paging.c:hvm_load_instance Unexecuted instantiation: altp2m.c:hvm_load_instance Unexecuted instantiation: domctl.c:hvm_load_instance Unexecuted instantiation: domain.c:hvm_load_instance Unexecuted instantiation: event_channel.c:hvm_load_instance Unexecuted instantiation: grant_table.c:hvm_load_instance Unexecuted instantiation: guestcopy.c:hvm_load_instance Unexecuted instantiation: kernel.c:hvm_load_instance Unexecuted instantiation: kexec.c:hvm_load_instance Unexecuted instantiation: kimage.c:hvm_load_instance Unexecuted instantiation: mem_access.c:hvm_load_instance Unexecuted instantiation: memory.c:hvm_load_instance Unexecuted instantiation: multicall.c:hvm_load_instance Unexecuted instantiation: page_alloc.c:hvm_load_instance Unexecuted instantiation: sched_arinc653.c:hvm_load_instance Unexecuted instantiation: sched_rt.c:hvm_load_instance Unexecuted instantiation: schedule.c:hvm_load_instance Unexecuted instantiation: spinlock.c:hvm_load_instance Unexecuted instantiation: symbols.c:hvm_load_instance Unexecuted instantiation: sysctl.c:hvm_load_instance Unexecuted instantiation: xenoprof.c:hvm_load_instance Unexecuted instantiation: tmem.c:hvm_load_instance Unexecuted instantiation: tmem_xen.c:hvm_load_instance Unexecuted instantiation: tmem_control.c:hvm_load_instance Unexecuted instantiation: llvm.c:hvm_load_instance Unexecuted instantiation: libelf-loader.c:hvm_load_instance Unexecuted instantiation: console.c:hvm_load_instance Unexecuted instantiation: cpufreq.c:hvm_load_instance Unexecuted instantiation: iommu.c:hvm_load_instance Unexecuted instantiation: io.c:hvm_load_instance Unexecuted instantiation: pci.c:hvm_load_instance Unexecuted instantiation: pmstat.c:hvm_load_instance Unexecuted instantiation: compat.c:hvm_load_instance Unexecuted instantiation: crash.c:hvm_load_instance Unexecuted instantiation: debug.c:hvm_load_instance Unexecuted instantiation: i387.c:hvm_load_instance Unexecuted instantiation: machine_kexec.c:hvm_load_instance Unexecuted instantiation: microcode.c:hvm_load_instance Unexecuted instantiation: mm.c:hvm_load_instance Unexecuted instantiation: physdev.c:hvm_load_instance Unexecuted instantiation: platform_hypercall.c:hvm_load_instance Unexecuted instantiation: setup.c:hvm_load_instance Unexecuted instantiation: smp.c:hvm_load_instance Unexecuted instantiation: time.c:hvm_load_instance Unexecuted instantiation: traps.c:hvm_load_instance Unexecuted instantiation: ro-page-fault.c:hvm_load_instance Unexecuted instantiation: suspend.c:hvm_load_instance Unexecuted instantiation: cpu_idle.c:hvm_load_instance Unexecuted instantiation: amd.c:hvm_load_instance Unexecuted instantiation: intel.c:hvm_load_instance Unexecuted instantiation: vpmu.c:hvm_load_instance Unexecuted instantiation: vpmu_amd.c:hvm_load_instance Unexecuted instantiation: vpmu_intel.c:hvm_load_instance Unexecuted instantiation: mce.c:hvm_load_instance Unexecuted instantiation: vmce.c:hvm_load_instance Unexecuted instantiation: dm.c:hvm_load_instance Unexecuted instantiation: emulate.c:hvm_load_instance Unexecuted instantiation: hpet.c:hvm_load_instance Unexecuted instantiation: hvm.c:hvm_load_instance Unexecuted instantiation: hypercall.c:hvm_load_instance Unexecuted instantiation: i8254.c:hvm_load_instance Unexecuted instantiation: intercept.c:hvm_load_instance Unexecuted instantiation: ioreq.c:hvm_load_instance Unexecuted instantiation: irq.c:hvm_load_instance Unexecuted instantiation: mtrr.c:hvm_load_instance Unexecuted instantiation: nestedhvm.c:hvm_load_instance Unexecuted instantiation: pmtimer.c:hvm_load_instance Unexecuted instantiation: quirks.c:hvm_load_instance Unexecuted instantiation: rtc.c:hvm_load_instance Unexecuted instantiation: save.c:hvm_load_instance Unexecuted instantiation: stdvga.c:hvm_load_instance Unexecuted instantiation: vioapic.c:hvm_load_instance Unexecuted instantiation: viridian.c:hvm_load_instance Unexecuted instantiation: vlapic.c:hvm_load_instance Unexecuted instantiation: vm_event.c:hvm_load_instance Unexecuted instantiation: vmsi.c:hvm_load_instance Unexecuted instantiation: vpic.c:hvm_load_instance Unexecuted instantiation: vpt.c:hvm_load_instance Unexecuted instantiation: intr.c:hvm_load_instance Unexecuted instantiation: nestedsvm.c:hvm_load_instance Unexecuted instantiation: svm.c:hvm_load_instance Unexecuted instantiation: vmcb.c:hvm_load_instance Unexecuted instantiation: realmode.c:hvm_load_instance Unexecuted instantiation: vmcs.c:hvm_load_instance Unexecuted instantiation: vmx.c:hvm_load_instance Unexecuted instantiation: vvmx.c:hvm_load_instance Unexecuted instantiation: paging.c:hvm_load_instance Unexecuted instantiation: p2m.c:hvm_load_instance Unexecuted instantiation: p2m-ept.c:hvm_load_instance |
93 | | |
94 | | /* Handler types for different types of save-file entry. |
95 | | * The save handler may save multiple instances of a type into the buffer; |
96 | | * the load handler will be called once for each instance found when |
97 | | * restoring. Both return non-zero on error. */ |
98 | | typedef int (*hvm_save_handler) (struct domain *d, |
99 | | hvm_domain_context_t *h); |
100 | | typedef int (*hvm_load_handler) (struct domain *d, |
101 | | hvm_domain_context_t *h); |
102 | | |
103 | | /* Init-time function to declare a pair of handlers for a type, |
104 | | * and the maximum buffer space needed to save this type of state */ |
105 | | void hvm_register_savevm(uint16_t typecode, |
106 | | const char *name, |
107 | | hvm_save_handler save_state, |
108 | | hvm_load_handler load_state, |
109 | | size_t size, int kind); |
110 | | |
111 | | /* The space needed for saving can be per-domain or per-vcpu: */ |
112 | | #define HVMSR_PER_DOM 0 |
113 | 1 | #define HVMSR_PER_VCPU 1 |
114 | | |
115 | | /* Syntactic sugar around that function: specify the max number of |
116 | | * saves, and this calculates the size of buffer needed */ |
117 | | #define HVM_REGISTER_SAVE_RESTORE(_x, _save, _load, _num, _k) \ |
118 | 17 | static int __init __hvm_register_##_x##_save_and_restore(void) \ |
119 | 17 | { \ |
120 | 17 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ |
121 | 17 | #_x, \ |
122 | 17 | &_save, \ |
123 | 17 | &_load, \ |
124 | 17 | (_num) * (HVM_SAVE_LENGTH(_x) \ |
125 | 17 | + sizeof (struct hvm_save_descriptor)), \ |
126 | 17 | _k); \ |
127 | 17 | return 0; \ |
128 | 17 | } \ vpic.c:__hvm_register_PIC_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
vlapic.c:__hvm_register_LAPIC_REGS_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
vlapic.c:__hvm_register_LAPIC_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
viridian.c:__hvm_register_VIRIDIAN_VCPU_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
viridian.c:__hvm_register_VIRIDIAN_DOMAIN_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
vioapic.c:__hvm_register_IOAPIC_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
rtc.c:__hvm_register_RTC_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
pmtimer.c:__hvm_register_PMTIMER_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
mtrr.c:__hvm_register_MTRR_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
irq.c:__hvm_register_PCI_LINK_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
irq.c:__hvm_register_ISA_IRQ_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
irq.c:__hvm_register_PCI_IRQ_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
i8254.c:__hvm_register_PIT_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
hvm.c:__hvm_register_CPU_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
hvm.c:__hvm_register_TSC_ADJUST_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
hpet.c:__hvm_register_HPET_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
vmce.c:__hvm_register_VMCE_VCPU_save_and_restore Line | Count | Source | 118 | 1 | static int __init __hvm_register_##_x##_save_and_restore(void) \ | 119 | 1 | { \ | 120 | 1 | hvm_register_savevm(HVM_SAVE_CODE(_x), \ | 121 | 1 | #_x, \ | 122 | 1 | &_save, \ | 123 | 1 | &_load, \ | 124 | 1 | (_num) * (HVM_SAVE_LENGTH(_x) \ | 125 | 1 | + sizeof (struct hvm_save_descriptor)), \ | 126 | 1 | _k); \ | 127 | 1 | return 0; \ | 128 | 1 | } \ |
|
129 | | __initcall(__hvm_register_##_x##_save_and_restore); |
130 | | |
131 | | |
132 | | /* Entry points for saving and restoring HVM domain state */ |
133 | | size_t hvm_save_size(struct domain *d); |
134 | | int hvm_save(struct domain *d, hvm_domain_context_t *h); |
135 | | int hvm_save_one(struct domain *d, unsigned int typecode, unsigned int instance, |
136 | | XEN_GUEST_HANDLE_64(uint8) handle, uint64_t *bufsz); |
137 | | int hvm_load(struct domain *d, hvm_domain_context_t *h); |
138 | | |
139 | | /* Arch-specific definitions. */ |
140 | | struct hvm_save_header; |
141 | | void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr); |
142 | | int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr); |
143 | | |
144 | | #endif /* __XEN_HVM_SAVE_H__ */ |