diff options
author | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2010-05-14 07:45:07 -0400 |
---|---|---|
committer | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2010-07-22 19:46:21 -0400 |
commit | 016b6f5fe8398b0291cece60b749d7c930a2e09c (patch) | |
tree | 430e9aad74f223dc5d144b60f4b78a0c3fb9cdfd /arch/x86/xen/enlighten.c | |
parent | 183d03cc4ff39e0f0d952c09aa96d0abfd6e0c3c (diff) |
xen: Add suspend/resume support for PV on HVM guests.
Suspend/resume requires few different things on HVM: the suspend
hypercall is different; we don't need to save/restore memory related
settings; except the shared info page and the callback mechanism.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Diffstat (limited to 'arch/x86/xen/enlighten.c')
-rw-r--r-- | arch/x86/xen/enlighten.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index b211a04c4b2c..127c95c8d15e 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -1262,13 +1262,15 @@ static int init_hvm_pv_info(int *major, int *minor) | |||
1262 | return 0; | 1262 | return 0; |
1263 | } | 1263 | } |
1264 | 1264 | ||
1265 | static void __init init_shared_info(void) | 1265 | void xen_hvm_init_shared_info(void) |
1266 | { | 1266 | { |
1267 | int cpu; | ||
1267 | struct xen_add_to_physmap xatp; | 1268 | struct xen_add_to_physmap xatp; |
1268 | struct shared_info *shared_info_page; | 1269 | static struct shared_info *shared_info_page = 0; |
1269 | 1270 | ||
1270 | shared_info_page = (struct shared_info *) | 1271 | if (!shared_info_page) |
1271 | extend_brk(PAGE_SIZE, PAGE_SIZE); | 1272 | shared_info_page = (struct shared_info *) |
1273 | extend_brk(PAGE_SIZE, PAGE_SIZE); | ||
1272 | xatp.domid = DOMID_SELF; | 1274 | xatp.domid = DOMID_SELF; |
1273 | xatp.idx = 0; | 1275 | xatp.idx = 0; |
1274 | xatp.space = XENMAPSPACE_shared_info; | 1276 | xatp.space = XENMAPSPACE_shared_info; |
@@ -1278,7 +1280,17 @@ static void __init init_shared_info(void) | |||
1278 | 1280 | ||
1279 | HYPERVISOR_shared_info = (struct shared_info *)shared_info_page; | 1281 | HYPERVISOR_shared_info = (struct shared_info *)shared_info_page; |
1280 | 1282 | ||
1281 | per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0]; | 1283 | /* xen_vcpu is a pointer to the vcpu_info struct in the shared_info |
1284 | * page, we use it in the event channel upcall and in some pvclock | ||
1285 | * related functions. We don't need the vcpu_info placement | ||
1286 | * optimizations because we don't use any pv_mmu or pv_irq op on | ||
1287 | * HVM. | ||
1288 | * When xen_hvm_init_shared_info is run at boot time only vcpu 0 is | ||
1289 | * online but xen_hvm_init_shared_info is run at resume time too and | ||
1290 | * in that case multiple vcpus might be online. */ | ||
1291 | for_each_online_cpu(cpu) { | ||
1292 | per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu]; | ||
1293 | } | ||
1282 | } | 1294 | } |
1283 | 1295 | ||
1284 | static int __cpuinit xen_hvm_cpu_notify(struct notifier_block *self, | 1296 | static int __cpuinit xen_hvm_cpu_notify(struct notifier_block *self, |
@@ -1308,7 +1320,7 @@ static void __init xen_hvm_guest_init(void) | |||
1308 | if (r < 0) | 1320 | if (r < 0) |
1309 | return; | 1321 | return; |
1310 | 1322 | ||
1311 | init_shared_info(); | 1323 | xen_hvm_init_shared_info(); |
1312 | 1324 | ||
1313 | if (xen_feature(XENFEAT_hvm_callback_vector)) | 1325 | if (xen_feature(XENFEAT_hvm_callback_vector)) |
1314 | xen_have_vector_callback = 1; | 1326 | xen_have_vector_callback = 1; |