Annotation of sys/arch/powerpc/ddb/db_memrw.c, Revision 1.1
1.1 ! nbrk 1: /* $NetBSD: db_memrw.c,v 1.4 2001/05/18 20:38:27 matt Exp $ */
! 2: /* $OpenBSD: db_memrw.c,v 1.5 2003/10/15 01:06:13 drahn Exp $ */
! 3:
! 4: /*
! 5: * Mach Operating System
! 6: * Copyright (c) 1992 Carnegie Mellon University
! 7: * All Rights Reserved.
! 8: *
! 9: * Permission to use, copy, modify and distribute this software and its
! 10: * documentation is hereby granted, provided that both the copyright
! 11: * notice and this permission notice appear in all copies of the
! 12: * software, derivative works or modified versions, and any portions
! 13: * thereof, and that both notices appear in supporting documentation.
! 14: *
! 15: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
! 16: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
! 17: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
! 18: *
! 19: * Carnegie Mellon requests users of this software to return to
! 20: *
! 21: * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
! 22: * School of Computer Science
! 23: * Carnegie Mellon University
! 24: * Pittsburgh PA 15213-3890
! 25: *
! 26: * any improvements or extensions that they make and grant Carnegie Mellon
! 27: * the rights to redistribute these changes.
! 28: */
! 29:
! 30: /*
! 31: * Interface to the debugger for virtual memory read/write.
! 32: * This is a simple version for kernels with writable text.
! 33: * For an example of read-only kernel text, see the file:
! 34: * sys/arch/sun3/sun3/db_memrw.c
! 35: *
! 36: * ALERT! If you want to access device registers with a
! 37: * specific size, then the read/write functions have to
! 38: * make sure to do the correct sized pointer access.
! 39: */
! 40:
! 41: #include <sys/param.h>
! 42: #include <sys/proc.h>
! 43: #include <sys/systm.h>
! 44:
! 45: #include <uvm/uvm_extern.h>
! 46:
! 47: #include <machine/db_machdep.h>
! 48: #include <machine/pcb.h>
! 49:
! 50: #include <ddb/db_access.h>
! 51:
! 52: /*
! 53: * Read bytes from kernel address space for debugger.
! 54: */
! 55: void
! 56: db_read_bytes(addr, size, data)
! 57: vaddr_t addr;
! 58: size_t size;
! 59: char *data;
! 60: {
! 61: char *src = (char *)addr;
! 62: faultbuf env;
! 63: faultbuf *old_onfault = curpcb->pcb_onfault;
! 64: if (setfault(&env)) {
! 65: curpcb->pcb_onfault = old_onfault;
! 66: return;
! 67: }
! 68:
! 69: if (size == 4) {
! 70: *((int *)data) = *((int *)src);
! 71: } else if (size == 2) {
! 72: *((short *)data) = *((short *)src);
! 73: } else {
! 74: while (size > 0) {
! 75: --size;
! 76: *data++ = *src++;
! 77: }
! 78: }
! 79: curpcb->pcb_onfault = old_onfault;
! 80: }
! 81:
! 82: /*
! 83: * Write bytes to kernel address space for debugger.
! 84: */
! 85: void
! 86: db_write_bytes(addr, size, data)
! 87: vaddr_t addr;
! 88: size_t size;
! 89: char *data;
! 90: {
! 91: char *dst = (char *)addr;
! 92: faultbuf env;
! 93: faultbuf *old_onfault = curpcb->pcb_onfault;
! 94:
! 95: if (setfault(&env)) {
! 96: curpcb->pcb_onfault = old_onfault;
! 97: return;
! 98: }
! 99:
! 100: if (size == 4) {
! 101: *((int *)dst) = *((int *)data);
! 102: } else if (size == 2) {
! 103: *((short *)dst) = *((short *)data);
! 104: } else {
! 105: while (size > 0) {
! 106: --size;
! 107: *dst++ = *data++;
! 108: }
! 109: }
! 110: syncicache((void *)addr, size);
! 111: curpcb->pcb_onfault = old_onfault;
! 112: }
! 113:
CVSweb