Change how Page Faults work in SPARC. It now prints the faulting address, and panics instead of fatals. This isn't technically what it should do, but it makes gdb stop at the panic rather than letting m5 exit.

--HG--
extra : convert_revision : 3b14c99edaf649e0809977c9579afb2b7b0d72e9
This commit is contained in:
Gabe Black 2006-12-07 18:43:55 -05:00
parent 50b8cce355
commit 015873fa86

View file

@ -690,19 +690,21 @@ void PageTableFault::invoke(ThreadContext *tc)
{ {
Process *p = tc->getProcessPtr(); Process *p = tc->getProcessPtr();
// address is higher than the stack region or in the current stack region // We've accessed the next page of the stack, so extend the stack
if (vaddr > p->stack_base || vaddr > p->stack_min) // to cover it.
FaultBase::invoke(tc); if(vaddr < p->stack_min && vaddr >= p->stack_min - PageBytes)
{
// We've accessed the next page
if (vaddr > p->stack_min - PageBytes) {
p->stack_min -= PageBytes; p->stack_min -= PageBytes;
if (p->stack_base - p->stack_min > 8*1024*1024) if(p->stack_base - p->stack_min > 8*1024*1024)
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);
warn("Increasing stack size by one page."); warn("Increasing stack size by one page.");
} else { }
FaultBase::invoke(tc); // Otherwise, we have an unexpected page fault. Report that fact,
// and what address was accessed to cause the fault.
else
{
panic("Page table fault when accessing virtual address %#x\n", vaddr);
} }
} }