Module Name:    src
Committed By:   thorpej
Date:           Sun Jan 14 22:34:55 UTC 2024

Modified Files:
        src/sys/arch/sun2/sun2: genassym.cf locore.s
        src/sys/arch/sun3/sun3: genassym.cf locore.s
        src/sys/arch/sun3/sun3x: genassym.cf locore.s
        src/sys/arch/sun68k/conf: files.sun68k
        src/sys/arch/sun68k/include: intr.h types.h vectors.h
Removed Files:
        src/sys/arch/sun68k/sun68k: isr.c

Log Message:
Switch the sun68k platforms over to the common m68k interrupt dispatch code.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/sun2/sun2/genassym.cf
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/sun2/sun2/locore.s
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/sun3/sun3/genassym.cf
cvs rdiff -u -r1.105 -r1.106 src/sys/arch/sun3/sun3/locore.s
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/sun3/sun3x/genassym.cf
cvs rdiff -u -r1.73 -r1.74 src/sys/arch/sun3/sun3x/locore.s
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/sun68k/conf/files.sun68k
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/sun68k/include/intr.h
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/sun68k/include/types.h \
    src/sys/arch/sun68k/include/vectors.h
cvs rdiff -u -r1.31 -r0 src/sys/arch/sun68k/sun68k/isr.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/sun2/sun2/genassym.cf
diff -u src/sys/arch/sun2/sun2/genassym.cf:1.15 src/sys/arch/sun2/sun2/genassym.cf:1.16
--- src/sys/arch/sun2/sun2/genassym.cf:1.15	Wed Dec 27 17:35:36 2023
+++ src/sys/arch/sun2/sun2/genassym.cf	Sun Jan 14 22:34:54 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.15 2023/12/27 17:35:36 thorpej Exp $
+#	$NetBSD: genassym.cf,v 1.16 2024/01/14 22:34:54 thorpej Exp $
 
 #
 # Copyright (c) 1982, 1990, 1993
@@ -93,6 +93,9 @@ include <dev/ic/am9513reg.h>
 # XXX: for copy.s
 define	M68010			1
 
+# for m68k_intr.c / m68k_intr_stubs.s
+define	__HAVE_M68K_INTR_VECTORED	1
+
 # bus error stuff
 define	BUSERR_REG			BUSERR_REG
 define	BUSERR_PROTERR			BUSERR_PROTERR

Index: src/sys/arch/sun2/sun2/locore.s
diff -u src/sys/arch/sun2/sun2/locore.s:1.33 src/sys/arch/sun2/sun2/locore.s:1.34
--- src/sys/arch/sun2/sun2/locore.s:1.33	Sat Jan 13 00:21:51 2024
+++ src/sys/arch/sun2/sun2/locore.s	Sun Jan 14 22:34:54 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.33 2024/01/13 00:21:51 thorpej Exp $	*/
+/*	$NetBSD: locore.s,v 1.34 2024/01/14 22:34:54 thorpej Exp $	*/
 
 /*
  * Copyright (c) 1980, 1990, 1993
@@ -399,22 +399,6 @@ Lbrkpt2:
  *   %d0,%d1,%a0,%a1, sr, pc, vo
  */
 
-/*
- * This is the common auto-vector interrupt handler,
- * for which the CPU provides the vector=0x18+level.
- * These are installed in the interrupt vector table.
- */
-#ifdef __ELF__
-	.align	4
-#else
-	.align	2
-#endif
-GLOBAL(_isr_autovec)
-	INTERRUPT_SAVEREG
-	jbsr	_C_LABEL(isr_autovec)
-	INTERRUPT_RESTOREREG
-	jra	_ASM_LABEL(rei)
-
 /* clock: see clock.c */
 #ifdef __ELF__
 	.align	4
@@ -427,18 +411,6 @@ GLOBAL(_isr_clock)
 	INTERRUPT_RESTOREREG
 	jra	_ASM_LABEL(rei)
 
-| Handler for all vectored interrupts (i.e. VME interrupts)
-#ifdef __ELF__
-	.align	4
-#else
-	.align	2
-#endif
-GLOBAL(_isr_vectored)
-	INTERRUPT_SAVEREG
-	jbsr	_C_LABEL(isr_vectored)
-	INTERRUPT_RESTOREREG
-	jra	_ASM_LABEL(rei)
-
 /* interrupt counters (needed by vmstat) */
 GLOBAL(intrnames)
 	.asciz	"spur"	| 0

