|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 4/4] x86/pv: Implement the failsafe callback using the general path
>>> On 08.05.17 at 17:48, <andrew.cooper3@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -1275,100 +1275,14 @@ static void load_segments(struct vcpu *n)
>
> if ( unlikely(!all_segs_okay) )
> {
> - struct pv_vcpu *pv = &n->arch.pv_vcpu;
> - struct cpu_user_regs *regs = guest_cpu_user_regs();
> - unsigned long *rsp =
> - (unsigned long *)(((n->arch.flags & TF_kernel_mode)
> - ? regs->rsp : pv->kernel_sp) & ~0xf);
> - 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;
> - 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);
> -
> - if ( !ring_1(regs) )
> - {
> - ret = put_user(regs->ss, esp-1);
> - ret |= put_user(regs->esp, esp-2);
> - esp -= 2;
> - }
> -
> - if ( ret |
> - put_user(rflags, esp-1) |
> - put_user(cs_and_mask, esp-2) |
> - put_user(regs->eip, esp-3) |
> - put_user(uregs->gs, esp-4) |
> - put_user(uregs->fs, esp-5) |
> - put_user(uregs->es, esp-6) |
> - put_user(uregs->ds, esp-7) )
> - {
> - gprintk(XENLOG_ERR,
> - "error while creating compat failsafe callback
> frame\n");
> - domain_crash(n->domain);
> - }
> + bool disable = n->arch.vgc_flags & VGCF_failsafe_disables_events;
>
> - if ( n->arch.vgc_flags & VGCF_failsafe_disables_events )
> - vcpu_info(n, evtchn_upcall_mask) = 1;
> -
> - regs->entry_vector |= TRAP_syscall;
> - regs->eflags &=
> ~(X86_EFLAGS_VM|X86_EFLAGS_RF|X86_EFLAGS_NT|
> - X86_EFLAGS_IOPL|X86_EFLAGS_TF);
> - regs->ss = FLAT_COMPAT_KERNEL_SS;
> - regs->esp = (unsigned long)(esp-7);
> - regs->cs = FLAT_COMPAT_KERNEL_CS;
> - regs->eip = pv->failsafe_callback_eip;
> - return;
> - }
> -
> - if ( !(n->arch.flags & TF_kernel_mode) )
> - toggle_guest_mode(n);
> - else
> - regs->cs &= ~3;
> -
> - /* CS longword also contains full evtchn_upcall_mask. */
> - cs_and_mask = (unsigned long)regs->cs |
> - ((unsigned long)vcpu_info(n, evtchn_upcall_mask) << 32);
> -
> - if ( put_user(regs->ss, rsp- 1) |
> - put_user(regs->rsp, rsp- 2) |
> - put_user(rflags, rsp- 3) |
> - put_user(cs_and_mask, rsp- 4) |
> - put_user(regs->rip, rsp- 5) |
> - put_user(uregs->gs, rsp- 6) |
> - put_user(uregs->fs, rsp- 7) |
> - put_user(uregs->es, rsp- 8) |
> - put_user(uregs->ds, rsp- 9) |
> - put_user(regs->r11, rsp-10) |
> - put_user(regs->rcx, rsp-11) )
> - {
> - gprintk(XENLOG_ERR,
> - "error while creating failsafe callback frame\n");
> - domain_crash(n->domain);
> - }
> -
> - if ( n->arch.vgc_flags & VGCF_failsafe_disables_events )
> - vcpu_info(n, evtchn_upcall_mask) = 1;
> -
> - regs->entry_vector |= TRAP_syscall;
> - regs->rflags &= ~(X86_EFLAGS_AC|X86_EFLAGS_VM|X86_EFLAGS_RF|
> - X86_EFLAGS_NT|X86_EFLAGS_IOPL|X86_EFLAGS_TF);
> - regs->ss = FLAT_KERNEL_SS;
> - regs->rsp = (unsigned long)(rsp-11);
> - regs->cs = FLAT_KERNEL_CS;
> - regs->rip = pv->failsafe_callback_eip;
> + n->arch.pv_vcpu.trap_bounce = (struct trap_bounce){
> + .flags = (TBF_FAILSAFE | TBF_EXCEPTION |
> + (disable ? TBF_INTERRUPT : 0)),
Pointless outer parentheses.
> --- a/xen/arch/x86/pv/traps.c
> +++ b/xen/arch/x86/pv/traps.c
> @@ -44,7 +44,8 @@ void pv_create_exception_frame(void)
> {
> struct vcpu *curr = current;
> struct trap_bounce *tb = &curr->arch.pv_vcpu.trap_bounce;
> - struct cpu_user_regs *regs = guest_cpu_user_regs();
> + struct cpu_user_regs *regs = guest_cpu_user_regs(),
> + *uregs = &curr->arch.user_regs;
These should be const, even if this requires a fully separate
declaration.
With these taken care of (and suitable re-basing over changes to
earlier patches),
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |