1 /* $FreeBSD$ */ 2 /* $NetBSD: db_interface.c,v 1.20 2002/05/13 20:30:09 matt Exp $ */ 3 /* $OpenBSD: db_interface.c,v 1.2 1996/12/28 06:21:50 rahnds Exp $ */ 4 5 #include <sys/param.h> 6 #include <sys/systm.h> 7 #include <sys/cons.h> 8 #include <sys/kdb.h> 9 #include <sys/ktr.h> 10 #include <sys/lock.h> 11 #include <sys/pcpu.h> 12 #include <sys/proc.h> 13 #include <sys/smp.h> 14 15 #include <machine/kdb.h> 16 #include <machine/md_var.h> 17 18 #include <vm/vm.h> 19 #include <vm/pmap.h> 20 21 #include <ddb/ddb.h> 22 #include <ddb/db_sym.h> 23 #include <ddb/db_command.h> 24 #include <ddb/db_access.h> 25 #include <ddb/db_output.h> 26 27 #include <dev/ofw/openfirm.h> 28 29 int 30 db_read_bytes(vm_offset_t addr, size_t size, char *data) 31 { 32 jmp_buf jb; 33 void *prev_jb; 34 char *src; 35 int ret; 36 37 prev_jb = kdb_jmpbuf(jb); 38 ret = setjmp(jb); 39 if (ret == 0) { 40 src = (char *)addr; 41 42 if (size == 8) 43 *((uint64_t*)data) = *((uint64_t*)src); 44 if (size == 4) 45 *((int *)data) = *((int *)src); 46 else if (size == 2) 47 *((short *)data) = *((short *)src); 48 else 49 while (size-- > 0) 50 *data++ = *src++; 51 } 52 (void)kdb_jmpbuf(prev_jb); 53 return (ret); 54 } 55 56 int 57 db_write_bytes(vm_offset_t addr, size_t size, char *data) 58 { 59 jmp_buf jb; 60 void *prev_jb; 61 char *dst; 62 size_t cnt; 63 int ret; 64 65 prev_jb = kdb_jmpbuf(jb); 66 ret = setjmp(jb); 67 if (ret == 0) { 68 dst = (char *)addr; 69 cnt = size; 70 71 if (size == 8) 72 *((uint64_t*)dst) = *((uint64_t*)data); 73 if (size == 4) 74 *((int*)dst) = *((int*)data); 75 else 76 if (size == 2) 77 *((short*)dst) = *((short*)data); 78 else 79 while (cnt-- > 0) 80 *dst++ = *data++; 81 kdb_cpu_sync_icache((void *)addr, size); 82 } 83 (void)kdb_jmpbuf(prev_jb); 84 return (ret); 85 } 86 87 void 88 db_show_mdpcpu(struct pcpu *pc) 89 { 90 91 db_printf("PPC: hwref = %#zx\n", pc->pc_hwref); 92 db_printf("PPC: ipimask = %#x\n", pc->pc_ipimask); 93 db_printf("PPC: flags = %#x\n", pc->pc_flags); 94 } 95