db_access.c revision 116176
18876Srgrimes/* 24Srgrimes * Mach Operating System 34Srgrimes * Copyright (c) 1991,1990 Carnegie Mellon University 44Srgrimes * All Rights Reserved. 58876Srgrimes * 64Srgrimes * Permission to use, copy, modify and distribute this software and its 74Srgrimes * documentation is hereby granted, provided that both the copyright 84Srgrimes * notice and this permission notice appear in all copies of the 94Srgrimes * software, derivative works or modified versions, and any portions 104Srgrimes * thereof, and that both notices appear in supporting documentation. 118876Srgrimes * 128876Srgrimes * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS 134Srgrimes * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 144Srgrimes * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 158876Srgrimes * 164Srgrimes * Carnegie Mellon requests users of this software to return to 178876Srgrimes * 184Srgrimes * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 194Srgrimes * School of Computer Science 204Srgrimes * Carnegie Mellon University 214Srgrimes * Pittsburgh PA 15213-3890 228876Srgrimes * 234Srgrimes * any improvements or extensions that they make and grant Carnegie the 244Srgrimes * rights to redistribute these changes. 254Srgrimes */ 264Srgrimes/* 274Srgrimes * Author: David B. Golub, Carnegie Mellon University 284Srgrimes * Date: 7/90 294Srgrimes */ 30116176Sobrien 31116176Sobrien#include <sys/cdefs.h> 32116176Sobrien__FBSDID("$FreeBSD: head/sys/ddb/db_access.c 116176 2003-06-10 22:09:23Z obrien $"); 33116176Sobrien 342056Swollman#include <sys/param.h> 3512734Sbde 362056Swollman#include <ddb/ddb.h> 3712473Sbde#include <ddb/db_access.h> 384Srgrimes 394Srgrimes/* 404Srgrimes * Access unaligned data items on aligned (longword) 414Srgrimes * boundaries. 424Srgrimes */ 434Srgrimes 4412515Sphkstatic unsigned db_extend[] = { /* table for sign-extending */ 454Srgrimes 0, 46798Swollman 0xFFFFFF80U, 47798Swollman 0xFFFF8000U, 48798Swollman 0xFF800000U 494Srgrimes}; 504Srgrimes 514Srgrimesdb_expr_t 524Srgrimesdb_get_value(addr, size, is_signed) 534Srgrimes db_addr_t addr; 544Srgrimes register int size; 554Srgrimes boolean_t is_signed; 564Srgrimes{ 574Srgrimes char data[sizeof(int)]; 584Srgrimes register db_expr_t value; 594Srgrimes register int i; 604Srgrimes 614Srgrimes db_read_bytes(addr, size, data); 624Srgrimes 634Srgrimes value = 0; 644Srgrimes#if BYTE_MSF 654Srgrimes for (i = 0; i < size; i++) 664Srgrimes#else /* BYTE_LSF */ 674Srgrimes for (i = size - 1; i >= 0; i--) 684Srgrimes#endif 694Srgrimes { 704Srgrimes value = (value << 8) + (data[i] & 0xFF); 714Srgrimes } 728876Srgrimes 734Srgrimes if (size < 4) { 744Srgrimes if (is_signed && (value & db_extend[size]) != 0) 754Srgrimes value |= db_extend[size]; 764Srgrimes } 774Srgrimes return (value); 784Srgrimes} 794Srgrimes 804Srgrimesvoid 814Srgrimesdb_put_value(addr, size, value) 824Srgrimes db_addr_t addr; 834Srgrimes register int size; 844Srgrimes register db_expr_t value; 854Srgrimes{ 864Srgrimes char data[sizeof(int)]; 874Srgrimes register int i; 884Srgrimes 894Srgrimes#if BYTE_MSF 904Srgrimes for (i = size - 1; i >= 0; i--) 914Srgrimes#else /* BYTE_LSF */ 924Srgrimes for (i = 0; i < size; i++) 934Srgrimes#endif 944Srgrimes { 954Srgrimes data[i] = value & 0xFF; 964Srgrimes value >>= 8; 974Srgrimes } 984Srgrimes 994Srgrimes db_write_bytes(addr, size, data); 1004Srgrimes} 1014Srgrimes 102