On 14/09/16 16:24, Jan Beulich wrote:
No need to have the same logic twice.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1745,22 +1745,22 @@ static void load_segments(struct vcpu *n
(unsigned long *)pv->kernel_sp;
unsigned long cs_and_mask, rflags;
+ /* Fold upcall mask and architectural IOPL into RFLAGS.IF. */
+ rflags = regs->rflags & ~(X86_EFLAGS_IF|X86_EFLAGS_IOPL);
+ rflags |= !vcpu_info(n, evtchn_upcall_mask) << 9;
+ if ( VM_ASSIST(n->domain, architectural_iopl) )
+ rflags |= n->arch.pv_vcpu.iopl;
+
if ( is_pv_32bit_vcpu(n) )
{
unsigned int *esp = ring_1(regs) ?
(unsigned int *)regs->rsp :
(unsigned int *)pv->kernel_sp;
- unsigned int cs_and_mask, eflags;
The unshadowed cs_and_mask is unsigned long, not int, which means
the put_user() below will clobber a 32bit PV guests stack frame.
Other than that, Reviewed-by: Andrew Cooper
<andrew.cooper3@xxxxxxxxxx> for the intended change.
~Andrew
int ret = 0;
/* CS longword also contains full evtchn_upcall_mask. */
cs_and_mask = (unsigned short)regs->cs |
((unsigned int)vcpu_info(n, evtchn_upcall_mask) << 16);
- /* Fold upcall mask into RFLAGS.IF. */
- eflags = regs->_eflags & ~(X86_EFLAGS_IF|X86_EFLAGS_IOPL);
- eflags |= !vcpu_info(n, evtchn_upcall_mask) << 9;
- if ( VM_ASSIST(n->domain, architectural_iopl) )
- eflags |= n->arch.pv_vcpu.iopl;
if ( !ring_1(regs) )
{
@@ -1770,7 +1770,7 @@ static void load_segments(struct vcpu *n
}
if ( ret |
- put_user(eflags, esp-1) |
+ put_user(rflags, esp-1) |
put_user(cs_and_mask, esp-2) |
put_user(regs->_eip, esp-3) |
put_user(uregs->gs, esp-4) |
@@ -1805,12 +1805,6 @@ static void load_segments(struct vcpu *n
cs_and_mask = (unsigned long)regs->cs |
((unsigned long)vcpu_info(n, evtchn_upcall_mask) << 32);
- /* Fold upcall mask into RFLAGS.IF. */
- rflags = regs->rflags & ~(X86_EFLAGS_IF|X86_EFLAGS_IOPL);
- rflags |= !vcpu_info(n, evtchn_upcall_mask) << 9;
- if ( VM_ASSIST(n->domain, architectural_iopl) )
- rflags |= n->arch.pv_vcpu.iopl;
-
if ( put_user(regs->ss, rsp- 1) |
put_user(regs->rsp, rsp- 2) |
put_user(rflags, rsp- 3) |
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|