Stackdb
Stackdb is a stackable, multi-target and -level source debugger and memory forensics library.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
regcache.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 The University of Utah
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of
7  * the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18 
19 #include "config.h"
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include <glib.h>
24 #include "common.h"
25 #include "log.h"
26 #include "arch.h"
27 #include "regcache.h"
28 
29 struct regcache *regcache_create(struct arch *arch) {
30  struct regcache *retval;
31 
32  retval = (struct regcache *)calloc(1,sizeof(*retval));
33  retval->arch = arch;
34  retval->values = (REGVAL *)calloc(arch->regcount,sizeof(REGVAL));
35  retval->values_len = arch->regcount;
36  retval->flags = (uint8_t *)calloc(arch->regcount,sizeof(uint8_t));
37  retval->flags_len = arch->regcount;
38 
39  return retval;
40 }
41 
43  int i;
44 
45  /* Free any large values. */
46  for (i = 0; i < regcache->values_len; ++i) {
47  // arch_regsize(regcache->arch,i) != sizeof(*regcache->values)
48  if (regcache->flags[i] & REGCACHE_ALLOC) {
49  free((void *)regcache->values[i]);
50  regcache->values[i] = 0;
51  regcache->flags[i] &= ~(uint8_t)REGCACHE_ALLOC;
52  }
53  }
54 
55  free(regcache);
56 }
57 
58 int regcache_copy_all(struct regcache *sregcache,struct regcache *dregcache) {
59  int i;
60 
61  /* copy any set values. */
62  for (i = 0; i < sregcache->values_len; ++i) {
63  if (!(sregcache->flags[i] & REGCACHE_VALID))
64  continue;
65  else if (sregcache->flags[i] & REGCACHE_ALLOC)
66  regcache_init_reg_len(dregcache,i,(void *)sregcache->values[i],
67  arch_regsize(sregcache->arch,i));
68  else
69  regcache_init_reg(dregcache,i,sregcache->values[i]);
70  }
71 
72  return 0;
73 }
74 
75 int regcache_copy_dirty(struct regcache *sregcache,struct regcache *dregcache) {
76  int i;
77  int olddone;
78 
79  olddone = dregcache->done_loading;
80  dregcache->done_loading = 0;
81 
82  /* copy any set values. */
83  for (i = 0; i < sregcache->values_len; ++i) {
84  if (!(sregcache->flags[i] & REGCACHE_VALID))
85  continue;
86  else if (!(sregcache->flags[i] & REGCACHE_DIRTY))
87  continue;
88  else if (sregcache->flags[i] & REGCACHE_ALLOC)
89  regcache_write_reg_len(dregcache,i,(void *)sregcache->values[i],
90  arch_regsize(sregcache->arch,i));
91  else
92  regcache_write_reg(dregcache,i,sregcache->values[i]);
93  vdebug(9,LA_LIB,LF_REGCACHE,"copied reg %i\n",i);
94  }
95 
96  dregcache->done_loading = olddone;
97 
98  return 0;
99 }
100 
102  int i;
103 
104  /* zero out any set values; memset any large, allocated values. */
105  for (i = 0; i < regcache->values_len; ++i) {
106  if (!(regcache->flags[i] & REGCACHE_VALID))
107  continue;
108  else if (regcache->flags[i] & REGCACHE_ALLOC)
109  memset((void *)regcache->values[i],0,arch_regsize(regcache->arch,i));
110  else
111  regcache->values[i] = 0;
112  }
113 
114  //regcache->valid = 0;
115  //regcache->dirty = 0;
116 }
117 
119  int i;
120 
121  for (i = 0; i < regcache->flags_len; ++i)
122  regcache->flags[i] &= ~(uint8_t)REGCACHE_DIRTY;
123 
124  regcache->dirty = 0;
125 }
126 
128  int i;
129 
130  if (regcache->dirty) {
131  vwarnopt(5,LA_LIB,LF_REGCACHE,"cache still dirty!\n");
132  }
133 
134  for (i = 0; i < regcache->flags_len; ++i) {
135  if (regcache->flags[i] & REGCACHE_DIRTY) {
136  vwarnopt(5,LA_LIB,LF_REGCACHE,"cache reg %d still dirty!\n",i);
137  }
138  regcache->flags[i] = 0;
139  }
140 
141  regcache->valid = 0;
142  regcache->dirty = 0;
143  regcache->done_loading = 0;
144 }
145 
146 #define CHECKREG() \
147  if (!arch_has_reg(regcache->arch,reg)) { \
148  vwarnopt(LA_LIB,LF_REGCACHE,8,"reg %d not supported\n",reg); \
149  errno = EINVAL; \
150  return -1; \
151  }
152 
153 int regcache_init_reg(struct regcache *regcache,REG reg,REGVAL regval) {
154  CHECKREG();
155 
156  unsigned int sz = arch_regsize(regcache->arch,reg);
157 
158  if (regcache->done_loading) {
159  vwarn("called on fully-loaded regcache; BUG!!!\n");
160  }
161 
162  if (sz > sizeof(*regcache->values)
163  && !(regcache->flags[reg] & REGCACHE_ALLOC)) {
164  regcache->values[reg] = (REGVAL)malloc(sz);
165  regcache->flags[reg] |= REGCACHE_ALLOC;
166  }
167 
168  if (regcache->flags[reg] & REGCACHE_ALLOC) {
169  if (sizeof(regval) < sz) {
170  memset((void *)regcache->values[reg],0,sz);
171  memcpy((void *)regcache->values[reg],&regval,sizeof(regval));
172  }
173  else
174  memcpy((void *)regcache->values[reg],&regval,sz);
175  }
176  else {
177  regcache->values[reg] = regval;
178  }
179 
180  if (!(regcache->flags[reg] & REGCACHE_VALID))
181  ++regcache->valid;
182  regcache->flags[reg] |= REGCACHE_VALID;
183 
184  vdebug(9,LA_LIB,LF_REGCACHE,"%"PRIiREG" = 0x%"PRIxREGVAL"\n",reg,regval);
185 
186  return 0;
187 }
188 
190  if (regcache->dirty) {
191  vwarn("called on dirty regcache; BUG!!!\n");
192  }
193  else if (!regcache->valid) {
194  vwarn("called on regcache with no registers loaded\n");
195  }
196 
197  regcache->done_loading = 1;
198 
199  return 0;
200 }
201 
203  CHECKREG();
204 
205  if (regcache->flags[reg] & REGCACHE_VALID
206  && regcache->flags[reg] & REGCACHE_DIRTY)
207  return 1;
208  else
209  return 0;
210 }
211 
213  int i;
214  int retval = 0;
215 
216  if (!arch_has_reg(regcache->arch,start)) {
217  verror("reg %d not supported\n",start);
218  errno = EINVAL;
219  return -1;
220  }
221  else if (!arch_has_reg(regcache->arch,end)) {
222  verror("reg %d not supported\n",end);
223  errno = EINVAL;
224  return -1;
225  }
226 
227  for (i = start; i <= end; ++i) {
228  if (regcache->flags[i] & REGCACHE_VALID
229  && regcache->flags[i] & REGCACHE_DIRTY)
230  ++retval;
231  }
232 
233  return retval;
234 }
235 
237  return regcache->dirty;
238 }
239 
240 int regcache_write_reg(struct regcache *regcache,REG reg,REGVAL regval) {
241  CHECKREG();
242 
243  /* XXX: should we insist it's init'd first? Yes. */
244  if (!(regcache->flags[reg] & REGCACHE_VALID)) {
246  "reg %d not valid; cannot write unless loaded first!\n",reg);
247  errno = EINVAL;
248  return -1;
249  }
250 
251  if (regcache->flags[reg] & REGCACHE_ALLOC) {
252  unsigned int sz = arch_regsize(regcache->arch,reg);
253 
254  if (sizeof(regval) < sz) {
255  memset((void *)regcache->values[reg],0,sz);
256  memcpy((void *)regcache->values[reg],&regval,sizeof(regval));
257  }
258  else
259  memcpy((void *)regcache->values[reg],&regval,sz);
260  }
261  else {
262  regcache->values[reg] = regval;
263  }
264 
265  regcache->flags[reg] |= REGCACHE_DIRTY;
266  ++regcache->dirty;
267 
268  return 0;
269 }
270 
271 int regcache_read_reg(struct regcache *regcache,REG reg,REGVAL *regval) {
272  CHECKREG();
273 
274  /* XXX: should we insist it's init'd first? Yes. */
275  if (!(regcache->flags[reg] & REGCACHE_VALID)) {
277  "reg %d not valid; cannot read unless loaded first!\n",reg);
278  errno = EINVAL;
279  return -1;
280  }
281 
282  if (regcache->flags[reg] & REGCACHE_ALLOC) {
283  unsigned int sz = arch_regsize(regcache->arch,reg);
284 
285  if (sizeof(*regval) > sz) {
286  memset((void *)regval,0,sizeof(*regval));
287  memcpy((void *)regval,(void *)regcache->values[reg],sz);
288  }
289  else
290  memcpy((void *)regval,(void *)regcache->values[reg],sizeof(regval));
291  }
292  else {
293  *regval = regcache->values[reg];
294  }
295 
296  return 0;
297 }
298 
300  CHECKREG();
301 
302  if (!(regcache->flags[reg] & REGCACHE_VALID)
303  || !(regcache->flags[reg] & REGCACHE_DIRTY))
304  return 1;
305 
306  if (regcache->flags[reg] & REGCACHE_ALLOC) {
307  unsigned int sz = arch_regsize(regcache->arch,reg);
308 
309  if (sizeof(*regval) > sz) {
310  memset((void *)regval,0,sizeof(*regval));
311  memcpy((void *)regval,(void *)regcache->values[reg],sz);
312  }
313  else
314  memcpy((void *)regval,(void *)regcache->values[reg],sizeof(regval));
315  }
316  else {
317  *regval = regcache->values[reg];
318  }
319 
320  return 0;
321 }
322 
324  void *regdata,unsigned int reglen) {
325  CHECKREG();
326 
327  unsigned int sz = arch_regsize(regcache->arch,reg);
328 
329  if (sz > sizeof(*regcache->values)
330  && !(regcache->flags[reg] & REGCACHE_ALLOC)) {
331  regcache->values[reg] = (REGVAL)malloc(sz);
332  regcache->flags[reg] |= REGCACHE_ALLOC;
333  }
334 
335  if (regcache->flags[reg] & REGCACHE_ALLOC) {
336  if (reglen < sz) {
337  memset((void *)regcache->values[reg],0,sz);
338  memcpy((void *)regcache->values[reg],regdata,reglen);
339  }
340  else
341  memcpy((void *)regcache->values[reg],regdata,sz);
342  }
343  else {
344  if (reglen < sizeof(*regcache->values)) {
345  memset(&regcache->values[reg],0,sizeof(*regcache->values));
346  memcpy(regdata,&regcache->values[reg],reglen);
347  }
348  else
349  regcache->values[reg] = *(REGVAL *)regdata;
350  }
351 
352  if (!(regcache->flags[reg] & REGCACHE_VALID))
353  ++regcache->valid;
354  regcache->flags[reg] |= REGCACHE_VALID;
355 
356  return 0;
357 }
358 
360  void *regdata,unsigned int reglen) {
361  CHECKREG();
362 
363  /* XXX: should we insist it's init'd first? Yes. */
364  if (regcache->flags[reg] & REGCACHE_VALID) {
366  "reg %d not valid; cannot write unless loaded first!\n",reg);
367  errno = EINVAL;
368  return -1;
369  }
370 
371  if (regcache->flags[reg] & REGCACHE_ALLOC) {
372  unsigned int sz = arch_regsize(regcache->arch,reg);
373 
374  if (reglen < sz) {
375  memset((void *)regcache->values[reg],0,sz);
376  memcpy((void *)regcache->values[reg],regdata,reglen);
377  }
378  else
379  memcpy((void *)regcache->values[reg],regdata,sz);
380  }
381  else {
382  if (reglen < sizeof(*regcache->values)) {
383  memset(&regcache->values[reg],0,sizeof(*regcache->values));
384  memcpy(regdata,&regcache->values[reg],reglen);
385  }
386  else
387  regcache->values[reg] = *(REGVAL *)regdata;
388  }
389 
390  regcache->flags[reg] |= REGCACHE_DIRTY;
391  ++regcache->dirty;
392 
393  return 0;
394 }
395 
397  void **regdata,unsigned int *reglen) {
398  CHECKREG();
399 
400  /* XXX: should we insist it's init'd first? Yes. */
401  if (regcache->flags[reg] & REGCACHE_VALID) {
403  "reg %d not valid; cannot read unless loaded first!\n",reg);
404  errno = EINVAL;
405  return -1;
406  }
407 
408  if (regcache->flags[reg] & REGCACHE_ALLOC) {
409  unsigned int sz = arch_regsize(regcache->arch,reg);
410 
411  *regdata = (void **)&regcache->values[reg];
412  *reglen = sz;
413  }
414  else {
415  *regdata = &regcache->values[reg];
416  *reglen = sizeof(*regcache->values);
417  }
418 
419  return 0;
420 }
421 
423  GHashTable *retval = NULL;
424  int j;
425  int sz;
426  void *copy;
427 
428  retval = g_hash_table_new_full(g_str_hash,g_str_equal,NULL,free);
429 
430  for (j = 0; j < regcache->arch->regcount; ++j) {
431  if (!(regcache->flags[j] & REGCACHE_VALID)) {
432  if (regcache->flags[j] & REGCACHE_PRINT_DEFAULTS) {
433  g_hash_table_insert(retval,
434  (gpointer)arch_regname(regcache->arch,j),
435  calloc(1,sizeof(REGVAL)));
436  }
437  else {
438  continue;
439  }
440  }
441  else {
442  sz = arch_regsize(regcache->arch,j);
443  if (sz > (int)sizeof(REGVAL)) {
444  copy = malloc(sz);
445  memcpy(copy,(void *)regcache->values[j],sz);
446  }
447  else {
448  copy = malloc(sizeof(REGVAL));
449  memcpy(copy,(void *)&regcache->values[j],sizeof(REGVAL));
450  }
451  g_hash_table_insert(retval,
452  (gpointer)arch_regname(regcache->arch,j),copy);
453  }
454  }
455 
456  return retval;
457 }
458 
459 int regcache_snprintf(struct regcache *regcache,char *buf,int bufsiz,
460  int detail,char *sep,char *kvsep,int flags) {
461  int rc = 0;
462  int i,j,k;
463  int sz;
464  int has_levels = 0;
465  REG reg;
466 
467  if (detail < 0)
468  return 0;
469 
470  for (i = 0; i < ARCH_SNPRINTF_DETAIL_LEVELS; ++i) {
471  if (regcache->arch->snprintf_ordering[i])
472  ++has_levels;
473  }
474 
475  if (has_levels) {
476  if (bufsiz > 0)
477  buf[0] = '\0';
478  for (i = 0;
479  i <= regcache->arch->max_snprintf_ordering && detail >= i;
480  ++i) {
481  for (j = 0; regcache->arch->snprintf_ordering[i][j] > -1; ++j) {
482  reg = regcache->arch->snprintf_ordering[i][j];
483 
484  if (!(regcache->flags[reg] & REGCACHE_VALID)
485  && !(flags & REGCACHE_PRINT_DEFAULTS))
486  continue;
487 
488  sz = arch_regsize(regcache->arch,reg);
489  if (regcache->flags[reg] & REGCACHE_ALLOC) {
490  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
491  (rc >= bufsiz) ? 0 :bufsiz - rc,
492  "%s%s%s0x",
493  sep,arch_regname(regcache->arch,reg),kvsep);
494  uint8_t *data = (uint8_t *)regcache->values[reg];
495  for (k = 0; k < sz; ++k) {
496  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
497  (rc >= bufsiz) ? 0 :bufsiz - rc,
498  "%02hhx",data[k]);
499  }
500  }
501  else if (sz == 1) {
502  if (flags & REGCACHE_PRINT_PADDING)
503  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
504  (rc >= bufsiz) ? 0 :bufsiz - rc,
505  "%s%s%s0x%02hhx",
506  sep,arch_regname(regcache->arch,reg),
507  kvsep,(uint8_t)regcache->values[reg]);
508  else
509  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
510  (rc >= bufsiz) ? 0 :bufsiz - rc,
511  "%s%s%s0x%hhx",
512  sep,arch_regname(regcache->arch,reg),
513  kvsep,(uint8_t)regcache->values[reg]);
514  }
515  else if (sz == 2) {
516  if (flags & REGCACHE_PRINT_PADDING)
517  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
518  (rc >= bufsiz) ? 0 :bufsiz - rc,
519  "%s%s%s0x%04hx",
520  sep,arch_regname(regcache->arch,reg),
521  kvsep,(uint16_t)regcache->values[reg]);
522  else
523  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
524  (rc >= bufsiz) ? 0 :bufsiz - rc,
525  "%s%s%s0x%hx",
526  sep,arch_regname(regcache->arch,reg),
527  kvsep,(uint16_t)regcache->values[reg]);
528  }
529  else if (sz == 4) {
530  if (flags & REGCACHE_PRINT_PADDING)
531  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
532  (rc >= bufsiz) ? 0 :bufsiz - rc,
533  "%s%s%s0x%08x",
534  sep,arch_regname(regcache->arch,reg),
535  kvsep,(uint32_t)regcache->values[reg]);
536  else
537  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
538  (rc >= bufsiz) ? 0 :bufsiz - rc,
539  "%s%s%s0x%x",
540  sep,arch_regname(regcache->arch,reg),
541  kvsep,(uint32_t)regcache->values[reg]);
542  }
543  else if (sz == 8) {
544  if (flags & REGCACHE_PRINT_PADDING)
545  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
546  (rc >= bufsiz) ? 0 :bufsiz - rc,
547  "%s%s%s0x%16lx",
548  sep,arch_regname(regcache->arch,reg),
549  kvsep,(uint64_t)regcache->values[reg]);
550  else
551  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
552  (rc >= bufsiz) ? 0 :bufsiz - rc,
553  "%s%s%s0x%lx",
554  sep,arch_regname(regcache->arch,reg),
555  kvsep,(uint64_t)regcache->values[reg]);
556  }
557  }
558  }
559  }
560  else {
561  if (bufsiz > 0)
562  buf[0] = '\0';
563  /* Just print them all in arch order. */
564  for (j = 0; j < regcache->arch->regcount; ++j) {
565  if (!(regcache->flags[j] & REGCACHE_VALID)
566  && !(flags & REGCACHE_PRINT_DEFAULTS))
567  continue;
568 
569  sz = arch_regsize(regcache->arch,j);
570  if (sz <= 0)
571  continue;
572 
573  if (regcache->flags[j] & REGCACHE_ALLOC) {
574  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
575  (rc >= bufsiz) ? 0 :bufsiz - rc,
576  "%s%s%s0x",
577  sep,arch_regname(regcache->arch,j),kvsep);
578  uint8_t *data = (uint8_t *)regcache->values[j];
579  for (k = 0; k < sz; ++k) {
580  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
581  (rc >= bufsiz) ? 0 :bufsiz - rc,
582  "%02hhx",data[k]);
583  }
584  }
585  else if (sz == 1) {
586  if (flags & REGCACHE_PRINT_PADDING)
587  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
588  (rc >= bufsiz) ? 0 :bufsiz - rc,
589  "%s%s%s0x%02hhx",
590  sep,arch_regname(regcache->arch,j),kvsep,
591  (uint8_t)regcache->values[j]);
592  else
593  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
594  (rc >= bufsiz) ? 0 :bufsiz - rc,
595  "%s%s%s0x%hhx",
596  sep,arch_regname(regcache->arch,j),kvsep,
597  (uint8_t)regcache->values[j]);
598  }
599  else if (sz == 2) {
600  if (flags & REGCACHE_PRINT_PADDING)
601  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
602  (rc >= bufsiz) ? 0 :bufsiz - rc,
603  "%s%s%s0x%04hx",
604  sep,arch_regname(regcache->arch,j),kvsep,
605  (uint16_t)regcache->values[j]);
606  else
607  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
608  (rc >= bufsiz) ? 0 :bufsiz - rc,
609  "%s%s%s0x%hx",
610  sep,arch_regname(regcache->arch,j),kvsep,
611  (uint16_t)regcache->values[j]);
612  }
613  else if (sz == 4) {
614  if (flags & REGCACHE_PRINT_PADDING)
615  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
616  (rc >= bufsiz) ? 0 :bufsiz - rc,
617  "%s%s%s0x%08x",
618  sep,arch_regname(regcache->arch,j),kvsep,
619  (uint32_t)regcache->values[j]);
620  else
621  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
622  (rc >= bufsiz) ? 0 :bufsiz - rc,
623  "%s%s%s0x%x",
624  sep,arch_regname(regcache->arch,j),kvsep,
625  (uint32_t)regcache->values[j]);
626  }
627  else if (sz == 8) {
628  if (flags & REGCACHE_PRINT_PADDING)
629  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
630  (rc >= bufsiz) ? 0 :bufsiz - rc,
631  "%s%s%s0x%16lx",
632  sep,arch_regname(regcache->arch,j),kvsep,
633  (uint64_t)regcache->values[j]);
634  else
635  rc += snprintf((rc >= bufsiz) ? NULL : buf + rc,
636  (rc >= bufsiz) ? 0 :bufsiz - rc,
637  "%s%s%s0x%lx",
638  sep,arch_regname(regcache->arch,j),kvsep,
639  (uint64_t)regcache->values[j]);
640  }
641  }
642  }
643 
644  return rc;
645 }
struct arch * arch
Definition: regcache.h:36
struct regcache * regcache_create(struct arch *arch)
Definition: regcache.c:29
#define vwarnopt(level, area, flags, format,...)
Definition: log.h:37
int max_snprintf_ordering
Definition: arch.h:146
void regcache_mark_flushed(struct regcache *regcache)
Definition: regcache.c:118
int dirty
Definition: regcache.h:53
#define REGCACHE_PRINT_PADDING
Definition: regcache.h:108
int regcache_read_reg_len(struct regcache *regcache, REG reg, void **regdata, unsigned int *reglen)
Definition: regcache.c:396
int regcache_init_reg(struct regcache *regcache, REG reg, REGVAL regval)
Definition: regcache.c:153
int regcache_write_reg(struct regcache *regcache, REG reg, REGVAL regval)
Definition: regcache.c:240
#define PRIiREG
Definition: common.h:94
static uint64_t unsigned int i
int valid
Definition: regcache.h:51
#define CHECKREG()
Definition: regcache.c:146
int values_len
Definition: regcache.h:64
unsigned int arch_regsize(struct arch *arch, REG reg)
Definition: arch.c:44
void regcache_destroy(struct regcache *regcache)
Definition: regcache.c:42
void regcache_zero(struct regcache *regcache)
Definition: regcache.c:101
int regcache_isdirty_reg_range(struct regcache *regcache, REG start, REG end)
Definition: regcache.c:212
int regcache_read_reg(struct regcache *regcache, REG reg, REGVAL *regval)
Definition: regcache.c:271
int regcount
Definition: arch.h:128
#define verror(format,...)
Definition: log.h:30
int * snprintf_ordering[ARCH_SNPRINTF_DETAIL_LEVELS]
Definition: arch.h:145
int regcache_isdirty(struct regcache *regcache)
Definition: regcache.c:236
#define REGCACHE_ALLOC
Definition: regcache.h:33
#define vwarn(format,...)
Definition: log.h:33
void free(void *ptr)
Definition: debugserver.c:207
int regcache_copy_all(struct regcache *sregcache, struct regcache *dregcache)
Definition: regcache.c:58
int arch_has_reg(struct arch *arch, REG reg)
Definition: arch.c:36
Definition: log.h:68
int flags_len
Definition: regcache.h:69
uint8_t * flags
Definition: regcache.h:70
const char * arch_regname(struct arch *arch, REG reg)
Definition: arch.c:51
int regcache_write_reg_len(struct regcache *regcache, REG reg, void *regdata, unsigned int reglen)
Definition: regcache.c:359
#define vdebug(devel, areas, flags, format,...)
Definition: log.h:302
REGVAL * values
Definition: regcache.h:63
int regcache_isdirty_reg(struct regcache *regcache, REG reg)
Definition: regcache.c:202
void * calloc(size_t nmemb, size_t size)
Definition: debugserver.c:200
int done_loading
Definition: regcache.h:46
int regcache_read_reg_ifdirty(struct regcache *regcache, REG reg, REGVAL *regval)
Definition: regcache.c:299
uint32_t REGVAL
Definition: common.h:66
GHashTable * regcache_copy_registers(struct regcache *regcache)
Definition: regcache.c:422
int8_t REG
Definition: common.h:93
int regcache_init_done(struct regcache *regcache)
Definition: regcache.c:189
Definition: arch.h:116
int regcache_copy_dirty(struct regcache *sregcache, struct regcache *dregcache)
Definition: regcache.c:75
#define REGCACHE_DIRTY
Definition: regcache.h:31
#define REGCACHE_PRINT_DEFAULTS
Definition: regcache.h:107
void * malloc(size_t size)
Definition: debugserver.c:214
int regcache_snprintf(struct regcache *regcache, char *buf, int bufsiz, int detail, char *sep, char *kvsep, int flags)
Definition: regcache.c:459
#define REGCACHE_VALID
Definition: regcache.h:32
#define ARCH_SNPRINTF_DETAIL_LEVELS
Definition: arch.h:114
int regcache_init_reg_len(struct regcache *regcache, REG reg, void *regdata, unsigned int reglen)
Definition: regcache.c:323
void regcache_invalidate(struct regcache *regcache)
Definition: regcache.c:127
#define PRIxREGVAL
Definition: common.h:72