Module Name: src Committed By: bouyer Date: Sat Apr 11 12:01:42 UTC 2020
Modified Files: src/sys/arch/i386/i386 [bouyer-xenpvh]: spl.S vector.S Log Message: calling stipending() is only needed in the PV case; in PVHVM hypervisor_callback() will be called again as soon as we enable interrupts. Use the PVHVM XENINTRSTUB for PV too; asjust Xdoreti as needed. merge hypervisor_callback with hypervisor_pvhvm_callback. The reetrancy should not be an issue, as we're already re-enabling events in do_hupervisor_callback (that it, outside of the critical section). We now can call Xdoreti in both cases. To generate a diff of this commit: cvs rdiff -u -r1.50.4.2 -r1.50.4.3 src/sys/arch/i386/i386/spl.S cvs rdiff -u -r1.85.6.1 -r1.85.6.2 src/sys/arch/i386/i386/vector.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/i386/i386/spl.S diff -u src/sys/arch/i386/i386/spl.S:1.50.4.2 src/sys/arch/i386/i386/spl.S:1.50.4.3 --- src/sys/arch/i386/i386/spl.S:1.50.4.2 Sat Apr 11 10:11:31 2020 +++ src/sys/arch/i386/i386/spl.S Sat Apr 11 12:01:42 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: spl.S,v 1.50.4.2 2020/04/11 10:11:31 bouyer Exp $ */ +/* $NetBSD: spl.S,v 1.50.4.3 2020/04/11 12:01:42 bouyer Exp $ */ /* * Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <machine/asm.h> -__KERNEL_RCSID(0, "$NetBSD: spl.S,v 1.50.4.2 2020/04/11 10:11:31 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: spl.S,v 1.50.4.3 2020/04/11 12:01:42 bouyer Exp $"); #include "opt_ddb.h" #include "opt_spldebug.h" @@ -236,7 +236,7 @@ IDTVEC(spllower) #endif 3: movl %ebx,CPUVAR(ILEVEL) -#ifdef XEN +#ifdef XENPV STIC(%eax) jz 4f call _C_LABEL(stipending) @@ -260,7 +260,7 @@ IDTVEC(spllower) IDTVEC_END(spllower) /* - * Handle return from interrupt after device handler finishes. + * Xdoreti: Handle return from interrupt after device handler finishes. * * Important registers: * ebx - cpl to restore @@ -270,10 +270,8 @@ IDTVEC_END(spllower) * called with interrupt disabled. */ IDTVEC(doreti) -#ifndef XENPV IDEPTH_DECR popl %ebx /* get previous priority */ -#endif .Ldoreti_resume_stic: movl $.Ldoreti_resume,%esi /* address to resume loop at */ .Ldoreti_resume: @@ -292,7 +290,6 @@ IDTVEC(doreti) #endif /* XENPV */ #endif /* defined(DEBUG) */ -#if !defined(XENPV) movl %ebx,%eax movl CPUVAR(IUNMASK)(,%eax,4),%eax andl CPUVAR(IPENDING),%eax @@ -301,7 +298,6 @@ IDTVEC(doreti) btrl %eax,CPUVAR(IPENDING) movl CPUVAR(ISOURCES)(,%eax, 4),%eax jmp *IS_RESUME(%eax) -#endif 2: #if defined(XEN) movl %ebx,%eax @@ -340,7 +336,7 @@ END(doreti_checkast) jnz 9f HANDLE_DEFERRED_FPU 6: -#ifdef XEN +#ifdef XENPV STIC(%eax) jz 4f call _C_LABEL(stipending) Index: src/sys/arch/i386/i386/vector.S diff -u src/sys/arch/i386/i386/vector.S:1.85.6.1 src/sys/arch/i386/i386/vector.S:1.85.6.2 --- src/sys/arch/i386/i386/vector.S:1.85.6.1 Fri Apr 10 14:42:00 2020 +++ src/sys/arch/i386/i386/vector.S Sat Apr 11 12:01:42 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: vector.S,v 1.85.6.1 2020/04/10 14:42:00 bouyer Exp $ */ +/* $NetBSD: vector.S,v 1.85.6.2 2020/04/11 12:01:42 bouyer Exp $ */ /* * Copyright 2002 (c) Wasabi Systems, Inc. @@ -65,7 +65,7 @@ */ #include <machine/asm.h> -__KERNEL_RCSID(0, "$NetBSD: vector.S,v 1.85.6.1 2020/04/10 14:42:00 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vector.S,v 1.85.6.2 2020/04/11 12:01:42 bouyer Exp $"); #include "opt_ddb.h" #include "opt_multiprocessor.h" @@ -940,38 +940,6 @@ END(x2apic_level_stubs) #if defined(XEN) #define voidop(num) -#ifdef XENPV -#define XENINTRSTUB(name, num, early_ack, late_ack, mask, unmask, level_mask) \ -IDTVEC(recurse_ ## name ## num) ;\ - INTR_RECURSE_HWFRAME ;\ - subl $4,%esp ;\ - pushl $T_ASTFLT /* trap # for doing ASTs */ ;\ - INTRENTRY ;\ - movl $_C_LABEL(Xdoreti), %esi; /* we now have a trap frame, so loop using doreti instead */ ;\ -IDTVEC(resume_ ## name ## num) \ - movl $IREENT_MAGIC,TF_ERR(%esp) ;\ - pushl %ebx ;\ - movl CPUVAR(XSOURCES) + (num) * 4,%ebp ;\ - movl $num,CPUVAR(ILEVEL) ;\ - IDEPTH_INCR /* leaves old %esp on stack */ ;\ - STI(%eax) ;\ - movl IS_HANDLERS(%ebp),%ebx ;\ -6: \ - pushl IH_ARG(%ebx) ;\ - call *IH_FUN(%ebx) /* call it */ ;\ - addl $4,%esp /* toss the arg */ ;\ - movl IH_NEXT(%ebx),%ebx /* next handler in chain */ ;\ - testl %ebx,%ebx ;\ - jnz 6b ;\ - \ - CLI(%eax) ;\ - unmask(num) /* unmask it in hardware */ ;\ - late_ack(num) ;\ - IDEPTH_DECR ;\ - popl %ebx ;\ - jmp *%esi /* lower spl and do ASTs */ ;\ - -#else /* XENPV */ #define XENINTRSTUB(name, num, early_ack, late_ack, mask, unmask, level_mask) \ IDTVEC(recurse_ ## name ## num) ;\ INTR_RECURSE_HWFRAME ;\ @@ -999,8 +967,6 @@ IDTVEC(resume_ ## name ## num) \ late_ack(num) ;\ jmp _C_LABEL(Xdoreti) /* lower spl and do ASTs */ ;\ -#endif /* XENPV */ - /* * Just unmasking the event isn't enough, we also need to * reassert the event pending bit if needed. For now just call @@ -1110,80 +1076,20 @@ END(xenev_stubs) * activation and restart the handler using the previous one. */ ENTRY(hypervisor_callback) - pushl $0 /* dummy error code */ - pushl $T_ASTFLT - INTRENTRY - movl TF_EIP(%esp),%eax - cmpl $scrit,%eax - jb 11f - cmpl $ecrit,%eax - jb critical_region_fixup -11: pushl CPUVAR(ILEVEL) - push %esp - call do_hypervisor_callback - add $8,%esp - xorl %eax,%eax - movb TF_CS(%esp),%cl - test $CHK_UPL,%cl /* slow return to ring 2 or 3 */ - je safesti - movl CPUVAR(ILEVEL),%ebx - jmp doreti_checkast -safesti: - movl CPUVAR(VCPU),%esi - XEN_UNBLOCK_EVENTS(%esi) /* reenable event callbacks */ -scrit: /**** START OF CRITICAL REGION ****/ - XEN_TEST_PENDING(%esi) - jnz 14f /* process more events if necessary... */ - INTRFASTEXIT -critiret: -14: XEN_BLOCK_EVENTS(%esi) - jmp 11b -ecrit: /**** END OF CRITICAL REGION ****/ -/* - * [How we do the fixup]. We want to merge the current stack frame with the - * just-interrupted frame. How we do this depends on where in the critical - * region the interrupted handler was executing, and so how many saved - * registers are in each frame. We do this quickly using the lookup table - * 'critical_fixup_table'. For each byte offset in the critical region, it - * provides the number of bytes which have already been popped from the - * interrupted stack frame. - */ -critical_region_fixup: - cmpl $(critiret-1),%eax /* eip points to iret? */ - jne 1f - movl $(TF_PUSHSIZE+0x8),%eax - jmp 2f -1: xorl %eax,%eax -2: - /* %eax contains num bytes popped */ - mov %esp,%esi - add %eax,%esi /* %esi points at end of src region */ - mov %esp,%edi - add $(TF_PUSHSIZE+0x8+0xC),%edi /* %edi points at end of dst region */ - mov %eax,%ecx - shr $2,%ecx /* convert words to bytes */ - je 16f /* skip loop if nothing to copy */ -15: subl $4,%esi /* pre-decrementing copy loop */ - subl $4,%edi - movl (%esi),%eax - movl %eax,(%edi) - loop 15b -16: movl %edi,%esp /* final %edi is top of merged stack */ - jmp 11b -END(hypervisor_callback) - IDTVEC(hypervisor_pvhvm_callback) pushl $0 /* dummy error code */ pushl $T_ASTFLT INTRENTRY + pushl CPUVAR(ILEVEL) push %esp call do_hypervisor_callback add $4,%esp - push CPUVAR(ILEVEL) IDEPTH_INCR - cli + CLI(%eax) jmp _C_LABEL(Xdoreti) IDTVEC_END(hypervisor_pvhvm_callback) +END(hypervisor_callback) + #endif /* XEN */ #ifdef XENPV /*