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