aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/domctl.c
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2011-04-05 13:02:00 +0100
committerJan Beulich <jbeulich@novell.com>2011-04-05 13:02:00 +0100
commit6b063a4a6f44245a727aa04ef76408b2e00af9c7 (patch)
treefd06cd209b596a7752d9f608e11026b6fc5807d0 /xen/arch/x86/domctl.c
parent9a70856bb28bb8c9b1d37fb8a005447ac77b0619 (diff)
downloadxen-6b063a4a6f44245a727aa04ef76408b2e00af9c7.tar.gz
xen-6b063a4a6f44245a727aa04ef76408b2e00af9c7.tar.bz2
xen-6b063a4a6f44245a727aa04ef76408b2e00af9c7.zip
x86: move pv-only members of struct vcpu to struct pv_vcpu
... thus further shrinking overall size of struct arch_vcpu. This has a minor effect on XEN_DOMCTL_{get,set}_ext_vcpucontext - for HVM guests, some meaningless fields will no longer get stored or retrieved: reads will now return zero, and writes are required to be (mostly) zero (the same as was already done on x86-32). Signed-off-by: Jan Beulich <jbeulich@novell.com>
Diffstat (limited to 'xen/arch/x86/domctl.c')
-rw-r--r--xen/arch/x86/domctl.c68
1 files changed, 44 insertions, 24 deletions
diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index 6dec45ccb1..19cac08bd5 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -1123,20 +1123,31 @@ long arch_do_domctl(
{
evc->size = sizeof(*evc);
#ifdef __x86_64__
- evc->sysenter_callback_cs = v->arch.sysenter_callback_cs;
- evc->sysenter_callback_eip = v->arch.sysenter_callback_eip;
- evc->sysenter_disables_events = v->arch.sysenter_disables_events;
- evc->syscall32_callback_cs = v->arch.syscall32_callback_cs;
- evc->syscall32_callback_eip = v->arch.syscall32_callback_eip;
- evc->syscall32_disables_events = v->arch.syscall32_disables_events;
-#else
- evc->sysenter_callback_cs = 0;
- evc->sysenter_callback_eip = 0;
- evc->sysenter_disables_events = 0;
- evc->syscall32_callback_cs = 0;
- evc->syscall32_callback_eip = 0;
- evc->syscall32_disables_events = 0;
+ if ( !is_hvm_domain(d) )
+ {
+ evc->sysenter_callback_cs =
+ v->arch.pv_vcpu.sysenter_callback_cs;
+ evc->sysenter_callback_eip =
+ v->arch.pv_vcpu.sysenter_callback_eip;
+ evc->sysenter_disables_events =
+ v->arch.pv_vcpu.sysenter_disables_events;
+ evc->syscall32_callback_cs =
+ v->arch.pv_vcpu.syscall32_callback_cs;
+ evc->syscall32_callback_eip =
+ v->arch.pv_vcpu.syscall32_callback_eip;
+ evc->syscall32_disables_events =
+ v->arch.pv_vcpu.syscall32_disables_events;
+ }
+ else
#endif
+ {
+ evc->sysenter_callback_cs = 0;
+ evc->sysenter_callback_eip = 0;
+ evc->sysenter_disables_events = 0;
+ evc->syscall32_callback_cs = 0;
+ evc->syscall32_callback_eip = 0;
+ evc->syscall32_disables_events = 0;
+ }
}
else
{
@@ -1144,22 +1155,31 @@ long arch_do_domctl(
if ( evc->size != sizeof(*evc) )
goto ext_vcpucontext_out;
#ifdef __x86_64__
- fixup_guest_code_selector(d, evc->sysenter_callback_cs);
- v->arch.sysenter_callback_cs = evc->sysenter_callback_cs;
- v->arch.sysenter_callback_eip = evc->sysenter_callback_eip;
- v->arch.sysenter_disables_events = evc->sysenter_disables_events;
- fixup_guest_code_selector(d, evc->syscall32_callback_cs);
- v->arch.syscall32_callback_cs = evc->syscall32_callback_cs;
- v->arch.syscall32_callback_eip = evc->syscall32_callback_eip;
- v->arch.syscall32_disables_events = evc->syscall32_disables_events;
-#else
+ if ( !is_hvm_domain(d) )
+ {
+ fixup_guest_code_selector(d, evc->sysenter_callback_cs);
+ v->arch.pv_vcpu.sysenter_callback_cs =
+ evc->sysenter_callback_cs;
+ v->arch.pv_vcpu.sysenter_callback_eip =
+ evc->sysenter_callback_eip;
+ v->arch.pv_vcpu.sysenter_disables_events =
+ evc->sysenter_disables_events;
+ fixup_guest_code_selector(d, evc->syscall32_callback_cs);
+ v->arch.pv_vcpu.syscall32_callback_cs =
+ evc->syscall32_callback_cs;
+ v->arch.pv_vcpu.syscall32_callback_eip =
+ evc->syscall32_callback_eip;
+ v->arch.pv_vcpu.syscall32_disables_events =
+ evc->syscall32_disables_events;
+ }
+ else
+#endif
/* We do not support syscall/syscall32/sysenter on 32-bit Xen. */
if ( (evc->sysenter_callback_cs & ~3) ||
evc->sysenter_callback_eip ||
(evc->syscall32_callback_cs & ~3) ||
evc->syscall32_callback_eip )
goto ext_vcpucontext_out;
-#endif
}
ret = 0;
@@ -1698,7 +1718,7 @@ void arch_get_info_guest(struct vcpu *v, vcpu_guest_context_u c)
/* IOPL privileges are virtualised: merge back into returned eflags. */
BUG_ON((c(user_regs.eflags) & X86_EFLAGS_IOPL) != 0);
- c(user_regs.eflags |= v->arch.iopl << 12);
+ c(user_regs.eflags |= v->arch.pv_vcpu.iopl << 12);
if ( !is_pv_32on64_domain(v->domain) )
{