Index: src/sys/arch/sun3/sun3/genassym.cf
diff -u src/sys/arch/sun3/sun3/genassym.cf:1.20 src/sys/arch/sun3/sun3/genassym.cf:1.21
--- src/sys/arch/sun3/sun3/genassym.cf:1.20	Wed Dec 27 17:35:37 2023
+++ src/sys/arch/sun3/sun3/genassym.cf	Sun Jan 14 22:34:54 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.20 2023/12/27 17:35:37 thorpej Exp $
+#	$NetBSD: genassym.cf,v 1.21 2024/01/14 22:34:54 thorpej Exp $
 
 #
 # Copyright (c) 1982, 1990, 1993
@@ -93,6 +93,9 @@ include <sun3/sun3/enable.h>
 # XXX: for copy.s
 define	M68020			1
 
+# for m68k_intr.c / m68k_intr_stubs.s
+define	__HAVE_M68K_INTR_VECTORED	1
+
 # 68k isms
 define	PSL_LOWIPL			PSL_LOWIPL
 define	PSL_HIGHIPL			PSL_HIGHIPL

Index: src/sys/arch/sun3/sun3/locore.s
diff -u src/sys/arch/sun3/sun3/locore.s:1.105 src/sys/arch/sun3/sun3/locore.s:1.106
--- src/sys/arch/sun3/sun3/locore.s:1.105	Sat Jan 13 00:21:51 2024
+++ src/sys/arch/sun3/sun3/locore.s	Sun Jan 14 22:34:54 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.105 2024/01/13 00:21:51 thorpej Exp $	*/
+/*	$NetBSD: locore.s,v 1.106 2024/01/14 22:34:54 thorpej Exp $	*/
 
 /*
  * Copyright (c) 1980, 1990, 1993
@@ -445,22 +445,6 @@ Lbrkpt2:
  *   %d0,%d1,%a0,%a1, sr, pc, vo
  */
 
-/*
- * This is the common auto-vector interrupt handler,
- * for which the CPU provides the vector=0x18+level.
- * These are installed in the interrupt vector table.
- */
-#ifdef __ELF__
-	.align	4
-#else
-	.align	2
-#endif
-GLOBAL(_isr_autovec)
-	INTERRUPT_SAVEREG
-	jbsr	_C_LABEL(isr_autovec)
-	INTERRUPT_RESTOREREG
-	jra	_ASM_LABEL(rei)
-
 /* clock: see clock.c */
 #ifdef __ELF__
 	.align	4
@@ -473,18 +457,6 @@ GLOBAL(_isr_clock)
 	INTERRUPT_RESTOREREG
 	jra	_ASM_LABEL(rei)
 
-| Handler for all vectored interrupts (i.e. VME interrupts)
-#ifdef __ELF__
-	.align	4
-#else
-	.align	2
-#endif
-GLOBAL(_isr_vectored)
-	INTERRUPT_SAVEREG
-	jbsr	_C_LABEL(isr_vectored)
-	INTERRUPT_RESTOREREG
-	jra	_ASM_LABEL(rei)
-
 /* interrupt counters (needed by vmstat) */
 GLOBAL(intrnames)
 	.asciz	"spur"	| 0

Index: src/sys/arch/sun3/sun3x/genassym.cf
diff -u src/sys/arch/sun3/sun3x/genassym.cf:1.17 src/sys/arch/sun3/sun3x/genassym.cf:1.18
--- src/sys/arch/sun3/sun3x/genassym.cf:1.17	Wed Dec 27 17:35:37 2023
+++ src/sys/arch/sun3/sun3x/genassym.cf	Sun Jan 14 22:34:54 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.17 2023/12/27 17:35:37 thorpej Exp $
+#	$NetBSD: genassym.cf,v 1.18 2024/01/14 22:34:54 thorpej Exp $
 
 #
 # Copyright (c) 1982, 1990, 1993
@@ -92,6 +92,9 @@ include <sun3/sun3x/enable.h>
 # XXX: for copy.s
 define	M68030			1
 
