1 /* 2 * Mach Operating System 3 * Copyright (c) 1991,1990 Carnegie Mellon University 4 * All Rights Reserved. 5 * 6 * Permission to use, copy, modify and distribute this software and its 7 * documentation is hereby granted, provided that both the copyright 8 * notice and this permission notice appear in all copies of the 9 * software, derivative works or modified versions, and any portions 10 * thereof, and that both notices appear in supporting documentation. 11 * 12 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 13 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 14 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 15 * 16 * Carnegie Mellon requests users of this software to return to 17 * 18 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 19 * School of Computer Science 20 * Carnegie Mellon University 21 * Pittsburgh PA 15213-3890 22 * 23 * any improvements or extensions that they make and grant Carnegie the 24 * rights to redistribute these changes. 25 */ 26 27 /* 28 * Author: David B. Golub, Carnegie Mellon University 29 * Date: 7/90 30 */ 31 #include "ddb.h" 32 #include "db_access.h" 33 34 #include "extra.h" 35 36 /* 37 * Access unaligned data items on aligned (longword) 38 * boundaries. 39 */ 40 41 static unsigned db_extend[] = { /* table for sign-extending */ 42 0, 43 0xFFFFFF80U, 44 0xFFFF8000U, 45 0xFF800000U 46 }; 47 48 void 49 db_read_bytes(addr, size, data) 50 vm_offset_t addr; 51 register int size; 52 register char *data; 53 { 54 register char *src; 55 56 src = (char *)addr; 57 while (--size >= 0) 58 *data++ = text_read_ub(src++); 59 60 } 61 62 db_expr_t 63 db_get_value(addr, size, is_signed) 64 db_addr_t addr; 65 register int size; 66 boolean_t is_signed; 67 { 68 char data[sizeof(int)]; 69 register db_expr_t value; 70 register int i; 71 72 db_read_bytes(addr, size, data); 73 74 value = 0; 75 #if BYTE_MSF 76 for (i = 0; i < size; i++) 77 #else /* BYTE_LSF */ 78 for (i = size - 1; i >= 0; i--) 79 #endif 80 { 81 value = (value << 8) + (data[i] & 0xFF); 82 } 83 84 if (size < 4) { 85 if (is_signed && (value & db_extend[size]) != 0) 86 value |= db_extend[size]; 87 } 88 return (value); 89 } 90 91