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
memory.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011, 2012, 2013, 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 "common.h"
20 #include "glib_wrapper.h"
21 #include "target.h"
22 #include "binfile.h"
23 #include <assert.h>
24 
25 /*
26  * Address spaces.
27  */
28 /*
29  * Creates an address space.
30  *
31  * You must supply some sort of unique combo of name:id -- these
32  * values form the unique internal ID for an address space. They don't
33  * actually have to mean anything, unless you are using a target that
34  * cares about those values.
35  *
36  * For instance, a linux_userproc target requires the pid field. The
37  * linux_corefile target doesn't require any of the fields. The
38  * linux_vmprobes target requires both id (the xen guest domain id) and
39  * pid (0 means kernel; > 0 means a userspace process in the guest).
40  */
42  char *name,ADDR tag) {
43  struct addrspace *retval;
44 
45  assert(name);
46 
47  retval = (struct addrspace *)malloc(sizeof(struct addrspace));
48  if (!retval) {
49  errno = ENOMEM;
50  return NULL;
51  }
52 
53  memset(retval,0,sizeof(*retval));
54 
55  retval->name = strdup(name);
56  retval->tag = tag;
57 
58  if (target) {
59  target_attach_space(target,retval);
60  retval->target = target;
61  RHOLDW(target,retval);
62  }
63 
64  vdebug(5,LA_TARGET,LF_SPACE,"built addrspace(%s:0x%"PRIxADDR")\n",name,tag);
65 
66  return retval;
67 }
68 
70  GList *tmp;
71  struct memregion *region;
72 
73  tmp = NULL;
74  v_g_list_foreach(space->regions,tmp,region) {
75  if (region->name && strcmp(name,region->name) == 0)
76  goto out;
77  }
78  return NULL;
79  out:
80  return region;
81 }
82 
83 int addrspace_attach_region(struct addrspace *space,struct memregion *region) {
84  RHOLD(region,space);
85  space->regions = g_list_append(space->regions,region);
86  return 0;
87 }
88 
89 int addrspace_detach_region(struct addrspace *space,struct memregion *region) {
90  GList *t1;
91  REFCNT trefcnt;
92 
93  if (region->space != space) {
94  errno = EINVAL;
95  return -1;
96  }
97 
98  t1 = g_list_find(space->regions,region);
99  if (!t1) {
100  errno = ESRCH;
101  return -1;
102  }
103 
104  space->regions = g_list_remove_link(space->regions,t1);
105 
106  RPUT(region,memregion,space,trefcnt);
107 
108  return 0;
109 }
110 
112  region_type_t rtype,char *name) {
113  GList *tmp;
114  struct memregion *region;
115 
116  tmp = NULL;
117  v_g_list_foreach(space->regions,tmp,region) {
118  if (region->type == rtype && strcmp(name,region->name) == 0)
119  goto out;
120  }
121  return NULL;
122  out:
123  return region;
124 }
125 
127  region_type_t rtype,ADDR start) {
128  GList *tmp;
129  struct memregion *region;
130 
131  tmp = NULL;
132  v_g_list_foreach(space->regions,tmp,region) {
133  if (region->type == rtype && region->base_load_addr == start)
134  goto out;
135  }
136  return NULL;
137  out:
138  return region;
139 }
140 
142  struct memregion **region_saveptr,
143  struct memrange **range_saveptr) {
144  GList *tmp;
145  struct memregion *region;
146  struct memrange *range;
147 
148  v_g_list_foreach(space->regions,tmp,region) {
149  if ((range = memregion_find_range_real(region,addr))) {
150  if (region_saveptr)
151  *region_saveptr = region;
152  if (range_saveptr)
153  *range_saveptr = range;
154  goto out;
155  }
156  }
157  return 0;
158  out:
159  return 1;
160 }
161 
163  obj_flags_t orf,obj_flags_t nandf) {
164  struct memregion *region;
165  GList *t1;
166 
167  /* Ranges have no children, so stop here. */
168  v_g_list_foreach(space->regions,t1,region) {
169  region->obj_flags |= orf;
170  region->obj_flags &= ~nandf;
171  memregion_obj_flags_propagate(region,orf,nandf);
172  }
173 }
174 
175 REFCNT addrspace_free(struct addrspace *space,int force) {
176  GList *t1,*t2;
177  struct memregion *lpc;
178  REFCNT retval = space->refcnt;
179  REFCNT trefcnt;
180 
181  assert(space);
182 
183  if (space->refcnt) {
184  if (!force) {
185  verror("cannot free (%d refs) space(%s:0x%"PRIxADDR")\n",
186  space->refcnt,space->name,space->tag);
187  return space->refcnt;
188  }
189  else {
190  vwarn("forced free (%d refs) space(%s:0x%"PRIxADDR")\n",
191  space->refcnt,space->name,space->tag);
192  }
193  }
194 
195  /* NB: take a temp ref so that any RPUTWs don't double-call; see common.h */
196  RWGUARD(space);
197 
199  "freeing space(%s:0x%"PRIxADDR")\n",space->name,space->tag);
200 
201  v_g_list_foreach_safe(space->regions,t1,t2,lpc) {
202  RPUT(lpc,memregion,space,trefcnt);
203  if (trefcnt == 0) {
204  v_g_list_foreach_remove(space->regions,t1,t2);
205  }
206  }
207 
208  if (space->refcntw) {
209  if (!force) {
210  verror("cannot free (%d wrefs) space(%s:0x%"PRIxADDR")\n",
211  space->refcntw,space->name,space->tag);
212  return space->refcntw;
213  }
214  else {
215  vwarn("forced free (%d wrefs) space(%s:0x%"PRIxADDR")\n",
216  space->refcntw,space->name,space->tag);
217 
218  v_g_list_foreach_safe(space->regions,t1,t2,lpc) {
219  lpc->space = NULL;
220  }
221  }
222 
223  if (retval <= 0)
224  retval = space->refcntw;
225  }
226 
227  if (space->target) {
228  RPUTW(space->target,target,space,trefcnt);
229  }
230 
231  g_list_free(space->regions);
232  space->regions = NULL;
233  free(space->name);
234  free(space);
235 
236  return retval;
237 }
238 
239 /*
240  * Memory regions and ranges.
241  */
243  region_type_t type,char *name) {
244  struct memregion *retval;
245 
246  retval = (struct memregion *)calloc(1,sizeof(*retval));
247  if (!retval)
248  return NULL;
249 
250  memset(retval,0,sizeof(*retval));
251 
252  if (name)
253  retval->name = strdup(name);
254  retval->type = type;
255 
256  retval->debugfiles = g_hash_table_new(g_str_hash,g_str_equal);
257 
258  if (!retval->debugfiles) {
259  if (retval->name)
260  free(retval->name);
261  free(retval);
262  return NULL;
263  }
264 
265  if (space) {
266  addrspace_attach_region(space,retval);
267  retval->space = space;
268  RHOLDW(space,retval);
269  }
270 
271  /* Set this to ADDRMAX so when we add ranges, we can find the lowest
272  * range start addr.
273  */
274  retval->base_load_addr = ADDRMAX;
275  /* Set these to 0; default case; when we load debugfiles for
276  * regions, we can update them.
277  */
278  retval->base_phys_addr = 0;
279  retval->base_virt_addr = 0;
280 
281  vdebug(5,LA_TARGET,LF_REGION,"built memregion(%s:0x%"PRIxADDR":%s:%s)\n",
282  space->name,space->tag,retval->name,REGION_TYPE(retval->type));
283 
284  return retval;
285 }
286 
287 int memregion_attach_range(struct memregion *region,struct memrange *range) {
288  RHOLD(range,region);
289  region->ranges = g_list_append(region->ranges,range);
290  return 0;
291 }
292 
293 int memregion_detach_range(struct memregion *region,struct memrange *range) {
294  GList *t1;
295  REFCNT trefcnt;
296 
297  if (range->region != region) {
298  errno = EINVAL;
299  return -1;
300  }
301 
302  t1 = g_list_find(region->ranges,range);
303  if (!t1) {
304  errno = ESRCH;
305  return -1;
306  }
307 
308  region->ranges = g_list_remove_link(region->ranges,t1);
309 
310  RPUT(range,memrange,region,trefcnt);
311 
312  return 0;
313 }
314 
316  GList *t1;
317  struct memrange *range;
318 
319  v_g_list_foreach(region->ranges,t1,range) {
320  if (range->start == start)
321  return range;
322  }
323 
324  return NULL;
325 }
326 
328  GList *t1;
329  struct memrange *range;
330 
331  v_g_list_foreach(region->ranges,t1,range) {
332  if (memrange_contains_real(range,addr))
333  return 1;
334  }
335 
336  return 0;
337 }
338 
340  ADDR real_addr) {
341  GList *t1;
342  struct memrange *range;
343 
344  v_g_list_foreach(region->ranges,t1,range) {
345  if (memrange_contains_real(range,real_addr)) {
346  vdebug(9,LA_TARGET,LF_REGION,"lookup real(0x%"PRIxADDR") found memrange"
347  " (%s:%s:0x%"PRIxADDR",0x%"PRIxADDR",%"PRIiOFFSET",%u)\n",
348  real_addr,range->region->name,REGION_TYPE(range->region->type),
349  range->start,range->end,range->offset,range->prot_flags);
350  return range;
351  }
352  }
353 
354  return NULL;
355 }
356 
358  ADDR obj_addr) {
359  GList *t1;
360  struct memrange *range;
361 
362  v_g_list_foreach(region->ranges,t1,range) {
363  if (memrange_contains_obj(range,obj_addr)) {
364  vdebug(9,LA_TARGET,LF_REGION,"lookup obj(0x%"PRIxADDR") found memrange"
365  " (%s:%s:0x%"PRIxADDR",0x%"PRIxADDR",%"PRIiOFFSET",%u)\n",
366  obj_addr,range->region->name,REGION_TYPE(range->region->type),
367  range->start,range->end,range->offset,range->prot_flags);
368  return range;
369  }
370  }
371 
372  return NULL;
373 }
374 
376  struct memrange **range_saveptr) {
377  GList *t1;
378  struct memrange *range;
379 
380  v_g_list_foreach(region->ranges,t1,range) {
381  if (memrange_contains_obj(range,obj_addr)) {
382  vdebug(9,LA_TARGET,LF_REGION,"relocate obj(0x%"PRIxADDR") found memrange"
383  " (%s:%s:0x%"PRIxADDR",0x%"PRIxADDR",%"PRIiOFFSET",%u)\n",
384  obj_addr,range->region->name,REGION_TYPE(range->region->type),
385  range->start,range->end,range->offset,range->prot_flags);
386  if (range_saveptr)
387  *range_saveptr = range;
388  return memrange_relocate(range,obj_addr);
389  }
390  else {
391  vdebug(9,LA_TARGET,LF_REGION,"obj(0x%"PRIxADDR") not found in memrange"
392  " (%s:%s:0x%"PRIxADDR",0x%"PRIxADDR",%"PRIiOFFSET",%u)\n",
393  obj_addr,range->region->name,REGION_TYPE(range->region->type),
394  range->start,range->end,range->offset,range->prot_flags);
395  }
396  }
397 
398  errno = ESRCH;
399  return 0;
400 }
401 
403  struct memrange **range_saveptr) {
404  GList *t1;
405  struct memrange *range;
406 
407  v_g_list_foreach(region->ranges,t1,range) {
408  if (memrange_contains_real(range,real_addr)) {
409  vdebug(9,LA_TARGET,LF_REGION,"unrelocate real(0x%"PRIxADDR") found memrange"
410  " (%s:%s:0x%"PRIxADDR",0x%"PRIxADDR",%"PRIiOFFSET",%u)\n",
411  real_addr,range->region->name,REGION_TYPE(range->region->type),
412  range->start,range->end,range->offset,range->prot_flags);
413  if (range_saveptr)
414  *range_saveptr = range;
415  return memrange_unrelocate(range,real_addr);
416  }
417  else {
418  vdebug(9,LA_TARGET,LF_REGION,"real(0x%"PRIxADDR") not found in memrange"
419  " (%s:%s:0x%"PRIxADDR",0x%"PRIxADDR",%"PRIiOFFSET",%u)\n",
420  real_addr,range->region->name,REGION_TYPE(range->region->type),
421  range->start,range->end,range->offset,range->prot_flags);
422  }
423  }
424  errno = ESRCH;
425  return 0;
426 }
427 
428 void memregion_dump(struct memregion *region,struct dump_info *ud) {
429  fprintf(ud->stream,"%sregion(%s:%s)",
430  ud->prefix,REGION_TYPE(region->type),region->name);
431 }
432 
434  obj_flags_t orf,obj_flags_t nandf) {
435  struct memrange *range;
436  GList *t1;
437 
438  /* Ranges have no children, so stop here. */
439  v_g_list_foreach(region->ranges,t1,range) {
440  range->obj_flags |= orf;
441  range->obj_flags &= ~nandf;
442  }
443 }
444 
445 REFCNT memregion_free(struct memregion *region,int force) {
446  struct memrange *range;
447  GHashTableIter iter;
448  gpointer key;
449  struct debugfile *debugfile;
450  REFCNT trefcnt;
451  REFCNT retval = region->refcnt;
452  GList *t1,*t2;
453 
454  assert(region);
455 
456  if (region->refcnt) {
457  if (!force) {
458  verror("cannot free (%d refs) memregion(%s:0x%"PRIxADDR":%s:%s)\n",
459  region->refcnt,region->space->name,region->space->tag,
460  region->name,REGION_TYPE(region->type));
461  return region->refcnt;
462  }
463  else {
464  vwarn("forced free (%d refs) memregion(%s:0x%"PRIxADDR":%s:%s)\n",
465  region->refcnt,region->space->name,region->space->tag,
466  region->name,REGION_TYPE(region->type));
467  }
468  }
469 
470  /* NB: take a temp ref so that any RPUTWs don't double-call; see common.h */
471  RWGUARD(region);
472 
473  vdebug(5,LA_TARGET,LF_REGION,"freeing memregion(%s:0x%"PRIxADDR":%s:%s)\n",
474  region->space->name,region->space->tag,
475  region->name,REGION_TYPE(region->type));
476 
477  v_g_list_foreach_safe(region->ranges,t1,t2,range) {
478  RPUT(range,memrange,region,trefcnt);
479  if (trefcnt == 0) {
480  v_g_list_foreach_remove(region->ranges,t1,t2);
481  }
482  }
483 
484  if (region->refcntw) {
485  if (!force) {
486  verror("cannot free (%d wrefs) memregion(%s:0x%"PRIxADDR":%s:%s)\n",
487  region->refcntw,region->space->name,region->space->tag,
488  region->name,REGION_TYPE(region->type));
489  return region->refcntw;
490  }
491  else {
492  vwarn("forced free (%d wrefs) memregion(%s:0x%"PRIxADDR":%s:%s)\n",
493  region->refcntw,region->space->name,region->space->tag,
494  region->name,REGION_TYPE(region->type));
495 
496  v_g_list_foreach_safe(region->ranges,t1,t2,range) {
497  range->region = NULL;
498  }
499  }
500 
501  if (retval <= 0)
502  retval = region->refcntw;
503  }
504 
505  if (region->binfile) {
506  RPUT(region->binfile,binfile,region,trefcnt);
507  region->binfile = NULL;
508  }
509 
510  if (region->debugfiles) {
511  g_hash_table_iter_init(&iter,region->debugfiles);
512  while (g_hash_table_iter_next(&iter,
513  (gpointer)&key,(gpointer)&debugfile)) {
514  RPUT(debugfile,debugfile,region,trefcnt);
515  /* This is probably a violation of the hashtable usage
516  * principles, but oh well!
517  */
518  //free(key);
519  }
520  g_hash_table_destroy(region->debugfiles);
521  region->debugfiles = NULL;
522  }
523 
524  if (region->space) {
525  RPUTW(region->space,addrspace,region,trefcnt);
526  region->space = NULL;
527  }
528 
529  if (region->name) {
530  free(region->name);
531  region->name = NULL;
532  }
533  free(region);
534 
535  return retval;
536 }
537 
540  unsigned int prot_flags) {
541  struct memrange *retval;
542 
543  retval = (struct memrange *)malloc(sizeof(*retval));
544  if (!retval)
545  return NULL;
546 
547  memset(retval,0,sizeof(*retval));
548 
549  retval->start = start;
550  retval->end = end;
551  retval->offset = offset;
552  retval->prot_flags = prot_flags;
553 
554  if (start < region->base_load_addr)
555  region->base_load_addr = start;
556 
557  if (region) {
558  memregion_attach_range(region,retval);
559  RHOLDW(region,retval);
560  retval->region = region;
561  }
562 
564  "built memregion(%s:%s:0x%"PRIxADDR",0x%"PRIxADDR",%"PRIiOFFSET",%u)\n",
565  region->name,REGION_TYPE(region->type),start,end,offset,prot_flags);
566 
567  return retval;
568 }
569 
571  return range->region;
572 }
573 
575  return (range->region) ? range->region->space : NULL;
576 }
577 
579  return (range->region
580  && range->region->space) ? range->region->space->target : NULL;
581 }
582 
583 int memrange_contains_real(struct memrange *range,ADDR real_addr) {
584  return (range->start <= real_addr && real_addr < range->end ? 1 : 0);
585 }
586 
587 int memrange_contains_obj(struct memrange *range,ADDR obj_addr) {
588  return memrange_contains_real(range,obj_addr + range->region->phys_offset);
589 }
590 
591 void memrange_dump(struct memrange *range,struct dump_info *ud) {
592  fprintf(ud->stream,
593  "%srange(%s:%s:0x%"PRIxADDR",0x%"PRIxADDR",%"PRIiOFFSET")",
594  ud->prefix,REGION_TYPE(range->region->type),range->region->name,
595  range->start,range->end,range->offset);
596 }
597 
599  return real - range->region->phys_offset;
600 }
601 
603  return obj + range->region->phys_offset;
604 }
605 
607  obj_flags_t orf,obj_flags_t nandf) {
608  /* We have no children. */
609  return;
610 }
611 
612 REFCNT memrange_free(struct memrange *range,int force) {
613  REFCNT retval = range->refcnt;
614  REFCNT trefcnt;
615 
616  assert(range);
617 
618  if (range->refcnt) {
619  if (!force) {
620  verror("cannot free (%d refs) memrange(%s:%s:0x%"PRIxADDR","
621  "0x%"PRIxADDR",%"PRIiOFFSET",%u)\n",
622  range->refcnt,range->region->name,
623  REGION_TYPE(range->region->type),range->start,range->end,
624  range->offset,range->prot_flags);
625  return range->refcnt;
626  }
627  else {
628  vwarn("forced free (%d refs) memrange(%s:%s:0x%"PRIxADDR","
629  "0x%"PRIxADDR",%"PRIiOFFSET",%u)\n",
630  range->refcnt,range->region->name,
631  REGION_TYPE(range->region->type),range->start,range->end,
632  range->offset,range->prot_flags);
633  }
634  }
635 
636  /* NB: take a temp ref so that any RPUTWs don't double-call; see common.h */
637  RWGUARD(range);
638 
640  "freeing memrange(%s:%s:0x%"PRIxADDR",0x%"PRIxADDR",%"PRIiOFFSET",%u)\n",
641  range->region->name,REGION_TYPE(range->region->type),
642  range->start,range->end,range->offset,range->prot_flags);
643 
644  if (range->region) {
645  RPUTW(range->region,memregion,range,trefcnt);
646  }
647 
648  retval = range->refcnt;
649 
650  free(range);
651 
652  return retval;
653 }
#define RPUTW(x, objtype, hx, rc)
Definition: common.h:628
int addrspace_detach_region(struct addrspace *space, struct memregion *region)
Definition: memory.c:89
int memregion_contains_real(struct memregion *region, ADDR addr)
Definition: memory.c:327
REFCNT memrange_free(struct memrange *range, int force)
Definition: memory.c:612
#define PRIiOFFSET
Definition: common.h:70
obj_flags_t obj_flags
Definition: target.h:942
int addrspace_attach_region(struct addrspace *space, struct memregion *region)
Definition: memory.c:83
#define RHOLDW(x, hx)
Definition: common.h:623
ADDR memregion_unrelocate(struct memregion *region, ADDR real_addr, struct memrange **range_saveptr)
Definition: memory.c:402
void memrange_dump(struct memrange *range, struct dump_info *ud)
Definition: memory.c:591
void addrspace_obj_flags_propagate(struct addrspace *space, obj_flags_t orf, obj_flags_t nandf)
Definition: memory.c:162
int addrspace_find_range_real(struct addrspace *space, ADDR addr, struct memregion **region_saveptr, struct memrange **range_saveptr)
Definition: memory.c:141
int memregion_attach_range(struct memregion *region, struct memrange *range)
Definition: memory.c:287
int memregion_detach_range(struct memregion *region, struct memrange *range)
Definition: memory.c:293
#define v_g_list_foreach_remove(glhead, glcur, glnext)
Definition: glib_wrapper.h:55
ADDR end
Definition: target.h:995
#define v_g_list_foreach(glhead, glcur, elm)
Definition: glib_wrapper.h:34
int memrange_contains_obj(struct memrange *range, ADDR obj_addr)
Definition: memory.c:587
char * name
Definition: target.h:939
#define assert(x)
Definition: dlmalloc.c:1456
struct target * target
Definition: target.h:895
OFFSET phys_offset
Definition: target.h:987
int32_t OFFSET
Definition: common.h:65
ADDR start
Definition: target.h:994
#define verror(format,...)
Definition: log.h:30
int target_attach_space(struct target *target, struct addrspace *space)
Definition: target.c:4588
GHashTable * debugfiles
Definition: target.h:956
struct memrange * memregion_find_range_obj(struct memregion *region, ADDR obj_addr)
Definition: memory.c:357
struct memregion * memregion_create(struct addrspace *space, region_type_t type, char *name)
Definition: memory.c:242
ADDR base_phys_addr
Definition: target.h:977
REFCNT refcnt
Definition: target.h:911
#define vwarn(format,...)
Definition: log.h:33
#define ADDRMAX
Definition: common.h:74
void free(void *ptr)
Definition: debugserver.c:207
struct memregion * memrange_region(struct memrange *range)
Definition: memory.c:570
char * prefix
Definition: output.h:25
struct memrange * memrange_create(struct memregion *region, ADDR start, ADDR end, OFFSET offset, unsigned int prot_flags)
Definition: memory.c:538
REFCNT memregion_free(struct memregion *region, int force)
Definition: memory.c:445
void memregion_dump(struct memregion *region, struct dump_info *ud)
Definition: memory.c:428
struct memregion * addrspace_match_region_start(struct addrspace *space, region_type_t rtype, ADDR start)
Definition: memory.c:126
region_type_t
struct addrspace * space
Definition: target.h:937
struct memrange * memregion_find_range_real(struct memregion *region, ADDR real_addr)
Definition: memory.c:339
REFCNT refcntw
Definition: target.h:912
REFCNT refcntw
Definition: target.h:944
obj_flags_t obj_flags
Definition: target.h:999
struct memregion * addrspace_match_region_name(struct addrspace *space, region_type_t rtype, char *name)
Definition: memory.c:111
void memregion_obj_flags_propagate(struct memregion *region, obj_flags_t orf, obj_flags_t nandf)
Definition: memory.c:433
struct memrange * memregion_match_range(struct memregion *region, ADDR start)
Definition: memory.c:315
struct target * memrange_target(struct memrange *range)
Definition: memory.c:578
ADDR tag
Definition: target.h:897
#define RHOLD(x, hx)
Definition: common.h:622
#define v_g_list_foreach_safe(glhead, glcur, glnext, elm)
Definition: glib_wrapper.h:46
#define vdebug(devel, areas, flags, format,...)
Definition: log.h:302
ADDR memrange_unrelocate(struct memrange *range, ADDR real)
Definition: memory.c:598
obj_flags_t
Definition: object.h:43
FILE * stream
Definition: output.h:26
struct memregion * region
Definition: target.h:992
ADDR offset
Definition: target.h:996
unsigned int prot_flags
Definition: target.h:997
void * calloc(size_t nmemb, size_t size)
Definition: debugserver.c:200
#define REGION_TYPE(n)
Definition: target_api.h:384
Definition: log.h:70
GList * ranges
Definition: target.h:947
int memrange_contains_real(struct memrange *range, ADDR real_addr)
Definition: memory.c:583
struct addrspace * memrange_space(struct memrange *range)
Definition: memory.c:574
Definition: log.h:164
uint32_t ADDR
Definition: common.h:64
char * name
Definition: target.h:898
Definition: log.h:163
ADDR memregion_relocate(struct memregion *region, ADDR obj_addr, struct memrange **range_saveptr)
Definition: memory.c:375
uint32_t REFCNT
Definition: common.h:124
#define PRIxADDR
Definition: common.h:67
ADDR memrange_relocate(struct memrange *range, ADDR obj)
Definition: memory.c:602
#define RPUT(x, objtype, hx, rc)
Definition: common.h:624
ADDR base_virt_addr
Definition: target.h:978
void * malloc(size_t size)
Definition: debugserver.c:214
region_type_t type
Definition: target.h:940
ADDR base_load_addr
Definition: target.h:968
void memrange_obj_flags_propagate(struct memrange *range, obj_flags_t orf, obj_flags_t nandf)
Definition: memory.c:606
struct memregion * addrspace_find_region(struct addrspace *space, char *name)
Definition: memory.c:69
struct binfile * binfile
Definition: target.h:961
REFCNT refcnt
Definition: target.h:1000
REFCNT refcnt
Definition: target.h:943
GList * regions
Definition: target.h:909
REFCNT addrspace_free(struct addrspace *space, int force)
Definition: memory.c:175
struct addrspace * addrspace_create(struct target *target, char *name, ADDR tag)
Definition: memory.c:41
#define RWGUARD(x)
Definition: common.h:220