+# for m68k_intr.c / m68k_intr_stubs.s
+define	__HAVE_M68K_INTR_VECTORED	1
+
 # bus error stuff XXX
 # define	BUSERR_REG			BUSERR_REG
 # define	BUSERR_MMU			BUSERR_MMU

Index: src/sys/arch/sun3/sun3x/locore.s
diff -u src/sys/arch/sun3/sun3x/locore.s:1.73 src/sys/arch/sun3/sun3x/locore.s:1.74
--- src/sys/arch/sun3/sun3x/locore.s:1.73	Sat Jan 13 00:21:51 2024
+++ src/sys/arch/sun3/sun3x/locore.s	Sun Jan 14 22:34:54 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.73 2024/01/13 00:21:51 thorpej Exp $	*/
+/*	$NetBSD: locore.s,v 1.74 2024/01/14 22:34:54 thorpej Exp $	*/
 
 /*
  * Copyright (c) 1988 University of Utah.
@@ -430,22 +430,6 @@ Lbrkpt2:
  *   %d0,%d1,%a0,%a1, sr, pc, vo
  */
 
-/*
- * This is the common auto-vector interrupt handler,
- * for which the CPU provides the vector=0x18+level.
- * These are installed in the interrupt vector table.
- */
-#ifdef __ELF__
-	.align	4
-#else
-	.align	2
-#endif
-GLOBAL(_isr_autovec)
-	INTERRUPT_SAVEREG
-	jbsr	_C_LABEL(isr_autovec)
-	INTERRUPT_RESTOREREG
-	jra	_ASM_LABEL(rei)
-
 /* clock: see clock.c */
 #ifdef __ELF__
 	.align	4
@@ -458,18 +442,6 @@ GLOBAL(_isr_clock)
 	INTERRUPT_RESTOREREG
 	jra	_ASM_LABEL(rei)
 
-| Handler for all vectored interrupts (i.e. VME interrupts)
-#ifdef __ELF__
-	.align	4
-#else
-	.align	2
-#endif
-GLOBAL(_isr_vectored)
-	INTERRUPT_SAVEREG
-	jbsr	_C_LABEL(isr_vectored)
-	INTERRUPT_RESTOREREG
-	jra	_ASM_LABEL(rei)
-
 /* interrupt counters (needed by vmstat) */
 GLOBAL(intrnames)
 	.asciz	"spur"	| 0

Index: src/sys/arch/sun68k/conf/files.sun68k
diff -u src/sys/arch/sun68k/conf/files.sun68k:1.6 src/sys/arch/sun68k/conf/files.sun68k:1.7
--- src/sys/arch/sun68k/conf/files.sun68k:1.6	Sat Jan 13 18:51:38 2024
+++ src/sys/arch/sun68k/conf/files.sun68k	Sun Jan 14 22:34:54 2024
@@ -1,4 +1,4 @@
-#	$NetBSD: files.sun68k,v 1.6 2024/01/13 18:51:38 thorpej Exp $
+#	$NetBSD: files.sun68k,v 1.7 2024/01/14 22:34:54 thorpej Exp $
 
 #
 # common sun68k configuration info
@@ -8,11 +8,12 @@
 file arch/sun68k/sun68k/autoconf.c		_sun2_	# XXX not yet merged
 file arch/sun68k/sun68k/bus.c
 file arch/sun68k/sun68k/ctrlsp.S		!_sun3x_
-file arch/sun68k/sun68k/isr.c
 file arch/sun68k/sun68k/stub.c
 
 file arch/m68k/m68k/kgdb_machdep.c 		kgdb
 file arch/m68k/m68k/procfs_machdep.c		procfs
+file arch/m68k/m68k/m68k_intr.c
+file arch/m68k/m68k/m68k_intr_stubs.s
 file arch/m68k/m68k/vectors.c
 file arch/m68k/m68k/vm_machdep.c
 

Index: src/sys/arch/sun68k/include/intr.h
diff -u src/sys/arch/sun68k/include/intr.h:1.23 src/sys/arch/sun68k/include/intr.h:1.24
--- src/sys/arch/sun68k/include/intr.h:1.23	Sun Jan 14 17:51:16 2024
+++ src/sys/arch/sun68k/include/intr.h	Sun Jan 14 22:34:54 2024
@@ -1,10 +1,12 @@
-/*	$NetBSD: intr.h,v 1.23 2024/01/14 17:51:16 thorpej Exp $	*/
+/*	$NetBSD: intr.h,v 1.24 2024/01/14 22:34:54 thorpej Exp $	*/
 
