Module Name: src Committed By: cherry Date: Wed Feb 13 05:01:58 UTC 2019
Modified Files: src/sys/arch/amd64/amd64: vector.S src/sys/arch/i386/i386: vector.S src/sys/arch/xen/xen: evtchn.c Log Message: In preparation for debut-ing PVHVM mode: - Make the struct intrstub uniform across native and XEN. - Introduce vector callback entrypoints for PVHVM mode. To generate a diff of this commit: cvs rdiff -u -r1.66 -r1.67 src/sys/arch/amd64/amd64/vector.S cvs rdiff -u -r1.80 -r1.81 src/sys/arch/i386/i386/vector.S cvs rdiff -u -r1.83 -r1.84 src/sys/arch/xen/xen/evtchn.c 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/amd64/amd64/vector.S diff -u src/sys/arch/amd64/amd64/vector.S:1.66 src/sys/arch/amd64/amd64/vector.S:1.67 --- src/sys/arch/amd64/amd64/vector.S:1.66 Mon Feb 11 14:59:32 2019 +++ src/sys/arch/amd64/amd64/vector.S Wed Feb 13 05:01:57 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: vector.S,v 1.66 2019/02/11 14:59:32 cherry Exp $ */ +/* $NetBSD: vector.S,v 1.67 2019/02/13 05:01:57 cherry Exp $ */ /* * Copyright (c) 1998, 2007, 2008 The NetBSD Foundation, Inc. @@ -631,19 +631,7 @@ LABEL(name ## _stubs) ; \ INTRSTUB_ENTRY(name ## 31) ; \ END(name ## _stubs) - .section .rodata - -INTRSTUB_ARRAY_16(legacy) - -#if NIOAPIC > 0 -INTRSTUB_ARRAY_32(ioapic_edge) -INTRSTUB_ARRAY_32(ioapic_level) - -INTRSTUB_ARRAY_32(x2apic_edge) -INTRSTUB_ARRAY_32(x2apic_level) -#endif - -#endif /* !defined(XENPV) */ +#endif /* !XENPV */ #if defined(XEN) /* Resume/recurse procedures for spl() */ @@ -715,39 +703,49 @@ XENINTRSTUB(xenev,29,voidop,voidop,voido XENINTRSTUB(xenev,30,voidop,voidop,voidop,hypervisor_asm_unmask,voidop) XENINTRSTUB(xenev,31,voidop,voidop,voidop,hypervisor_asm_unmask,voidop) +/* On Xen, the xenev_stubs are purely for spl entry, since there is no + * vector based mechanism. We however provide the entrypoint to ensure + * that native and Xen struct intrstub ; definitions are uniform. + */ +panicmsg: .ascii "vector Xen event entry path entered." +LABEL(entry_xenev) + movq $panicmsg, %rdi + callq _C_LABEL(panic) +END(entry_xenev) + LABEL(xenev_stubs) - .quad _C_LABEL(Xrecurse_xenev0), _C_LABEL(Xresume_xenev0) - .quad _C_LABEL(Xrecurse_xenev1) ,_C_LABEL(Xresume_xenev1) - .quad _C_LABEL(Xrecurse_xenev2) ,_C_LABEL(Xresume_xenev2) - .quad _C_LABEL(Xrecurse_xenev3) ,_C_LABEL(Xresume_xenev3) - .quad _C_LABEL(Xrecurse_xenev4) ,_C_LABEL(Xresume_xenev4) - .quad _C_LABEL(Xrecurse_xenev5) ,_C_LABEL(Xresume_xenev5) - .quad _C_LABEL(Xrecurse_xenev6) ,_C_LABEL(Xresume_xenev6) - .quad _C_LABEL(Xrecurse_xenev7) ,_C_LABEL(Xresume_xenev7) - .quad _C_LABEL(Xrecurse_xenev8) ,_C_LABEL(Xresume_xenev8) - .quad _C_LABEL(Xrecurse_xenev9) ,_C_LABEL(Xresume_xenev9) - .quad _C_LABEL(Xrecurse_xenev10), _C_LABEL(Xresume_xenev10) - .quad _C_LABEL(Xrecurse_xenev11), _C_LABEL(Xresume_xenev11) - .quad _C_LABEL(Xrecurse_xenev12), _C_LABEL(Xresume_xenev12) - .quad _C_LABEL(Xrecurse_xenev13), _C_LABEL(Xresume_xenev13) - .quad _C_LABEL(Xrecurse_xenev14), _C_LABEL(Xresume_xenev14) - .quad _C_LABEL(Xrecurse_xenev15), _C_LABEL(Xresume_xenev15) - .quad _C_LABEL(Xrecurse_xenev16), _C_LABEL(Xresume_xenev16) - .quad _C_LABEL(Xrecurse_xenev17), _C_LABEL(Xresume_xenev17) - .quad _C_LABEL(Xrecurse_xenev18), _C_LABEL(Xresume_xenev18) - .quad _C_LABEL(Xrecurse_xenev19), _C_LABEL(Xresume_xenev19) - .quad _C_LABEL(Xrecurse_xenev20), _C_LABEL(Xresume_xenev20) - .quad _C_LABEL(Xrecurse_xenev21), _C_LABEL(Xresume_xenev21) - .quad _C_LABEL(Xrecurse_xenev22), _C_LABEL(Xresume_xenev22) - .quad _C_LABEL(Xrecurse_xenev23), _C_LABEL(Xresume_xenev23) - .quad _C_LABEL(Xrecurse_xenev24), _C_LABEL(Xresume_xenev24) - .quad _C_LABEL(Xrecurse_xenev25), _C_LABEL(Xresume_xenev25) - .quad _C_LABEL(Xrecurse_xenev26), _C_LABEL(Xresume_xenev26) - .quad _C_LABEL(Xrecurse_xenev27), _C_LABEL(Xresume_xenev27) - .quad _C_LABEL(Xrecurse_xenev28), _C_LABEL(Xresume_xenev28) - .quad _C_LABEL(Xrecurse_xenev29), _C_LABEL(Xresume_xenev29) - .quad _C_LABEL(Xrecurse_xenev30), _C_LABEL(Xresume_xenev30) - .quad _C_LABEL(Xrecurse_xenev31), _C_LABEL(Xresume_xenev31) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev0), _C_LABEL(Xresume_xenev0) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev1) ,_C_LABEL(Xresume_xenev1) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev2) ,_C_LABEL(Xresume_xenev2) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev3) ,_C_LABEL(Xresume_xenev3) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev4) ,_C_LABEL(Xresume_xenev4) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev5) ,_C_LABEL(Xresume_xenev5) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev6) ,_C_LABEL(Xresume_xenev6) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev7) ,_C_LABEL(Xresume_xenev7) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev8) ,_C_LABEL(Xresume_xenev8) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev9) ,_C_LABEL(Xresume_xenev9) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev10), _C_LABEL(Xresume_xenev10) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev11), _C_LABEL(Xresume_xenev11) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev12), _C_LABEL(Xresume_xenev12) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev13), _C_LABEL(Xresume_xenev13) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev14), _C_LABEL(Xresume_xenev14) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev15), _C_LABEL(Xresume_xenev15) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev16), _C_LABEL(Xresume_xenev16) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev17), _C_LABEL(Xresume_xenev17) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev18), _C_LABEL(Xresume_xenev18) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev19), _C_LABEL(Xresume_xenev19) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev20), _C_LABEL(Xresume_xenev20) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev21), _C_LABEL(Xresume_xenev21) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev22), _C_LABEL(Xresume_xenev22) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev23), _C_LABEL(Xresume_xenev23) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev24), _C_LABEL(Xresume_xenev24) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev25), _C_LABEL(Xresume_xenev25) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev26), _C_LABEL(Xresume_xenev26) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev27), _C_LABEL(Xresume_xenev27) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev28), _C_LABEL(Xresume_xenev28) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev29), _C_LABEL(Xresume_xenev29) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev30), _C_LABEL(Xresume_xenev30) + .quad entry_xenev, _C_LABEL(Xrecurse_xenev31), _C_LABEL(Xresume_xenev31) END(xenev_stubs) /* @@ -759,6 +757,7 @@ ENTRY(hypervisor_callback) movq (%rsp),%rcx movq 8(%rsp),%r11 addq $16,%rsp +IDTVEC(hypervisor_pvhvm_callback) pushq $0 /* Dummy error code */ pushq $T_ASTFLT INTRENTRY @@ -770,8 +769,11 @@ ENTRY(hypervisor_callback) jnz doreti_checkast 1: INTRFASTEXIT +IDTVEC_END(hypervisor_pvhvm_callback) END(hypervisor_callback) +#endif +#ifdef XENPV /* Panic? */ ENTRY(failsafe_callback) movq (%rsp),%rcx @@ -787,4 +789,17 @@ ENTRY(failsafe_callback) /* jmp HYPERVISOR_iret */ END(failsafe_callback) -#endif /* !XEN */ +#else /* XENPV */ + + .section .rodata + +INTRSTUB_ARRAY_16(legacy) + +#if NIOAPIC > 0 +INTRSTUB_ARRAY_32(ioapic_edge) +INTRSTUB_ARRAY_32(ioapic_level) + +INTRSTUB_ARRAY_32(x2apic_edge) +INTRSTUB_ARRAY_32(x2apic_level) +#endif +#endif /* !XENPV */ Index: src/sys/arch/i386/i386/vector.S diff -u src/sys/arch/i386/i386/vector.S:1.80 src/sys/arch/i386/i386/vector.S:1.81 --- src/sys/arch/i386/i386/vector.S:1.80 Mon Feb 11 14:59:32 2019 +++ src/sys/arch/i386/i386/vector.S Wed Feb 13 05:01:58 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: vector.S,v 1.80 2019/02/11 14:59:32 cherry Exp $ */ +/* $NetBSD: vector.S,v 1.81 2019/02/13 05:01:58 cherry Exp $ */ /* * Copyright 2002 (c) Wasabi Systems, Inc. @@ -65,7 +65,7 @@ */ #include <machine/asm.h> -__KERNEL_RCSID(0, "$NetBSD: vector.S,v 1.80 2019/02/11 14:59:32 cherry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vector.S,v 1.81 2019/02/13 05:01:58 cherry Exp $"); #include "opt_ddb.h" #include "opt_multiprocessor.h" @@ -962,40 +962,50 @@ XENINTRSTUB(xenev,29,voidop,voidop,voido XENINTRSTUB(xenev,30,voidop,voidop,voidop,hypervisor_asm_unmask,voidop) XENINTRSTUB(xenev,31,voidop,voidop,voidop,hypervisor_asm_unmask,voidop) +/* On Xen, the xenev_stubs are purely for spl entry, since there is no + * vector based mechanism. We however provide the entrypoint to ensure + * that native and Xen struct intrstub ; definitions are uniform. + */ +panicmsg: .ascii "vector Xen event entry path entered." +LABEL(entry_xenev) + pushl $panicmsg + call _C_LABEL(panic) +END(entry_xenev) + .type _C_LABEL(xenev_stubs), @object LABEL(xenev_stubs) - .long _C_LABEL(Xrecurse_xenev0), _C_LABEL(Xresume_xenev0) - .long _C_LABEL(Xrecurse_xenev1) ,_C_LABEL(Xresume_xenev1) - .long _C_LABEL(Xrecurse_xenev2) ,_C_LABEL(Xresume_xenev2) - .long _C_LABEL(Xrecurse_xenev3) ,_C_LABEL(Xresume_xenev3) - .long _C_LABEL(Xrecurse_xenev4) ,_C_LABEL(Xresume_xenev4) - .long _C_LABEL(Xrecurse_xenev5) ,_C_LABEL(Xresume_xenev5) - .long _C_LABEL(Xrecurse_xenev6) ,_C_LABEL(Xresume_xenev6) - .long _C_LABEL(Xrecurse_xenev7) ,_C_LABEL(Xresume_xenev7) - .long _C_LABEL(Xrecurse_xenev8) ,_C_LABEL(Xresume_xenev8) - .long _C_LABEL(Xrecurse_xenev9) ,_C_LABEL(Xresume_xenev9) - .long _C_LABEL(Xrecurse_xenev10), _C_LABEL(Xresume_xenev10) - .long _C_LABEL(Xrecurse_xenev11), _C_LABEL(Xresume_xenev11) - .long _C_LABEL(Xrecurse_xenev12), _C_LABEL(Xresume_xenev12) - .long _C_LABEL(Xrecurse_xenev13), _C_LABEL(Xresume_xenev13) - .long _C_LABEL(Xrecurse_xenev14), _C_LABEL(Xresume_xenev14) - .long _C_LABEL(Xrecurse_xenev15), _C_LABEL(Xresume_xenev15) - .long _C_LABEL(Xrecurse_xenev16), _C_LABEL(Xresume_xenev16) - .long _C_LABEL(Xrecurse_xenev17), _C_LABEL(Xresume_xenev17) - .long _C_LABEL(Xrecurse_xenev18), _C_LABEL(Xresume_xenev18) - .long _C_LABEL(Xrecurse_xenev19), _C_LABEL(Xresume_xenev19) - .long _C_LABEL(Xrecurse_xenev20), _C_LABEL(Xresume_xenev20) - .long _C_LABEL(Xrecurse_xenev21), _C_LABEL(Xresume_xenev21) - .long _C_LABEL(Xrecurse_xenev22), _C_LABEL(Xresume_xenev22) - .long _C_LABEL(Xrecurse_xenev23), _C_LABEL(Xresume_xenev23) - .long _C_LABEL(Xrecurse_xenev24), _C_LABEL(Xresume_xenev24) - .long _C_LABEL(Xrecurse_xenev25), _C_LABEL(Xresume_xenev25) - .long _C_LABEL(Xrecurse_xenev26), _C_LABEL(Xresume_xenev26) - .long _C_LABEL(Xrecurse_xenev27), _C_LABEL(Xresume_xenev27) - .long _C_LABEL(Xrecurse_xenev28), _C_LABEL(Xresume_xenev28) - .long _C_LABEL(Xrecurse_xenev29), _C_LABEL(Xresume_xenev29) - .long _C_LABEL(Xrecurse_xenev30), _C_LABEL(Xresume_xenev30) - .long _C_LABEL(Xrecurse_xenev31), _C_LABEL(Xresume_xenev31) + .long entry_xenev, _C_LABEL(Xrecurse_xenev0), _C_LABEL(Xresume_xenev0) + .long entry_xenev, _C_LABEL(Xrecurse_xenev1) ,_C_LABEL(Xresume_xenev1) + .long entry_xenev, _C_LABEL(Xrecurse_xenev2) ,_C_LABEL(Xresume_xenev2) + .long entry_xenev, _C_LABEL(Xrecurse_xenev3) ,_C_LABEL(Xresume_xenev3) + .long entry_xenev, _C_LABEL(Xrecurse_xenev4) ,_C_LABEL(Xresume_xenev4) + .long entry_xenev, _C_LABEL(Xrecurse_xenev5) ,_C_LABEL(Xresume_xenev5) + .long entry_xenev, _C_LABEL(Xrecurse_xenev6) ,_C_LABEL(Xresume_xenev6) + .long entry_xenev, _C_LABEL(Xrecurse_xenev7) ,_C_LABEL(Xresume_xenev7) + .long entry_xenev, _C_LABEL(Xrecurse_xenev8) ,_C_LABEL(Xresume_xenev8) + .long entry_xenev, _C_LABEL(Xrecurse_xenev9) ,_C_LABEL(Xresume_xenev9) + .long entry_xenev, _C_LABEL(Xrecurse_xenev10), _C_LABEL(Xresume_xenev10) + .long entry_xenev, _C_LABEL(Xrecurse_xenev11), _C_LABEL(Xresume_xenev11) + .long entry_xenev, _C_LABEL(Xrecurse_xenev12), _C_LABEL(Xresume_xenev12) + .long entry_xenev, _C_LABEL(Xrecurse_xenev13), _C_LABEL(Xresume_xenev13) + .long entry_xenev, _C_LABEL(Xrecurse_xenev14), _C_LABEL(Xresume_xenev14) + .long entry_xenev, _C_LABEL(Xrecurse_xenev15), _C_LABEL(Xresume_xenev15) + .long entry_xenev, _C_LABEL(Xrecurse_xenev16), _C_LABEL(Xresume_xenev16) + .long entry_xenev, _C_LABEL(Xrecurse_xenev17), _C_LABEL(Xresume_xenev17) + .long entry_xenev, _C_LABEL(Xrecurse_xenev18), _C_LABEL(Xresume_xenev18) + .long entry_xenev, _C_LABEL(Xrecurse_xenev19), _C_LABEL(Xresume_xenev19) + .long entry_xenev, _C_LABEL(Xrecurse_xenev20), _C_LABEL(Xresume_xenev20) + .long entry_xenev, _C_LABEL(Xrecurse_xenev21), _C_LABEL(Xresume_xenev21) + .long entry_xenev, _C_LABEL(Xrecurse_xenev22), _C_LABEL(Xresume_xenev22) + .long entry_xenev, _C_LABEL(Xrecurse_xenev23), _C_LABEL(Xresume_xenev23) + .long entry_xenev, _C_LABEL(Xrecurse_xenev24), _C_LABEL(Xresume_xenev24) + .long entry_xenev, _C_LABEL(Xrecurse_xenev25), _C_LABEL(Xresume_xenev25) + .long entry_xenev, _C_LABEL(Xrecurse_xenev26), _C_LABEL(Xresume_xenev26) + .long entry_xenev, _C_LABEL(Xrecurse_xenev27), _C_LABEL(Xresume_xenev27) + .long entry_xenev, _C_LABEL(Xrecurse_xenev28), _C_LABEL(Xresume_xenev28) + .long entry_xenev, _C_LABEL(Xrecurse_xenev29), _C_LABEL(Xresume_xenev29) + .long entry_xenev, _C_LABEL(Xrecurse_xenev30), _C_LABEL(Xresume_xenev30) + .long entry_xenev, _C_LABEL(Xrecurse_xenev31), _C_LABEL(Xresume_xenev31) END(xenev_stubs) #endif /* XEN */ @@ -1018,6 +1028,7 @@ END(xenev_stubs) * activation and restart the handler using the previous one. */ ENTRY(hypervisor_callback) +IDTVEC(hypervisor_pvhvm_callback) pushl $0 /* dummy error code */ pushl $T_ASTFLT INTRENTRY @@ -1078,6 +1089,7 @@ critical_region_fixup: loop 15b 16: movl %edi,%esp /* final %edi is top of merged stack */ jmp 11b +IDTVEC_END(hypervisor_pvhvm_callback) END(hypervisor_callback) Index: src/sys/arch/xen/xen/evtchn.c diff -u src/sys/arch/xen/xen/evtchn.c:1.83 src/sys/arch/xen/xen/evtchn.c:1.84 --- src/sys/arch/xen/xen/evtchn.c:1.83 Tue Dec 25 06:50:12 2018 +++ src/sys/arch/xen/xen/evtchn.c Wed Feb 13 05:01:58 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: evtchn.c,v 1.83 2018/12/25 06:50:12 cherry Exp $ */ +/* $NetBSD: evtchn.c,v 1.84 2019/02/13 05:01:58 cherry Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -54,7 +54,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.83 2018/12/25 06:50:12 cherry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: evtchn.c,v 1.84 2019/02/13 05:01:58 cherry Exp $"); #include "opt_xen.h" #include "isa.h" @@ -943,6 +943,7 @@ event_set_iplhandler(struct cpu_info *ci KM_NOSLEEP); if (ipls == NULL) panic("can't allocate fixed interrupt source"); + ipls->is_recurse = xenev_stubs[level].ist_entry; ipls->is_recurse = xenev_stubs[level].ist_recurse; ipls->is_resume = xenev_stubs[level].ist_resume; ipls->is_handlers = ih;