|
|
1.1 ! root 1: /* ! 2: * db/db2.c ! 3: * A debugger. ! 4: * Segmentation maps. ! 5: */ ! 6: ! 7: #include "db.h" ! 8: ! 9: /* ! 10: * Return the segment map in which the address in segment 's' falls. ! 11: */ ! 12: MAP * ! 13: map_addr(s, addr) int s; ADDR_T addr; ! 14: { ! 15: register MAP *mp; ! 16: ! 17: for (mp = seg_map[s]; mp != (MAP *)NULL; mp = mp->m_next) { ! 18: if (mp->m_base <= addr && addr < mp->m_bend) ! 19: break; ! 20: } ! 21: #if 0 ! 22: if (mp == NULL) ! 23: printf("map_addr failed, s=%d addr=%lX\n", s, addr); ! 24: #endif ! 25: return mp; ! 26: } ! 27: ! 28: /* ! 29: * Clear the segment map for segment 's' until 'endp'. ! 30: * 'endp' allows leaving pure data while clearing impure data. ! 31: */ ! 32: void ! 33: map_clear(s, endp) int s; MAP *endp; ! 34: { ! 35: register MAP *mp, *nmp; ! 36: ! 37: dbprintf(("map_clear(%d, %X):\n", s, endp)); ! 38: for (mp = seg_map[s]; mp != endp; mp = nmp) { ! 39: dbprintf((" map_clear clearing %X\n", mp)); ! 40: nmp = mp->m_next; ! 41: nfree(mp); ! 42: } ! 43: seg_map[s] = mp; ! 44: } ! 45: ! 46: /* ! 47: * Clear all maps. ! 48: * The maps can share the same information, e.g. after ISPACE = DSPACE, ! 49: * hence the silly equality check kludge below. ! 50: */ ! 51: void ! 52: map_init() ! 53: { ! 54: register int n; ! 55: ! 56: dbprintf(("map_init()\n")); ! 57: for (n = 0; n < NSEGS; n++) { ! 58: while (n < NSEGS - 1 && seg_map[n] == seg_map[n+1]) ! 59: seg_map[n++] = (MAP *)NULL; ! 60: map_clear(n, (MAP *)NULL); ! 61: } ! 62: } ! 63: ! 64: /* ! 65: * Print a segmentation map for the :m request. ! 66: */ ! 67: void ! 68: map_print() ! 69: { ! 70: register MAP *mp; ! 71: register int n; ! 72: ! 73: for (n = 0; n < NSEGS; n++) { ! 74: for (mp = seg_map[n]; mp != (MAP *)NULL; mp = mp->m_next) { ! 75: if (testint()) ! 76: return; ! 77: if (mp == seg_map[n]) { ! 78: printx("%s", seg_name[n]); ! 79: while (n < NSEGS-1 && seg_map[n+1]==mp) ! 80: printx(" == %s", seg_name[++n]); ! 81: printx(":\n"); ! 82: } ! 83: printx("["); ! 84: printx(addr_fmt, mp->m_base); ! 85: printx(", "); ! 86: printx(addr_fmt, mp->m_bend); ! 87: printx("] => "); ! 88: printx(addr_fmt, mp->m_offt); ! 89: printx(" (%d)", mp->m_segi); ! 90: if (mp->m_flag == MAP_CHILD) ! 91: printx(" [child]\n"); ! 92: else ! 93: printx(" \"%s\"\n", (mp->m_flag == MAP_PROG) ? lfn : cfn); ! 94: } ! 95: } ! 96: } ! 97: ! 98: /* ! 99: * Initialize an element of a segment map. ! 100: */ ! 101: void ! 102: map_set(s, base, size, offt, flag) int s; ADDR_T base, size; off_t offt; int flag; ! 103: { ! 104: register MAP *mp; ! 105: ! 106: dbprintf(("map_set(s=%d base=%lX size=%lX offt=%lX flag=%d)\n", s, base, size, offt, flag)); ! 107: if (size == (ADDR_T)0) ! 108: return; /* ignore empty segments */ ! 109: mp = (MAP *)nalloc(sizeof(MAP), "segment map"); ! 110: mp->m_next = seg_map[s]; ! 111: seg_map[s] = mp; /* link into list */ ! 112: mp->m_base = base; ! 113: mp->m_bend = base + size; ! 114: mp->m_offt = offt; ! 115: mp->m_segi = s; ! 116: mp->m_flag = flag; ! 117: } ! 118: ! 119: /* end of db/db2.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.