-/*
- * Copyright (c) 2001 Matt Fredette.
- * Copyright (c) 1998 Matt Thomas.
+/*-
+ * Copyright (c) 2024 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe.
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -13,41 +15,35 @@
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. The name of the company nor the names of the authors may be used to
- *    endorse or promote products derived from this software without specific
- *    prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #ifndef _SUN68K_INTR_H_
 #define _SUN68K_INTR_H_
 
-#include <sys/queue.h>
 #include <m68k/psl.h>
 
-/*
- * Interrupt levels.
- */
-#define	IPL_NONE	0
-#define	IPL_SOFTCLOCK	1
-#define	IPL_SOFTBIO	2
-#define	IPL_SOFTNET	3
-#define	IPL_SOFTSERIAL	4
-#define	IPL_VM		5
-#define	IPL_SCHED	6
-#define	IPL_HIGH	7
-#define	NIPL		8
+#define	MACHINE_PSL_IPL_SOFTCLOCK	PSL_IPL1
+#define	MACHINE_PSL_IPL_SOFTBIO		PSL_IPL1
+#define	MACHINE_PSL_IPL_SOFTNET		PSL_IPL1
+#define	MACHINE_PSL_IPL_SOFTSERIAL	PSL_IPL3
+#define	MACHINE_PSL_IPL_VM		PSL_IPL4
+#define	MACHINE_PSL_IPL_SCHED		PSL_IPL7
+
+/* Zilog Serial hardware interrupts (hard-wired at 6) */
+#define splzs()		splserial()	/* aliased to splhigh() */
+#define	IPL_ZS		IPL_SERIAL
 
 #define _IPL_SOFT_LEVEL1	1
 #define _IPL_SOFT_LEVEL2	2
@@ -55,89 +51,33 @@
 #define _IPL_SOFT_LEVEL_MIN	1
 #define _IPL_SOFT_LEVEL_MAX	3
 
-#if defined(_KERNEL) || defined(_KMEMUSER)
-typedef struct {
-	uint16_t _psl;
-} ipl_cookie_t;
-#endif
+#include <m68k/intr.h>
 
 #ifdef _KERNEL
 
-extern int idepth;
-
-static inline bool    
-cpu_intr_p(void)
-{
-
-	return idepth != 0;
-}       
-        
-extern const uint16_t ipl2psl_table[NIPL];
+/*
+ * Aliases for the legacy sun68k ISR routines.
+ */
 
-typedef int ipl_t;
+typedef int (*isr_func_t)(void *);
 
-static inline ipl_cookie_t
-makeiplcookie(ipl_t ipl)
+static inline void
+isr_add_autovect(isr_func_t func, void *arg, int ipl)
 {
-
-	return (ipl_cookie_t){._psl = ipl2psl_table[ipl]};
+	/* XXX leaks interrupt handle. */
+	m68k_intr_establish(func, arg, (void *)0, 0, ipl, 0, 0);
 }
 
-static inline int
-splraiseipl(ipl_cookie_t icookie)
+static inline void
+isr_add_vectored(isr_func_t func, void *arg, int ipl, int vec)
 {
-
-	return _splraise(icookie._psl);
+	/* XXX leaks interrupt handle. */
+	m68k_intr_establish(func, arg, (void *)0, vec, ipl, 0, 0);
 }
 
