INT debug_mem_fatal_error(INT bugId, VOID *ptr) { ChipInfo *info; MemBugInfo bugInfo; ULONG size, start; ULONG addr = (ULONG)ptr; if((CORRUPTED_CHIP != bugId) && (CORRUPTED_MEM != bugId) && (SELF_OVERWRITE != bugId)) return bugId; bugInfo.bugID = bugId; info = &(bugInfo.suspect); get_chip_info(addr, info); if(SELF_OVERWRITE == bugId) { addr += info->chipSize; get_chip_info(addr, &(bugInfo.victim)); goto USR_ERR_HANDLER; } get_chip_info(addr, &(bugInfo.victim)); do{ size = info->chipSize; start = info->pageAddr; for(addr -= size; start <= addr; addr -= size) { if(!mem_corrupted(info->heapId, (VOID*)addr)) { info->ptr = (VOID*)addr; break; } } if(start <= addr) break; get_chip_info(start - PAGE_SIZE, info); addr = info->pageAddr; addr += (info->chipSize * info->pageChips); }while(addr); USR_ERR_HANDLER: find_maps((ULONG)ptr, &(bugInfo.mapStart), &(bugInfo.mapEnd)); return record_mem_fatal_error(&bugInfo); }
void init_map(void) { SYMBOL *sym; int i; for (i = 0; mf[i].name; i++) { sym = putsym(mf[i].name); sym->type = sym->itype = st_mfunc; sym->v.p = mf[i].func; sym->proto = mf[i].proto; sym->rettype = st_map; } find_maps(); }