Module Name:    src
Committed By:   matt
Date:           Sun Feb 28 03:23:06 UTC 2010

Added Files:
        src/sys/arch/mips/mips [matt-nb5-mips64]: spl_stubs.c

Log Message:
We no longer inline the spl indirect calls through mips_splsw.  Instead we
have stubs that do the indirection and then fixup the calls to the stubs to
be calls to the actual routines.


To generate a diff of this commit:
cvs rdiff -u -r0 -r1.1.2.1 src/sys/arch/mips/mips/spl_stubs.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Added files:

Index: src/sys/arch/mips/mips/spl_stubs.c
diff -u /dev/null src/sys/arch/mips/mips/spl_stubs.c:1.1.2.1
--- /dev/null	Sun Feb 28 03:23:06 2010
+++ src/sys/arch/mips/mips/spl_stubs.c	Sun Feb 28 03:23:06 2010
@@ -0,0 +1,238 @@
+/* $NetBSD: spl_stubs.c,v 1.1.2.1 2010/02/28 03:23:06 matt Exp $ */
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Matt Thomas <m...@3am-software.com>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+
+__KERNEL_RCSID(0, "$NetBSD: spl_stubs.c,v 1.1.2.1 2010/02/28 03:23:06 matt Exp $");
+
+#define __INTR_PRIVATE
+
+#include <sys/param.h>
+
+#include <mips/cache.h>
+#include <mips/intr.h>
+#include <mips/locore.h>
+
+int	splhigh(void)		__section(".stub");
+int	splhigh_noprof(void)	__section(".stub");
+int	splsched(void)		__section(".stub");
+int	splvm(void)		__section(".stub");
+int	splsoftserial(void)	__section(".stub");
+int	splsoftnet(void)	__section(".stub");
+int	splsoftbio(void)	__section(".stub");
+int	splsoftclock(void)	__section(".stub");
+int	splraise(int)		__section(".stub");
+void	splx(int)		__section(".stub");
+void	splx_noprof(int)	__section(".stub");
+void	spl0(void)		__section(".stub");
+int	splintr(uint32_t *)	__section(".stub");
+void	_setsoftintr(uint32_t)	__section(".stub");
+void	_clrsoftintr(uint32_t)	__section(".stub");
+
+#define	J_SPLHIGH	0
+int
+splhigh(void)
+{
+	return (*mips_splsw.splsw_splhigh)();
+}
+
+#define	J_SPLHIGH_NOPROF	(J_SPLHIGH+1)
+int
+splhigh_noprof(void)
+{
+	return (*mips_splsw.splsw_splhigh_noprof)();
+}
+
+#define	J_SPLSCHED		(J_SPLHIGH_NOPROF+1)
+int
+splsched(void)
+{
+	return (*mips_splsw.splsw_splsched)();
+}
+
+#define	J_SPLVM			(J_SPLSCHED+1)
+int
+splvm(void)
+{
+	return (*mips_splsw.splsw_splvm)();
+}
+
+#define	J_SPLSOFTSERIAL		(J_SPLVM+1)
+int
+splsoftserial(void)
+{
+	return (*mips_splsw.splsw_splsoftserial)();
+}
+
+#define	J_SPLSOFTNET		(J_SPLSOFTSERIAL+1)
+int
+splsoftnet(void)
+{
+	return (*mips_splsw.splsw_splsoftnet)();
+}
+
+#define	J_SPLSOFTBIO		(J_SPLSOFTNET+1)
+int
+splsoftbio(void)
+{
+	return (*mips_splsw.splsw_splsoftbio)();
+}
+
+#define	J_SPLSOFTCLOCK		(J_SPLSOFTBIO+1)
+int
+splsoftclock(void)
+{
+	return (*mips_splsw.splsw_splsoftclock)();
+}
+
+#define	J_SPL0			(J_SPLSOFTCLOCK+1)
+void
+spl0(void)
+{
+	(*mips_splsw.splsw_spl0)();
+}
+
+#define	J_SPLX			(J_SPL0+1)
+void
+splx(int s)
+{
+	(*mips_splsw.splsw_splx)(s);
+}
+
+#define	J_SPLX_NOPROF		(J_SPLX+1)
+void
+splx_noprof(int s)
+{
+	(*mips_splsw.splsw_splx_noprof)(s);
+}
+
+#define	J_SPLRAISE		(J_SPLX_NOPROF+1)
+int
+splraise(int s)
+{
+        return (*mips_splsw.splsw_splraise)(s);
+}
+
+#define	J_SPLINTR		(J_SPLRAISE+1)
+int
+splintr(uint32_t *p)
+{
+	return (*mips_splsw.splsw_splintr)(p);
+}
+
+#define	J_SETSOFTINTR		(J_SPLINTR+1)
+void
+_setsoftintr(uint32_t m)
+{
+	(*mips_splsw.splsw__setsoftintr)(m);
+}
+
+#define	J_CLRSOFTINTR		(J_SETSOFTINTR+1)
+void
+_clrsoftintr(uint32_t m)
+{
+	(*mips_splsw.splsw__clrsoftintr)(m);
+}
+
+#define	J_SPLMAX		(J_CLRSOFTINTR+1)
+
+#if 0
+#define	offsetofsplsw(x)	(offsetof(struct splsw, x) / sizeof(uint32_t))
+static uint32_t splreal[J_SPLMAX] = {
+	[J_SPLHIGH] =		offsetofsplsw(splsw_splhigh),
+	[J_SPLHIGH_NOPROF] =	offsetofsplsw(splsw_splhigh_noprof),
+	[J_SPLSCHED] =		offsetofsplsw(splsw_splsched),
+	[J_SPLVM] =		offsetofsplsw(splsw_splvm),
+	[J_SPLSOFTSERIAL] =	offsetofsplsw(splsw_splsoftserial),
+	[J_SPLSOFTNET] =	offsetofsplsw(splsw_splsoftnet),
+	[J_SPLSOFTBIO] =	offsetofsplsw(splsw_splsoftbio),
+	[J_SPLSOFTCLOCK] =	offsetofsplsw(splsw_splsoftclock),
+	[J_SPL0] =		offsetofsplsw(splsw_spl0),
+	[J_SPLX] =		offsetofsplsw(splsw_splx),
+	[J_SPLX_NOPROF] =	offsetofsplsw(splsw_splx_noprof),
+	[J_SPLRAISE] =		offsetofsplsw(splsw_splraise),
+	[J_SPLINTR] =		offsetofsplsw(splsw_splintr),
+	[J_SETSOFTINTR] =	offsetofsplsw(splsw_setsoftintr),
+	[J_CLRSOFTINTR] =	offsetofsplsw(splsw_clrsoftintr),
+};
+#endif
+
+void
+fixup_splcalls(void)
+{
+	extern uint32_t _ftext[];
+	extern uint32_t _etext[];
+
+#define	addr2offset(x)	((((uint32_t)(uintptr_t)(x)) << 4) >> 6)
+#define	stuboffset(x)	addr2offset(x)
+	uint32_t splstubs[J_SPLMAX] = {
+		[J_SPLHIGH] =		stuboffset(splhigh),
+		[J_SPLHIGH_NOPROF] =	stuboffset(splhigh_noprof),
+		[J_SPLSCHED] =		stuboffset(splsched),
+		[J_SPLVM] =		stuboffset(splvm),
+		[J_SPLSOFTSERIAL] =	stuboffset(splsoftserial),
+		[J_SPLSOFTNET] =	stuboffset(splsoftnet),
+		[J_SPLSOFTBIO] =	stuboffset(splsoftbio),
+		[J_SPLSOFTCLOCK] =	stuboffset(splsoftclock),
+		[J_SPL0] =		stuboffset(spl0),
+		[J_SPLX] =		stuboffset(splx),
+		[J_SPLX_NOPROF] =	stuboffset(splx_noprof),
+		[J_SPLRAISE] =		stuboffset(splraise),
+		[J_SPLINTR] =		stuboffset(splintr),
+		[J_SETSOFTINTR] =	stuboffset(_setsoftintr),
+		[J_CLRSOFTINTR] =	stuboffset(_clrsoftintr),
+	};
+
+#define	realoffset(x)	addr2offset(mips_splsw.splsw_##x)
+	uint32_t splreal[J_SPLMAX] = {
+		[J_SPLHIGH] =		realoffset(splhigh),
+		[J_SPLHIGH_NOPROF] =	realoffset(splhigh_noprof),
+		[J_SPLSCHED] =		realoffset(splsched),
+		[J_SPLVM] =		realoffset(splvm),
+		[J_SPLSOFTSERIAL] =	realoffset(splsoftserial),
+		[J_SPLSOFTNET] =	realoffset(splsoftnet),
+		[J_SPLSOFTBIO] =	realoffset(splsoftbio),
+		[J_SPLSOFTCLOCK] =	realoffset(splsoftclock),
+		[J_SPL0] =		realoffset(spl0),
+		[J_SPLX] =		realoffset(splx),
+		[J_SPLX_NOPROF] =	realoffset(splx_noprof),
+		[J_SPLRAISE] =		realoffset(splraise),
+		[J_SPLINTR] =		realoffset(splintr),
+		[J_SETSOFTINTR] =	realoffset(_setsoftintr),
+		[J_CLRSOFTINTR] =	realoffset(_clrsoftintr),
+	};
+
+#if 0
+	for (size_t i = 0; i < J_SPLMAX; i++) {
+		splreal[i] = (((uint32_t *)&mips_splsw)[splreal[i]] << 4) >> 6;
+	}
+#endif
+	mips_fixup_stubs(_ftext, _etext, splstubs, splreal, J_SPLMAX);
+}

Reply via email to