-/* These connect interrupt handlers. */
-typedef int (*isr_func_t)(void *);
-void isr_add_autovect(isr_func_t, void *, int);
-void isr_add_vectored(isr_func_t, void *, int, int);
-
-/*
- * Define inline functions for PSL manipulation.
- * These are as close to macros as one can get.
- * When not optimizing gcc will call the locore.s
- * functions by the same names, so breakpoints on
- * these functions will work normally, etc.
- * (See the GCC extensions info document.)
- */
-
-/*
- * The rest of this is sun68k specific, because other ports may
- * need to do special things in spl0() (i.e. simulate SIR).
- * Suns have a REAL interrupt register, so spl0() and splx(s)
- * have no need to check for any simulated interrupts, etc.
- */
-
-#define spl0()  _spl0()		/* we have real software interrupts */
-#define splx(x)	_spl(x)
-
-/* IPL used by soft interrupts: netintr(), softclock() */
-#define splsoftclock()  splraise1()
-#define splsoftbio()    splraise1()
-#define splsoftnet()    splraise1()
-#define	splsoftserial()	splraise3()
-
-/*
- * Note that the VM code runs at spl7 during kernel
- * initialization, and later at spl0, so we have to 
- * use splraise to avoid enabling interrupts early.
- */
-#define splvm()         splraise4()
-
-/* Zilog Serial hardware interrupts (hard-wired at 6) */
-#define splzs()		splserial()
-#define	IPL_ZS		IPL_SERIAL
-
-/* Block out all interrupts (except NMI of course). */
-#define splhigh()       spl7()
-#define splsched()      spl7()
-
 /* This returns true iff the spl given is spl0. */
 #define	is_spl0(s)	(((s) & PSL_IPL7) == 0)
 
-#endif	/* _KERNEL */
+#endif /* _KERNEL */
 
 #endif	/* _SUN68K_INTR_H */

Index: src/sys/arch/sun68k/include/types.h
diff -u src/sys/arch/sun68k/include/types.h:1.1 src/sys/arch/sun68k/include/types.h:1.2
--- src/sys/arch/sun68k/include/types.h:1.1	Sun Jan 14 18:22:02 2024
+++ src/sys/arch/sun68k/include/types.h	Sun Jan 14 22:34:54 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: types.h,v 1.1 2024/01/14 18:22:02 thorpej Exp $	*/
+/*	$NetBSD: types.h,v 1.2 2024/01/14 22:34:54 thorpej Exp $	*/
 
 #include <m68k/types.h>
 
@@ -8,3 +8,4 @@
 #define	__HAVE_MM_MD_MMAP
 #define	__HAVE_MM_MD_READWRITE
 #define	__HAVE_NO_PMAP_STATS
+#define	__HAVE_M68K_INTR_VECTORED
Index: src/sys/arch/sun68k/include/vectors.h
diff -u src/sys/arch/sun68k/include/vectors.h:1.1 src/sys/arch/sun68k/include/vectors.h:1.2
--- src/sys/arch/sun68k/include/vectors.h:1.1	Sat Jan 13 18:51:38 2024
+++ src/sys/arch/sun68k/include/vectors.h	Sun Jan 14 22:34:54 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: vectors.h,v 1.1 2024/01/13 18:51:38 thorpej Exp $	*/
+/*	$NetBSD: vectors.h,v 1.2 2024/01/14 22:34:54 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 1996, 2024 The NetBSD Foundation, Inc.
@@ -42,14 +42,14 @@
 #define	MACHINE_BUSERR_HANDLER	buserr
 #define	MACHINE_ADDRERR_HANDLER	addrerr
 
-#define	MACHINE_AV0_HANDLER	_isr_autovec
-#define	MACHINE_AV1_HANDLER	_isr_autovec
-#define	MACHINE_AV2_HANDLER	_isr_autovec
-#define	MACHINE_AV3_HANDLER	_isr_autovec
-#define	MACHINE_AV4_HANDLER	_isr_autovec
-#define	MACHINE_AV5_HANDLER	_isr_autovec
-#define	MACHINE_AV6_HANDLER	_isr_autovec
-#define	MACHINE_AV7_HANDLER	_isr_autovec
+#define	MACHINE_AV0_HANDLER	intrstub_autovec
+#define	MACHINE_AV1_HANDLER	intrstub_autovec
+#define	MACHINE_AV2_HANDLER	intrstub_autovec
+#define	MACHINE_AV3_HANDLER	intrstub_autovec
+#define	MACHINE_AV4_HANDLER	intrstub_autovec
+#define	MACHINE_AV5_HANDLER	intrstub_autovec
+#define	MACHINE_AV6_HANDLER	intrstub_autovec
+#define	MACHINE_AV7_HANDLER	intrstub_autovec
 
 #endif /* _KERNEL */
 

Reply via email to