From 403d7829ac843396585ba7af6f273eaf4b0a77be Mon Sep 17 00:00:00 2001 From: Joerg Wunsch Date: Fri, 28 Mar 1997 12:37:44 +0000 Subject: [PATCH] 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. ;-) --- sys/amd64/amd64/machdep.c | 48 ++++++++++++++++++++++++++++++++++++++- 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 6f4f3be9945d..c986a1d23952 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 , 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 6f4f3be9945d..c986a1d23952 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 , 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 */