diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2005-10-13 19:43:44 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2005-10-13 19:43:44 +0000 |
commit | c03ff640d434a3c3dbaa7d8173ec3182ff33000c (patch) | |
tree | ade67b0c3b6c2911fc32300ba23edc954513fbde /sys/arch/mvme88k | |
parent | 54364773e795b3fbfece4661674cc00032bb4888 (diff) |
Put the register clobbering constraints on the BUG trap instruction,
not the first ldcr; hopefully gcc did not dare optimizing too much around
here, so this should not change anything in practice.
test martin@
Diffstat (limited to 'sys/arch/mvme88k')
-rw-r--r-- | sys/arch/mvme88k/dev/bugio.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/sys/arch/mvme88k/dev/bugio.c b/sys/arch/mvme88k/dev/bugio.c index 2b52892a7f8..3d00a93deca 100644 --- a/sys/arch/mvme88k/dev/bugio.c +++ b/sys/arch/mvme88k/dev/bugio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bugio.c,v 1.14 2005/04/30 16:42:37 miod Exp $ */ +/* $OpenBSD: bugio.c,v 1.15 2005/10/13 19:43:43 miod Exp $ */ /* Copyright (c) 1998 Steve Murphree, Jr. */ #include <sys/param.h> @@ -8,7 +8,7 @@ #include <machine/bugio.h> #include <machine/prom.h> -register_t ossr0, ossr1, ossr2, ossr3; +register_t ossr0, ossr1, ossr2, ossr3; /* XXX ought to be per-cpu */ register_t bugsr3; unsigned long bugvec[2], sysbugvec[2]; @@ -18,38 +18,33 @@ void sysbug_vector(void); #define MVMEPROM_CALL(x) \ __asm__ __volatile__ ("or r9,r0," __STRING(x)); \ - __asm__ __volatile__ ("tb0 0,r0,496") + __asm__ __volatile__ ("tb0 0,r0,496" ::: \ + "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", \ + "r9", "r10", "r11", "r12", "r13") void bug_vector() { - unsigned long *vbr, psr; - - disable_interrupt(psr); /* paranoia */ + unsigned long *vbr; __asm__ __volatile__ ("ldcr %0, cr7" : "=r" (vbr)); vbr[2 * MVMEPROM_VECTOR + 0] = bugvec[0]; vbr[2 * MVMEPROM_VECTOR + 1] = bugvec[1]; - - set_psr(psr); } void sysbug_vector() { - unsigned long *vbr, psr; - - disable_interrupt(psr); /* paranoia */ + unsigned long *vbr; __asm__ __volatile__ ("ldcr %0, cr7" : "=r" (vbr)); vbr[2 * MVMEPROM_VECTOR + 0] = sysbugvec[0]; vbr[2 * MVMEPROM_VECTOR + 1] = sysbugvec[1]; - - set_psr(psr); } #define BUGCTXT() \ { \ + disable_interrupt(psr); /* paranoia */ \ bug_vector(); \ __asm__ __volatile__ ("ldcr %0, cr17" : "=r" (ossr0)); \ __asm__ __volatile__ ("ldcr %0, cr18" : "=r" (ossr1)); \ @@ -61,20 +56,21 @@ sysbug_vector() #define OSCTXT() \ { \ - __asm__ __volatile__ ("ldcr %0, cr20" : "=r" (bugsr3):: \ - "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", \ - "r9", "r10", "r11", "r12", "r13"); \ + __asm__ __volatile__ ("ldcr %0, cr20" : "=r" (bugsr3)); \ \ __asm__ __volatile__ ("stcr %0, cr17" :: "r"(ossr0)); \ __asm__ __volatile__ ("stcr %0, cr18" :: "r"(ossr1)); \ __asm__ __volatile__ ("stcr %0, cr19" :: "r"(ossr2)); \ __asm__ __volatile__ ("stcr %0, cr20" :: "r"(ossr3)); \ sysbug_vector(); \ + set_psr(psr); \ } static void bugpcrlf(void) { + u_int psr; + BUGCTXT(); MVMEPROM_CALL(MVMEPROM_OUTCRLF); OSCTXT(); @@ -89,17 +85,20 @@ buginit() char buginchr(void) { + u_int psr; int ret; + BUGCTXT(); MVMEPROM_CALL(MVMEPROM_INCHR); - __asm__ __volatile__ ("or %0,r0,r2" : "=r" (ret) : ); + __asm__ __volatile__ ("or %0,r0,r2" : "=r" (ret)); OSCTXT(); - return ((char)ret & 0xFF); + return ((char)ret & 0xff); } void bugoutchr(unsigned char c) { + u_int psr; unsigned char cc; if ((cc = c) == '\n') { @@ -117,11 +116,12 @@ bugoutchr(unsigned char c) int buginstat(void) { - register int ret; + u_int psr; + int ret; BUGCTXT(); MVMEPROM_CALL(MVMEPROM_INSTAT); - __asm__ __volatile__ ("or %0,r0,r2" : "=r" (ret) : ); + __asm__ __volatile__ ("or %0,r0,r2" : "=r" (ret)); OSCTXT(); return (ret & 0x4 ? 0 : 1); } @@ -129,6 +129,8 @@ buginstat(void) void bugoutstr(char *s, char *se) { + u_int psr; + BUGCTXT(); MVMEPROM_CALL(MVMEPROM_OUTSTR); OSCTXT(); @@ -137,6 +139,8 @@ bugoutstr(char *s, char *se) void bugrtcrd(struct mvmeprom_time *rtc) { + u_int psr; + BUGCTXT(); MVMEPROM_CALL(MVMEPROM_RTC_RD); OSCTXT(); @@ -145,6 +149,8 @@ bugrtcrd(struct mvmeprom_time *rtc) void bugreturn(void) { + u_int psr; + BUGCTXT(); MVMEPROM_CALL(MVMEPROM_EXIT); OSCTXT(); @@ -153,11 +159,12 @@ bugreturn(void) void bugbrdid(struct mvmeprom_brdid *id) { + u_int psr; struct mvmeprom_brdid *ptr; BUGCTXT(); MVMEPROM_CALL(MVMEPROM_GETBRDID); - __asm__ __volatile__ ("or %0,r0,r2" : "=r" (ptr) : ); + __asm__ __volatile__ ("or %0,r0,r2" : "=r" (ptr)); OSCTXT(); bcopy(ptr, id, sizeof(struct mvmeprom_brdid)); @@ -166,6 +173,8 @@ bugbrdid(struct mvmeprom_brdid *id) void bugdiskrd(struct mvmeprom_dskio *dio) { + u_int psr; + BUGCTXT(); __asm__ __volatile__ ("or r2, r0, %0" : : "r" (dio)); MVMEPROM_CALL(MVMEPROM_DSKRD); |