3 Copyright 1998, 2000, 2001, 2002 Red Hat, Inc.
5 This file is part of RDA, the Red Hat Debug Agent (and library).
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
22 Alternative licenses for RDA may be arranged by contacting Red Hat,
32 #include "gdbserv-utils.h"
36 gdbserv_to_hex (int c)
38 static const unsigned char hexchars[] = "0123456789abcdef";
39 return hexchars[c & 0xf];
43 /* Convert ch from a hex digit to an int. */
46 gdbserv_hex_to (unsigned char ch)
50 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
52 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
54 case '0': case '1': case '2': case '3': case '4':
55 case '5': case '6': case '7': case '8': case '9':
63 gdbserv_ulong_to_hex (char *ptr, unsigned long ulong_value, int num_bits)
74 num_bits = (num_bits + 7) / 8;
77 int v = (ulong_value >> ((num_bits - 1) * 8));
78 if (v || (num_bits == 1))
81 *(ptr++) = gdbserv_to_hex ((v / 16) & 15);
82 *(ptr++) = gdbserv_to_hex (v & 15);
92 gdbserv_raw_to_hex (char **ptr, char *mem, int nr_bytes)
95 for (i = 0; i < nr_bytes; i++)
97 *(*ptr)++ = gdbserv_to_hex (*mem >> 4);
98 *(*ptr)++ = gdbserv_to_hex (*mem++);
104 gdbserv_reg_to_ulong (struct gdbserv *gdbserv,
105 const struct gdbserv_reg *reg,
110 for (i = 0; i < reg->len; i++)
113 l |= (unsigned char) reg->buf[i];
123 gdbserv_reg_to_ulonglong (struct gdbserv *gdbserv,
124 const struct gdbserv_reg *reg,
125 unsigned long long *val)
128 unsigned long long l = 0;
129 for (i = 0; i < reg->len; i++)
132 l |= (unsigned char) reg->buf[i];
141 unpack_ulongest (struct gdbserv_reg *reg,
142 unsigned long long val)
150 reg->buf[sizeof (reg->buf) - len - 1] = val & 0xff;
156 for (idx = 0; idx < len; idx++)
158 reg->buf[idx] = reg->buf[sizeof (reg->buf) - len + idx];
164 gdbserv_ulong_to_reg (struct gdbserv *gdbserv,
166 struct gdbserv_reg *reg)
169 unpack_ulongest (reg, val);
173 gdbserv_long_to_reg (struct gdbserv *gdbserv,
175 struct gdbserv_reg *reg)
184 unpack_ulongest (reg, val);
188 gdbserv_ulonglong_to_reg (struct gdbserv *gdbserv,
189 unsigned long long val,
190 struct gdbserv_reg *reg)
193 unpack_ulongest (reg, val);
197 gdbserv_longlong_to_reg (struct gdbserv *gdbserv,
199 struct gdbserv_reg *reg)
208 unpack_ulongest (reg, val);
211 /* Copy bytes from one buffer to another in reverse order. Used for
212 converting byte order from big endian to little endian or vice versa. */
215 reverse_copy_bytes (void *dest, const void *src, int len)
221 for (i = 0; i < len; i++)
223 d[i] = s[len - i - 1];
228 gdbserv_be_bytes_to_reg (struct gdbserv *gdbserv,
231 struct gdbserv_reg *reg)
235 memcpy (reg->buf, buf, len);
239 gdbserv_be_bytes_from_reg (struct gdbserv *gdbserv,
242 const struct gdbserv_reg *reg)
245 memcpy (buf, reg->buf, reg->len);
249 gdbserv_le_bytes_to_reg (struct gdbserv *gdbserv,
252 struct gdbserv_reg *reg)
256 reverse_copy_bytes (reg->buf, buf, len);
260 gdbserv_le_bytes_from_reg (struct gdbserv *gdbserv,
263 const struct gdbserv_reg *reg)
266 reverse_copy_bytes (buf, reg->buf, reg->len);
270 gdbserv_host_bytes_to_reg (struct gdbserv *gdbserv,
273 struct gdbserv_reg *reg)
275 #ifdef WORDS_BIGENDIAN
276 gdbserv_be_bytes_to_reg (gdbserv, buf, len, reg);
278 gdbserv_le_bytes_to_reg (gdbserv, buf, len, reg);
283 gdbserv_host_bytes_from_reg (struct gdbserv *gdbserv,
286 const struct gdbserv_reg *reg)
288 #ifdef WORDS_BIGENDIAN
289 gdbserv_be_bytes_from_reg (gdbserv, buf, lenp, reg);
291 gdbserv_le_bytes_from_reg (gdbserv, buf, lenp, reg);