Annotation of sys/ddb/db_access.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: db_access.c,v 1.10 2007/03/15 17:10:22 miod Exp $ */
2: /* $NetBSD: db_access.c,v 1.8 1994/10/09 08:37:35 mycroft Exp $ */
3:
4: /*
5: * Mach Operating System
6: * Copyright (c) 1991,1990 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
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 the
27: * the rights to redistribute these changes.
28: *
29: * Author: David B. Golub, Carnegie Mellon University
30: * Date: 7/90
31: */
32:
33: #include <sys/param.h>
34: #include <sys/proc.h>
35:
36: #include <uvm/uvm_extern.h>
37:
38: #include <machine/db_machdep.h> /* type definitions */
39: #include <machine/endian.h>
40:
41: #include <ddb/db_access.h>
42:
43: /*
44: * Access unaligned data items on aligned (longword)
45: * boundaries.
46: */
47: db_expr_t
48: db_get_value(db_addr_t addr, size_t size, boolean_t is_signed)
49: {
50: char data[sizeof(db_expr_t)];
51: db_expr_t value, extend;
52: int i;
53:
54: #ifdef DIAGNOSTIC
55: if (size > sizeof data)
56: size = sizeof data;
57: #endif
58:
59: db_read_bytes(addr, size, data);
60:
61: value = 0;
62: extend = (~(db_expr_t)0) << (size * 8 - 1);
63: #if BYTE_ORDER == LITTLE_ENDIAN
64: for (i = size - 1; i >= 0; i--)
65: #else /* BYTE_ORDER == BIG_ENDIAN */
66: for (i = 0; i < size; i++)
67: #endif /* BYTE_ORDER */
68: value = (value << 8) + (data[i] & 0xFF);
69:
70: if (size < sizeof(db_expr_t) && is_signed && (value & extend))
71: value |= extend;
72: return (value);
73: }
74:
75: void
76: db_put_value(db_addr_t addr, size_t size, db_expr_t value)
77: {
78: char data[sizeof(db_expr_t)];
79: int i;
80:
81: #ifdef DIAGNOSTIC
82: if (size > sizeof data)
83: size = sizeof data;
84: #endif
85:
86: #if BYTE_ORDER == LITTLE_ENDIAN
87: for (i = 0; i < size; i++)
88: #else /* BYTE_ORDER == BIG_ENDIAN */
89: for (i = size - 1; i >= 0; i--)
90: #endif /* BYTE_ORDER */
91: {
92: data[i] = value & 0xff;
93: value >>= 8;
94: }
95:
96: db_write_bytes(addr, size, data);
97: }
CVSweb