Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/mips/mips fix db_{read, write}_bytes() for unaligned...



details:   https://anonhg.NetBSD.org/src/rev/a5202f2100d0
branches:  trunk
changeset: 756132:a5202f2100d0
user:      chs <chs%NetBSD.org@localhost>
date:      Wed Jul 07 01:22:12 2010 +0000

description:
fix db_{read,write}_bytes() for unaligned addresses
(just copy a byte at a time, this isn't a performance path).

diffstat:

 sys/arch/mips/mips/db_interface.c |  104 +++----------------------------------
 1 files changed, 10 insertions(+), 94 deletions(-)

diffs (150 lines):

diff -r 084e71f063aa -r a5202f2100d0 sys/arch/mips/mips/db_interface.c
--- a/sys/arch/mips/mips/db_interface.c Wed Jul 07 01:21:47 2010 +0000
+++ b/sys/arch/mips/mips/db_interface.c Wed Jul 07 01:22:12 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: db_interface.c,v 1.66 2009/12/14 00:46:06 matt Exp $   */
+/*     $NetBSD: db_interface.c,v 1.67 2010/07/07 01:22:12 chs Exp $    */
 
 /*
  * Mach Operating System
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.66 2009/12/14 00:46:06 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.67 2010/07/07 01:22:12 chs Exp $");
 
 #include "opt_cputype.h"       /* which mips CPUs do we support? */
 #include "opt_ddb.h"
@@ -72,11 +72,6 @@
 void db_mtcr_cmd(db_expr_t, bool, db_expr_t, const char *);
 #endif
 
-static void    kdbpoke_4(vaddr_t addr, int newval);
-static void    kdbpoke_2(vaddr_t addr, short newval);
-static void    kdbpoke_1(vaddr_t addr, char newval);
-static short   kdbpeek_2(vaddr_t addr);
-static char    kdbpeek_1(vaddr_t addr);
 vaddr_t                MachEmulateBranch(struct frame *, vaddr_t, unsigned, int);
 
 paddr_t kvtophys(vaddr_t);
@@ -92,63 +87,6 @@
 }
 #endif
 
-static short
-kdbpeek_2(vaddr_t addr)
-{
-
-       return *(short *)addr;
-}
-
-static char
-kdbpeek_1(vaddr_t addr)
-{
-
-       return *(char *)addr;
-}
-
-/*
- * kdbpoke -- write a value to a kernel virtual address.
- *    XXX should handle KSEG2 addresses and check for unmapped pages.
- *    XXX user-space addresess?
- */
-static void
-kdbpoke_4(vaddr_t addr, int newval)
-{
-
-       *(int*) addr = newval;
-       wbflush();
-}
-
-static void
-kdbpoke_2(vaddr_t addr, short newval)
-{
-
-       *(short*) addr = newval;
-       wbflush();
-}
-
-static void
-kdbpoke_1(vaddr_t addr, char newval)
-{
-       *(char*) addr = newval;
-       wbflush();
-}
-
-#if 0 /* UNUSED */
-/*
- * Received keyboard interrupt sequence.
- */
-void
-kdb_kbd_trap(int *tf)
-{
-
-       if (db_active == 0 && (boothowto & RB_KDB)) {
-               printf("\n\nkernel: keyboard interrupt\n");
-               ddb_trap(-1, tf);
-       }
-}
-#endif
-
 #ifndef KGDB
 int
 kdb_trap(int type, mips_reg_t /* struct trapframe */ *tfp)
@@ -283,15 +221,10 @@
 void
 db_read_bytes(vaddr_t addr, size_t size, char *data)
 {
-       int *ip;
-       short *sp;
+       char *src = (char *)addr;
 
-       while (size >= 4)
-               ip = (int*)data, *ip = kdbpeek(addr), data += 4, addr += 4, size -= 4;
-       while (size >= 2)
-               sp = (short *)data, *sp = kdbpeek_2(addr), data += 2, addr += 2, size -= 2;
-       if (size == 1)
-               *data = kdbpeek_1(addr);
+       while (size--)
+               *data++ = *src++;
 }
 
 /*
@@ -300,31 +233,14 @@
 void
 db_write_bytes(vaddr_t addr, size_t size, const char *data)
 {
-       vaddr_t p = addr;
+       char *p = (char *)addr;
        size_t n = size;
 
-#ifdef DEBUG_DDB
-       printf("db_write_bytes(%lx, %d, %p, val %x)\n", addr, size, data,
-               (addr &3 ) == 0? *(u_int*)addr: -1);
-#endif
+       while (n--)
+               *p++ = *data++;
 
-       while (n >= 4) {
-               kdbpoke_4(p, *(const int *)data);
-               p += 4;
-               data += 4;
-               n -= 4;
-       }
-       if (n >= 2) {
-               kdbpoke_2(p, *(const short *)data);
-               p += 2;
-               data += 2;
-               n -= 2;
-       }
-       if (n == 1) {
-               kdbpoke_1(p, *(const char *)data);
-       }
-
-       mips_icache_sync_range((vaddr_t) addr, size);
+       wbflush();
+       mips_icache_sync_range(addr, size);
 }
 
 #ifndef KGDB



Home | Main Index | Thread Index | Old Index