#define _SYSTEM 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../proto.h" #include "../vm.h" #include "../util.h" #include "memory.h" /*===========================================================================* * arch_map2vir * *===========================================================================*/ PUBLIC vir_bytes arch_map2vir(struct vmproc *vmp, vir_bytes addr) { vir_bytes textstart = CLICK2ABS(vmp->vm_arch.vm_seg[T].mem_phys); vir_bytes datastart = CLICK2ABS(vmp->vm_arch.vm_seg[D].mem_phys); /* Could be a text address. */ vm_assert(datastart <= addr || textstart <= addr); return addr - datastart; } /*===========================================================================* * arch_map2str * *===========================================================================*/ PUBLIC char *arch_map2str(struct vmproc *vmp, vir_bytes addr) { static char bufstr[100]; vir_bytes textstart = CLICK2ABS(vmp->vm_arch.vm_seg[T].mem_phys); vir_bytes textend = textstart + CLICK2ABS(vmp->vm_arch.vm_seg[T].mem_len); vir_bytes datastart = CLICK2ABS(vmp->vm_arch.vm_seg[D].mem_phys); if(addr < textstart) { sprintf(bufstr, "", addr); } else if(addr < datastart) { sprintf(bufstr, "0x%lx (codeseg)", addr - textstart); } else { sprintf(bufstr, "0x%lx (dataseg)", addr - datastart); } return bufstr; } /*===========================================================================* * arch_addrok * *===========================================================================*/ PUBLIC vir_bytes arch_addrok(struct vmproc *vmp, vir_bytes addr) { vir_bytes textstart = CLICK2ABS(vmp->vm_arch.vm_seg[T].mem_phys); vir_bytes textend = CLICK2ABS(vmp->vm_arch.vm_seg[T].mem_phys + vmp->vm_arch.vm_seg[T].mem_phys); vir_bytes datastart = CLICK2ABS(vmp->vm_arch.vm_seg[D].mem_phys); if(addr >= textstart && addr < textstart+textend) return 1; if(addr >= datastart && addr < VM_DATATOP) return 1; return 0; } /*===========================================================================* * arch_vir2map * *===========================================================================*/ PUBLIC vir_bytes arch_vir2map(struct vmproc *vmp, vir_bytes addr) { vir_bytes bottom = CLICK2ABS(vmp->vm_arch.vm_seg[D].mem_phys); return addr + bottom; } /*===========================================================================* * arch_vir2map_text * *===========================================================================*/ PUBLIC vir_bytes arch_vir2map_text(struct vmproc *vmp, vir_bytes addr) { vir_bytes bottom = CLICK2ABS(vmp->vm_arch.vm_seg[T].mem_phys); return addr + bottom; }