mirror of
https://github.com/reactos/reactos.git
synced 2025-07-27 13:52:38 +00:00
- Don't touch real segments until after booting.
- Hang function isn't too useful. svn path=/trunk/; revision=30348
This commit is contained in:
parent
a8f9ec7c2a
commit
0eb32850f0
1 changed files with 18 additions and 16 deletions
|
@ -59,7 +59,7 @@ typedef struct _MmuVsidInfo {
|
||||||
MmuFreePage *FreeList;
|
MmuFreePage *FreeList;
|
||||||
// Pages are allocated one by one until NextPage == RamSize >> PPC_PAGE_SHIFT
|
// Pages are allocated one by one until NextPage == RamSize >> PPC_PAGE_SHIFT
|
||||||
// Then we take only from the free list
|
// Then we take only from the free list
|
||||||
int Clock = 0, TreeAlloc = 0, GdbAttach = 0;
|
int Clock = 0, TreeAlloc = 0, GdbAttach = 0, Booted = 0, Vsid[16];
|
||||||
paddr_t RamSize, FirstUsablePage, NextPage;
|
paddr_t RamSize, FirstUsablePage, NextPage;
|
||||||
MmuVsidTree *NextTreePage = 0;
|
MmuVsidTree *NextTreePage = 0;
|
||||||
MmuFreeTree *FreeTree;
|
MmuFreeTree *FreeTree;
|
||||||
|
@ -112,7 +112,7 @@ int _mmumain(int action, void *arg1, void *arg2, void *arg3, void *tf)
|
||||||
case 0xa:
|
case 0xa:
|
||||||
case 0xc:
|
case 0xc:
|
||||||
case 0x20:
|
case 0x20:
|
||||||
if (!callback[action](action,trap_frame)) hang(action, trap_frame);
|
if (!callback[action](action,trap_frame)) TakeException(action, trap_frame);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* MMU Functions */
|
/* MMU Functions */
|
||||||
|
@ -241,21 +241,10 @@ int ignore(int trapCode, ppc_trap_frame_t *trap)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hang(int trapCode, ppc_trap_frame_t *trap)
|
|
||||||
{
|
|
||||||
if (!GdbAttach)
|
|
||||||
{
|
|
||||||
GdbAttach = 1;
|
|
||||||
SerialSetUp(0, (void *)0x800003f8, 9600);
|
|
||||||
}
|
|
||||||
while(1) SerialInterrupt(trapCode, trap);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fpenable(int trapCode, ppc_trap_frame_t *trap)
|
int fpenable(int trapCode, ppc_trap_frame_t *trap)
|
||||||
{
|
{
|
||||||
/* Turn on FP */
|
/* Turn on FP */
|
||||||
trap->srr0 |= 8192;
|
trap->srr1 |= 8192;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,7 +275,7 @@ void initme()
|
||||||
/* Default to hang on unknown exception */
|
/* Default to hang on unknown exception */
|
||||||
for(i = 0; i < 30; i++)
|
for(i = 0; i < 30; i++)
|
||||||
{
|
{
|
||||||
callback[i] = hang;
|
callback[i] = TakeException;
|
||||||
if (i != 1) /* Preserve reset handler */
|
if (i != 1) /* Preserve reset handler */
|
||||||
copy_trap_handler(i);
|
copy_trap_handler(i);
|
||||||
}
|
}
|
||||||
|
@ -569,8 +558,10 @@ void mmusetvsid(int start, int end, int vsid)
|
||||||
{
|
{
|
||||||
s_vsid = (vsid << 4) | (i & 15);
|
s_vsid = (vsid << 4) | (i & 15);
|
||||||
sr = (GetSR(i) & ~PPC_VSID_MASK) | s_vsid;
|
sr = (GetSR(i) & ~PPC_VSID_MASK) | s_vsid;
|
||||||
SetSR(i, sr);
|
if (Booted)
|
||||||
|
SetSR(i, sr);
|
||||||
Segs[i] = findvsid(s_vsid);
|
Segs[i] = findvsid(s_vsid);
|
||||||
|
Vsid[i] = s_vsid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -595,6 +586,17 @@ int ptegreload(ppc_trap_frame_t *frame, vaddr_t addr)
|
||||||
|
|
||||||
void callkernel(void *fun_ptr, void *arg)
|
void callkernel(void *fun_ptr, void *arg)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Booted = 1;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
// Patch up the vsid map. We shouldn't muck with these until we're
|
||||||
|
// booted.
|
||||||
|
mmusetvsid(i, i+1, Vsid[i]);
|
||||||
|
}
|
||||||
|
|
||||||
void (*fun)(void *) = fun_ptr;
|
void (*fun)(void *) = fun_ptr;
|
||||||
__asm__("mfmsr 3\n\t"
|
__asm__("mfmsr 3\n\t"
|
||||||
"ori 3,3,0x30\n\t"
|
"ori 3,3,0x30\n\t"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue