Tweak a few things for better page fault debugging.
src/sim/faults.cc: Fix fault message. src/kern/tru64/tru64.hh: Add DPRINTF to see where new thread stacks are allocated. src/arch/alpha/faults.cc: Add print statement so we know what the faulting address is in SE mode. --HG-- extra : convert_revision : 6eb2b513c339496a0d013b7e914953a0a066c12d
This commit is contained in:
parent
0e121bc14f
commit
3ac1ca8ff6
3 changed files with 14 additions and 5 deletions
|
@ -194,7 +194,8 @@ void PageTableFault::invoke(ThreadContext *tc)
|
||||||
|
|
||||||
// We've accessed the next page
|
// We've accessed the next page
|
||||||
if (vaddr > p->stack_min - PageBytes) {
|
if (vaddr > p->stack_min - PageBytes) {
|
||||||
warn("Increasing stack %#x:%#x to %#x:%#x because of access to %#x",
|
DPRINTF(Stack,
|
||||||
|
"Increasing stack %#x:%#x to %#x:%#x because of access to %#x",
|
||||||
p->stack_min, p->stack_base, p->stack_min - PageBytes,
|
p->stack_min, p->stack_base, p->stack_min - PageBytes,
|
||||||
p->stack_base, vaddr);
|
p->stack_base, vaddr);
|
||||||
p->stack_min -= PageBytes;
|
p->stack_min -= PageBytes;
|
||||||
|
@ -202,6 +203,7 @@ void PageTableFault::invoke(ThreadContext *tc)
|
||||||
fatal("Over max stack size for one thread\n");
|
fatal("Over max stack size for one thread\n");
|
||||||
p->pTable->allocate(p->stack_min, PageBytes);
|
p->pTable->allocate(p->stack_min, PageBytes);
|
||||||
} else {
|
} else {
|
||||||
|
warn("Page fault on address %#x\n", vaddr);
|
||||||
FaultBase::invoke(tc);
|
FaultBase::invoke(tc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -600,12 +600,19 @@ class Tru64 : public OperatingSystem
|
||||||
process->next_thread_stack_base -= stack_size;
|
process->next_thread_stack_base -= stack_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
stack_base = roundDown(stack_base, VMPageSize);
|
Addr rounded_stack_base = roundDown(stack_base, VMPageSize);
|
||||||
|
Addr rounded_stack_size = roundUp(stack_size, VMPageSize);
|
||||||
|
|
||||||
|
DPRINTF(SyscallVerbose,
|
||||||
|
"stack_create: allocating stack @ %#x size %#x "
|
||||||
|
"(rounded from %#x, %#x)\n",
|
||||||
|
rounded_stack_base, rounded_stack_size,
|
||||||
|
stack_base, stack_size);
|
||||||
|
|
||||||
// map memory
|
// map memory
|
||||||
process->pTable->allocate(stack_base, roundUp(stack_size, VMPageSize));
|
process->pTable->allocate(rounded_stack_base, rounded_stack_size);
|
||||||
|
|
||||||
argp->address = gtoh(stack_base);
|
argp->address = gtoh(rounded_stack_base);
|
||||||
argp.copyOut(tc->getMemPort());
|
argp.copyOut(tc->getMemPort());
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
#if !FULL_SYSTEM
|
#if !FULL_SYSTEM
|
||||||
void FaultBase::invoke(ThreadContext * tc)
|
void FaultBase::invoke(ThreadContext * tc)
|
||||||
{
|
{
|
||||||
fatal("fault (%s) detected @ PC 0x%08p", name(), tc->readPC());
|
fatal("fault (%s) detected @ PC %p", name(), tc->readPC());
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void FaultBase::invoke(ThreadContext * tc)
|
void FaultBase::invoke(ThreadContext * tc)
|
||||||
|
|
Loading…
Reference in a new issue