diff options
author | joerg <joerg@FreeBSD.org> | 1997-03-28 12:37:44 +0000 |
---|---|---|
committer | joerg <joerg@FreeBSD.org> | 1997-03-28 12:37:44 +0000 |
commit | 2558d1ad635da469c5e629f9012399d8c81b99b7 (patch) | |
tree | e78f8f8a4e31231f81ba8819aa4af650ee19c736 /sys | |
parent | 4003214ed86b3ab71d144c5278b8cd8cc8bd6d79 (diff) | |
download | FreeBSD-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.c | 48 | ||||
-rw-r--r-- | sys/i386/i386/machdep.c | 48 |
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 */ |