Module Name: src Committed By: cherry Date: Tue Feb 12 08:04:53 UTC 2019
Modified Files: src/sys/arch/xen/include: xenfunc.h src/sys/arch/xen/x86: xen_intr.c Log Message: Move xen event related code which interfaces with the NetBSD interrupt subsystem into a separate namespace where it can co-exist with the native equivalent in PVHVM mode. On PV, we alias and export the native symbols - this means that although the namespace is different, the semantics must be identical. Eg: xen_intr_establish_xname() vs. intr_establish_xname(). The specific functions we need in PVHVM are: - spllower, xen_spllower (for native as well as XEN event spl despatch/defer) - xen_disable_intr()/xen_enable_intr() , x86_disable_intr()/x86_enable_intr() - xen_read_psl()/xen_write_psl(), x86_read_psl()/x86_write_psl() - intr_establish() et. al, xen_intr_establish() et. al. This gives us the ability to manage Paravirtualised drivers such as xbd(4) as well as fully emulated ones such as wd(4)., for eg To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/arch/xen/include/xenfunc.h cvs rdiff -u -r1.13 -r1.14 src/sys/arch/xen/x86/xen_intr.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/xen/include/xenfunc.h diff -u src/sys/arch/xen/include/xenfunc.h:1.16 src/sys/arch/xen/include/xenfunc.h:1.17 --- src/sys/arch/xen/include/xenfunc.h:1.16 Thu Jul 26 15:46:09 2018 +++ src/sys/arch/xen/include/xenfunc.h Tue Feb 12 08:04:53 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: xenfunc.h,v 1.16 2018/07/26 15:46:09 maxv Exp $ */ +/* $NetBSD: xenfunc.h,v 1.17 2019/02/12 08:04:53 cherry Exp $ */ /* * @@ -36,5 +36,10 @@ #include <xen/xenpmap.h> #include <machine/pte.h> +void xen_disable_intr(void); +void xen_enable_intr(void); +u_long xen_read_psl(void); +void xen_write_psl(u_long); + void xen_set_ldt(vaddr_t, uint32_t); #endif /* _XEN_XENFUNC_H_ */ Index: src/sys/arch/xen/x86/xen_intr.c diff -u src/sys/arch/xen/x86/xen_intr.c:1.13 src/sys/arch/xen/x86/xen_intr.c:1.14 --- src/sys/arch/xen/x86/xen_intr.c:1.13 Wed Dec 26 11:12:57 2018 +++ src/sys/arch/xen/x86/xen_intr.c Tue Feb 12 08:04:53 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: xen_intr.c,v 1.13 2018/12/26 11:12:57 cherry Exp $ */ +/* $NetBSD: xen_intr.c,v 1.14 2019/02/12 08:04:53 cherry Exp $ */ /*- * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xen_intr.c,v 1.13 2018/12/26 11:12:57 cherry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xen_intr.c,v 1.14 2019/02/12 08:04:53 cherry Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -66,17 +66,14 @@ __KERNEL_RCSID(0, "$NetBSD: xen_intr.c,v #include <dev/pci/ppbreg.h> #endif -void xen_disable_intr(void); -void xen_enable_intr(void); -u_long xen_read_psl(void); -void xen_write_psl(u_long); - /* * Restore a value to cpl (unmasking interrupts). If any unmasked * interrupts are pending, call Xspllower() to process them. */ +void xen_spllower(int nlevel); + void -spllower(int nlevel) +xen_spllower(int nlevel) { struct cpu_info *ci = curcpu(); uint32_t xmask; @@ -186,7 +183,7 @@ xen_intr_establish_xname(int legacy_irq, return rih; } /* Else we assume pintr */ -#if NPCI > 0 || NISA > 0 +#if (NPCI > 0 || NISA > 0) && defined(XENPV) /* XXX: support PVHVM pirq */ struct pintrhand *pih; int gsi; int vector, evtchn; @@ -306,8 +303,9 @@ redzone_const_or_zero(int x) } #endif +void xen_cpu_intr_init(struct cpu_info *); void -cpu_intr_init(struct cpu_info *ci) +xen_cpu_intr_init(struct cpu_info *ci) { int i; /* XXX: duplicate */ @@ -393,8 +391,10 @@ legacy_intr_string(int ih, char *buf, si return buf; } +const char * xintr_string(intr_handle_t ih, char *buf, size_t len); + const char * -intr_string(intr_handle_t ih, char *buf, size_t len) +xintr_string(intr_handle_t ih, char *buf, size_t len) { #if NIOAPIC > 0 struct ioapic_softc *pic; @@ -420,7 +420,7 @@ intr_string(intr_handle_t ih, char *buf, snprintf(buf, len, "irq %d", APIC_IRQ_LEGACY_IRQ(ih)); #elif NLAPIC > 0 - snprintf(buf, len, "irq %d" APIC_IRQ_LEGACY_IRQ(ih)); + snprintf(buf, len, "irq %d", APIC_IRQ_LEGACY_IRQ(ih)); #else snprintf(buf, len, "irq %d", (int) ih); #endif @@ -432,8 +432,11 @@ intr_string(intr_handle_t ih, char *buf, * Create an interrupt id such as "ioapic0 pin 9". This interrupt id is used * by MI code and intrctl(8). */ +const char * xen_intr_create_intrid(int legacy_irq, struct pic *pic, + int pin, char *buf, size_t len); + const char * -intr_create_intrid(int legacy_irq, struct pic *pic, int pin, char *buf, size_t len) +xen_intr_create_intrid(int legacy_irq, struct pic *pic, int pin, char *buf, size_t len) { int ih = 0; @@ -487,14 +490,19 @@ intr_create_intrid(int legacy_irq, struc return NULL; /* No pic found! */ } -__weak_alias(x86_disable_intr, xen_disable_intr); -__weak_alias(x86_enable_intr, xen_enable_intr); -__weak_alias(x86_read_psl, xen_read_psl); -__weak_alias(x86_write_psl, xen_write_psl); - -__weak_alias(intr_establish, xen_intr_establish); -__weak_alias(intr_establish_xname, xen_intr_establish_xname); -__weak_alias(intr_disestablish, xen_intr_disestablish); -__weak_alias(cpu_intr_redistribute, xen_cpu_intr_redistribute); -__weak_alias(cpu_intr_count, xen_cpu_intr_count); - +#if !defined(XENPVHVM) +__strong_alias(spllower, xen_spllower); +__strong_alias(x86_disable_intr, xen_disable_intr); +__strong_alias(x86_enable_intr, xen_enable_intr); +__strong_alias(x86_read_psl, xen_read_psl); +__strong_alias(x86_write_psl, xen_write_psl); + +__strong_alias(intr_string, xintr_string); +__strong_alias(intr_create_intrid, xen_intr_create_intrid); +__strong_alias(intr_establish, xen_intr_establish); +__strong_alias(intr_establish_xname, xen_intr_establish_xname); +__strong_alias(intr_disestablish, xen_intr_disestablish); +__strong_alias(cpu_intr_redistribute, xen_cpu_intr_redistribute); +__strong_alias(cpu_intr_count, xen_cpu_intr_count); +__strong_alias(cpu_intr_init, xen_cpu_intr_init); +#endif /* !XENPVHVM */