summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjoerg <joerg@FreeBSD.org>1997-03-28 12:37:44 +0000
committerjoerg <joerg@FreeBSD.org>1997-03-28 12:37:44 +0000
commit2558d1ad635da469c5e629f9012399d8c81b99b7 (patch)
treee78f8f8a4e31231f81ba8819aa4af650ee19c736 /sys
parent4003214ed86b3ab71d144c5278b8cd8cc8bd6d79 (diff)
downloadFreeBSD-src-2558d1ad635da469c5e629f9012399d8c81b99b7.zip
FreeBSD-src-2558d1ad635da469c5e629f9012399d8c81b99b7.tar.gz
Something long overdue: compile inb() and outb() into the kernel as
functions if DDB is available. The remaining occurences are usually only inlined and thus not available in DDB. I'm sure Bruce will have 23 additions to these 30 lines of code, but at least it's a starting point. ;-)
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/amd64/machdep.c48
-rw-r--r--sys/i386/i386/machdep.c48
2 files changed, 94 insertions, 2 deletions
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index 6f4f3be..c986a1d 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
- * $Id: machdep.c,v 1.231 1997/03/24 11:23:29 bde Exp $
+ * $Id: machdep.c,v 1.232 1997/03/25 23:43:01 mpp Exp $
*/
#include "npx.h"
@@ -1529,3 +1529,49 @@ bad:
bp->b_flags |= B_ERROR;
return(-1);
}
+
+#ifdef DDB
+
+/*
+ * Provide inb() and outb() as functions. They are normally only
+ * available as macros calling inlined functions, thus cannot be
+ * called inside DDB.
+ *
+ * The actual code is stolen from <machine/cpufunc.h>, and de-inlined.
+ */
+
+#undef inb
+#undef outb
+
+/* silence compiler warnings */
+u_char inb(u_int);
+void outb(u_int, u_char);
+
+u_char
+inb(u_int port)
+{
+ u_char data;
+ /*
+ * We use %%dx and not %1 here because i/o is done at %dx and not at
+ * %edx, while gcc generates inferior code (movw instead of movl)
+ * if we tell it to load (u_short) port.
+ */
+ __asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port));
+ return (data);
+}
+
+void
+outb(u_int port, u_char data)
+{
+ u_char al;
+ /*
+ * Use an unnecessary assignment to help gcc's register allocator.
+ * This make a large difference for gcc-1.40 and a tiny difference
+ * for gcc-2.6.0. For gcc-1.40, al had to be ``asm("ax")'' for
+ * best results. gcc-2.6.0 can't handle this.
+ */
+ al = data;
+ __asm __volatile("outb %0,%%dx" : : "a" (al), "d" (port));
+}
+
+#endif /* DDB */
diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c
index 6f4f3be..c986a1d 100644
--- a/sys/i386/i386/machdep.c
+++ b/sys/i386/i386/machdep.c
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
- * $Id: machdep.c,v 1.231 1997/03/24 11:23:29 bde Exp $
+ * $Id: machdep.c,v 1.232 1997/03/25 23:43:01 mpp Exp $
*/
#include "npx.h"
@@ -1529,3 +1529,49 @@ bad:
bp->b_flags |= B_ERROR;
return(-1);
}
+
+#ifdef DDB
+
+/*
+ * Provide inb() and outb() as functions. They are normally only
+ * available as macros calling inlined functions, thus cannot be
+ * called inside DDB.
+ *
+ * The actual code is stolen from <machine/cpufunc.h>, and de-inlined.
+ */
+
+#undef inb
+#undef outb
+
+/* silence compiler warnings */
+u_char inb(u_int);
+void outb(u_int, u_char);
+
+u_char
+inb(u_int port)
+{
+ u_char data;
+ /*
+ * We use %%dx and not %1 here because i/o is done at %dx and not at
+ * %edx, while gcc generates inferior code (movw instead of movl)
+ * if we tell it to load (u_short) port.
+ */
+ __asm __volatile("inb %%dx,%0" : "=a" (data) : "d" (port));
+ return (data);
+}
+
+void
+outb(u_int port, u_char data)
+{
+ u_char al;
+ /*
+ * Use an unnecessary assignment to help gcc's register allocator.
+ * This make a large difference for gcc-1.40 and a tiny difference
+ * for gcc-2.6.0. For gcc-1.40, al had to be ``asm("ax")'' for
+ * best results. gcc-2.6.0 can't handle this.
+ */
+ al = data;
+ __asm __volatile("outb %0,%%dx" : : "a" (al), "d" (port));
+}
+
+#endif /* DDB */
OpenPOWER on IntegriCloud