commit
3c255345cc
|
@ -55,6 +55,7 @@
|
||||||
#include "los_vm_phys.h"
|
#include "los_vm_phys.h"
|
||||||
#include "los_vm_fault.h"
|
#include "los_vm_fault.h"
|
||||||
#include "los_vm_common.h"
|
#include "los_vm_common.h"
|
||||||
|
#include "los_load_elf.h"
|
||||||
#include "arm.h"
|
#include "arm.h"
|
||||||
#include "los_bitmap.h"
|
#include "los_bitmap.h"
|
||||||
#include "los_process_pri.h"
|
#include "los_process_pri.h"
|
||||||
|
@ -255,6 +256,39 @@ STATIC const CHAR *g_excTypeString[] = {
|
||||||
"irq"
|
"irq"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
STATIC VADDR_T OsGetTextRegionBase(LosVmMapRegion *region, LosProcessCB *runProcess)
|
||||||
|
{
|
||||||
|
struct file *curFilep = NULL;
|
||||||
|
struct file *lastFilep = NULL;
|
||||||
|
LosVmMapRegion *curRegion = NULL;
|
||||||
|
LosVmMapRegion *lastRegion = NULL;
|
||||||
|
|
||||||
|
if ((region == NULL) || (runProcess == NULL)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!LOS_IsRegionFileValid(region)) {
|
||||||
|
return region->range.base;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastRegion = region;
|
||||||
|
do {
|
||||||
|
curRegion = lastRegion;
|
||||||
|
lastRegion = LOS_RegionFind(runProcess->vmSpace, curRegion->range.base - 1);
|
||||||
|
if ((lastRegion == NULL) || !LOS_IsRegionFileValid(lastRegion)) {
|
||||||
|
goto DONE;
|
||||||
|
}
|
||||||
|
curFilep = curRegion->unTypeData.rf.file;
|
||||||
|
lastFilep = lastRegion->unTypeData.rf.file;
|
||||||
|
} while (!strcmp(curFilep->f_path, lastFilep->f_path));
|
||||||
|
|
||||||
|
DONE:
|
||||||
|
if (curRegion->range.base == EXEC_MMAP_BASE) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return curRegion->range.base;
|
||||||
|
}
|
||||||
|
|
||||||
STATIC VOID OsExcSysInfo(UINT32 excType, const ExcContext *excBufAddr)
|
STATIC VOID OsExcSysInfo(UINT32 excType, const ExcContext *excBufAddr)
|
||||||
{
|
{
|
||||||
LosTaskCB *runTask = OsCurrTaskGet();
|
LosTaskCB *runTask = OsCurrTaskGet();
|
||||||
|
@ -289,7 +323,7 @@ STATIC VOID OsExcSysInfo(UINT32 excType, const ExcContext *excBufAddr)
|
||||||
region = LOS_RegionFind(runProcess->vmSpace, (VADDR_T)excBufAddr->PC);
|
region = LOS_RegionFind(runProcess->vmSpace, (VADDR_T)excBufAddr->PC);
|
||||||
if (region != NULL) {
|
if (region != NULL) {
|
||||||
PrintExcInfo("in %s ---> 0x%x", OsGetRegionNameOrFilePath(region),
|
PrintExcInfo("in %s ---> 0x%x", OsGetRegionNameOrFilePath(region),
|
||||||
(VADDR_T)excBufAddr->PC - region->range.base);
|
(VADDR_T)excBufAddr->PC - OsGetTextRegionBase(region, runProcess));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,7 +331,7 @@ STATIC VOID OsExcSysInfo(UINT32 excType, const ExcContext *excBufAddr)
|
||||||
region = LOS_RegionFind(runProcess->vmSpace, (VADDR_T)excBufAddr->ULR);
|
region = LOS_RegionFind(runProcess->vmSpace, (VADDR_T)excBufAddr->ULR);
|
||||||
if (region != NULL) {
|
if (region != NULL) {
|
||||||
PrintExcInfo("in %s ---> 0x%x", OsGetRegionNameOrFilePath(region),
|
PrintExcInfo("in %s ---> 0x%x", OsGetRegionNameOrFilePath(region),
|
||||||
(VADDR_T)excBufAddr->ULR - region->range.base);
|
(VADDR_T)excBufAddr->ULR - OsGetTextRegionBase(region, runProcess));
|
||||||
}
|
}
|
||||||
PrintExcInfo("\nusp = 0x%x", excBufAddr->USP);
|
PrintExcInfo("\nusp = 0x%x", excBufAddr->USP);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue