mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 09:25:10 +00:00
Break in at will.
Fix trap handler a bit, allowing setting of MSR. Make packet code work properly when serial output is interrupted by a packet from gdb. svn path=/trunk/; revision=29658
This commit is contained in:
parent
884b9c5804
commit
9b64d11bf9
3 changed files with 236 additions and 171 deletions
|
@ -5,61 +5,60 @@
|
||||||
mmumain:
|
mmumain:
|
||||||
mr 0,1
|
mr 0,1
|
||||||
lis 1,2
|
lis 1,2
|
||||||
subi 1,1,432
|
subi 1,1,448
|
||||||
stw 0,4(1)
|
stw 0,20(1)
|
||||||
stw 2,8(1)
|
stw 2,24(1)
|
||||||
stw 3,12(1)
|
stw 3,28(1)
|
||||||
stw 4,16(1)
|
stw 4,32(1)
|
||||||
stw 5,20(1)
|
stw 5,36(1)
|
||||||
stw 6,24(1)
|
stw 6,40(1)
|
||||||
stw 7,28(1)
|
stw 7,44(1)
|
||||||
stw 8,32(1)
|
stw 8,48(1)
|
||||||
stw 9,36(1)
|
stw 9,52(1)
|
||||||
stw 10,40(1)
|
stw 10,56(1)
|
||||||
stw 11,44(1)
|
stw 11,60(1)
|
||||||
stw 12,48(1)
|
stw 12,64(1)
|
||||||
stw 13,52(1)
|
stw 13,68(1)
|
||||||
stw 14,56(1)
|
stw 14,72(1)
|
||||||
stw 15,60(1)
|
stw 15,76(1)
|
||||||
stw 16,64(1)
|
stw 16,80(1)
|
||||||
stw 17,68(1)
|
stw 17,84(1)
|
||||||
stw 18,72(1)
|
stw 18,88(1)
|
||||||
stw 19,76(1)
|
stw 19,92(1)
|
||||||
stw 20,80(1)
|
stw 20,96(1)
|
||||||
stw 21,84(1)
|
stw 21,100(1)
|
||||||
stw 22,88(1)
|
stw 22,104(1)
|
||||||
stw 23,92(1)
|
stw 23,108(1)
|
||||||
stw 24,96(1)
|
stw 24,112(1)
|
||||||
stw 25,100(1)
|
stw 25,116(1)
|
||||||
stw 26,104(1)
|
stw 26,120(1)
|
||||||
stw 27,108(1)
|
stw 27,124(1)
|
||||||
stw 28,112(1)
|
stw 28,128(1)
|
||||||
stw 29,116(1)
|
stw 29,132(1)
|
||||||
stw 30,120(1)
|
stw 30,136(1)
|
||||||
stw 31,124(1)
|
stw 31,140(1)
|
||||||
mflr 0
|
mfsrr0 0
|
||||||
stw 0,384(1)
|
|
||||||
mfmsr 0
|
|
||||||
stw 0,388(1)
|
|
||||||
mfcr 0
|
|
||||||
stw 0,392(1)
|
|
||||||
mflr 0
|
|
||||||
stw 0,396(1)
|
|
||||||
mfctr 0
|
|
||||||
stw 0,400(1)
|
stw 0,400(1)
|
||||||
mfxer 0
|
mfmsr 0
|
||||||
stw 0,404(1)
|
stw 0,404(1)
|
||||||
xor 0,0,0
|
mfcr 0
|
||||||
stw 0,408(1)
|
stw 0,408(1)
|
||||||
mfdsisr 0
|
mflr 0
|
||||||
stw 0,412(1)
|
stw 0,412(1)
|
||||||
|
mfctr 0
|
||||||
|
stw 0,416(1)
|
||||||
|
mfxer 0
|
||||||
|
stw 0,420(1)
|
||||||
|
/* xor 0,0,0 -- We can omit this since PPC doesn't have MQ */
|
||||||
|
stw 0,424(1)
|
||||||
|
mfdsisr 0
|
||||||
|
stw 0,428(1)
|
||||||
mfdar 0
|
mfdar 0
|
||||||
stw 0,416(1)
|
stw 0,432(1)
|
||||||
mr 7,1
|
addi 7,1,16
|
||||||
lis 8,_mmumain@ha
|
lis 8,_mmumain@ha
|
||||||
addi 8,8,_mmumain@l
|
addi 8,8,_mmumain@l
|
||||||
mtctr 8
|
mtctr 8
|
||||||
subi 1,1,16
|
|
||||||
bctrl
|
bctrl
|
||||||
addi 1,1,16
|
addi 1,1,16
|
||||||
lwz 2,8(1)
|
lwz 2,8(1)
|
||||||
|
@ -98,7 +97,9 @@ mmumain:
|
||||||
mtlr 0
|
mtlr 0
|
||||||
lwz 0,400(1)
|
lwz 0,400(1)
|
||||||
mtctr 0
|
mtctr 0
|
||||||
|
lwz 0,388(1) /* Copy out new MSR bits if needed */
|
||||||
lwz 1,4(1)
|
lwz 1,4(1)
|
||||||
|
mtmsr 0
|
||||||
blr
|
blr
|
||||||
|
|
||||||
.globl trap_start
|
.globl trap_start
|
||||||
|
@ -106,68 +107,67 @@ mmumain:
|
||||||
trap_start:
|
trap_start:
|
||||||
mtsprg1 1
|
mtsprg1 1
|
||||||
lis 1,2
|
lis 1,2
|
||||||
subi 1,1,432
|
subi 1,1,448
|
||||||
stw 0,0(1)
|
stw 0,16(1)
|
||||||
mfsprg1 0
|
mfsprg1 0
|
||||||
stw 0,4(1)
|
stw 0,20(1)
|
||||||
stw 2,8(1)
|
stw 2,24(1)
|
||||||
stw 3,12(1)
|
stw 3,28(1)
|
||||||
stw 4,16(1)
|
stw 4,32(1)
|
||||||
stw 5,20(1)
|
stw 5,36(1)
|
||||||
stw 6,24(1)
|
stw 6,40(1)
|
||||||
stw 7,28(1)
|
stw 7,44(1)
|
||||||
stw 8,32(1)
|
stw 8,48(1)
|
||||||
stw 9,36(1)
|
stw 9,52(1)
|
||||||
stw 10,40(1)
|
stw 10,56(1)
|
||||||
stw 11,44(1)
|
stw 11,60(1)
|
||||||
stw 12,48(1)
|
stw 12,64(1)
|
||||||
stw 13,52(1)
|
stw 13,68(1)
|
||||||
stw 14,56(1)
|
stw 14,72(1)
|
||||||
stw 15,60(1)
|
stw 15,76(1)
|
||||||
stw 16,64(1)
|
stw 16,80(1)
|
||||||
stw 17,68(1)
|
stw 17,84(1)
|
||||||
stw 18,72(1)
|
stw 18,88(1)
|
||||||
stw 19,76(1)
|
stw 19,92(1)
|
||||||
stw 20,80(1)
|
stw 20,96(1)
|
||||||
stw 21,84(1)
|
stw 21,100(1)
|
||||||
stw 22,88(1)
|
stw 22,104(1)
|
||||||
stw 23,92(1)
|
stw 23,108(1)
|
||||||
stw 24,96(1)
|
stw 24,112(1)
|
||||||
stw 25,100(1)
|
stw 25,116(1)
|
||||||
stw 26,104(1)
|
stw 26,120(1)
|
||||||
stw 27,108(1)
|
stw 27,124(1)
|
||||||
stw 28,112(1)
|
stw 28,128(1)
|
||||||
stw 29,116(1)
|
stw 29,132(1)
|
||||||
stw 30,120(1)
|
stw 30,136(1)
|
||||||
stw 31,124(1)
|
stw 31,140(1)
|
||||||
mfsrr0 0
|
mfsrr0 0
|
||||||
stw 0,384(1)
|
|
||||||
mfsrr1 0
|
|
||||||
stw 0,388(1)
|
|
||||||
mfcr 0
|
|
||||||
stw 0,392(1)
|
|
||||||
mflr 0
|
|
||||||
stw 0,396(1)
|
|
||||||
mfctr 0
|
|
||||||
stw 0,400(1)
|
stw 0,400(1)
|
||||||
mfxer 0
|
mfsrr1 0
|
||||||
stw 0,404(1)
|
stw 0,404(1)
|
||||||
xor 0,0,0
|
mfcr 0
|
||||||
stw 0,408(1)
|
stw 0,408(1)
|
||||||
mfdsisr 0
|
mflr 0
|
||||||
stw 0,412(1)
|
stw 0,412(1)
|
||||||
|
mfctr 0
|
||||||
|
stw 0,416(1)
|
||||||
|
mfxer 0
|
||||||
|
stw 0,420(1)
|
||||||
|
/* xor 0,0,0 -- We can omit this since PPC doesn't have MQ */
|
||||||
|
stw 0,424(1)
|
||||||
|
mfdsisr 0
|
||||||
|
stw 0,428(1)
|
||||||
mfdar 0
|
mfdar 0
|
||||||
stw 0,416(1)
|
stw 0,432(1)
|
||||||
bl 1f
|
bl 1f
|
||||||
1: mflr 5
|
1: mflr 5
|
||||||
mr 4,1
|
addi 4,1,16
|
||||||
rlwinm 3,5,24,0xff
|
rlwinm 3,5,24,0xff
|
||||||
lwz 5,36(5)
|
lwz 5,36(5)
|
||||||
mtctr 5
|
mtctr 5
|
||||||
lis 5,trap_finish_start@ha
|
lis 5,trap_finish_start@ha
|
||||||
addi 5,5,trap_finish_start@l
|
addi 5,5,trap_finish_start@l
|
||||||
mtlr 5
|
mtlr 5
|
||||||
subi 1,1,16
|
|
||||||
bctr
|
bctr
|
||||||
trap_end:
|
trap_end:
|
||||||
.space 4
|
.space 4
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
*
|
*
|
||||||
* Modified for 386 by Jim Kingdon, Cygnus Support.
|
* Modified for 386 by Jim Kingdon, Cygnus Support.
|
||||||
* Modified for ReactOS by Casper S. Hornstrup <chorns@users.sourceforge.net>
|
* Modified for ReactOS by Casper S. Hornstrup <chorns@users.sourceforge.net>
|
||||||
|
* Modified heavily for PowerPC ReactOS by arty
|
||||||
*
|
*
|
||||||
* To enable debugger support, two things need to happen. One, setting
|
* To enable debugger support, two things need to happen. One, setting
|
||||||
* up a routine so that it is in the exception path, is necessary in order
|
* up a routine so that it is in the exception path, is necessary in order
|
||||||
|
@ -127,12 +128,12 @@ int isxdigit(int ch)
|
||||||
(ch >= '0' && ch <= '9');
|
(ch >= '0' && ch <= '9');
|
||||||
}
|
}
|
||||||
|
|
||||||
void sync() {
|
inline void sync() {
|
||||||
__asm__("eieio\n\t"
|
__asm__("eieio\n\t"
|
||||||
"sync");
|
"sync");
|
||||||
}
|
}
|
||||||
|
|
||||||
void send(char *serport, char c) {
|
inline void send(char *serport, char c) {
|
||||||
/* Wait for Clear to Send */
|
/* Wait for Clear to Send */
|
||||||
while( !(serport[LSR] & 0x20) ) sync();
|
while( !(serport[LSR] & 0x20) ) sync();
|
||||||
|
|
||||||
|
@ -140,16 +141,22 @@ void send(char *serport, char c) {
|
||||||
sync();
|
sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
int rdy(char *serport)
|
inline int rdy(char *serport)
|
||||||
{
|
{
|
||||||
sync();
|
sync();
|
||||||
return (serport[LSR] & 0x20);
|
return (serport[LSR] & 0x20);
|
||||||
}
|
}
|
||||||
|
|
||||||
char recv(char *serport) {
|
inline int chr(char *serport)
|
||||||
|
{
|
||||||
|
sync();
|
||||||
|
return serport[LSR] & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline char recv(char *serport) {
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
while( !(serport[LSR] & 1) ) sync();
|
while( !chr(serport) ) sync();
|
||||||
|
|
||||||
c = serport[RCV];
|
c = serport[RCV];
|
||||||
sync();
|
sync();
|
||||||
|
@ -167,8 +174,6 @@ void setup(char *serport, int baud) {
|
||||||
sync();
|
sync();
|
||||||
serport[LCR] = 3;
|
serport[LCR] = 3;
|
||||||
sync();
|
sync();
|
||||||
serport[IER] = 1;
|
|
||||||
sync();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SerialSetUp(int deviceType, void *deviceAddr, int baud)
|
void SerialSetUp(int deviceType, void *deviceAddr, int baud)
|
||||||
|
@ -178,11 +183,11 @@ void SerialSetUp(int deviceType, void *deviceAddr, int baud)
|
||||||
setup(serport, baud);
|
setup(serport, baud);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void SerialInterrupt();
|
extern int SerialInterrupt(int signal, ppc_trap_frame_t *tf);
|
||||||
|
|
||||||
void Wait()
|
void IntEnable()
|
||||||
{
|
{
|
||||||
while(!Continue) if (rdy(serport)) SerialInterrupt();
|
serport[IER] |= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SerialWrite(int ch)
|
void SerialWrite(int ch)
|
||||||
|
@ -240,22 +245,44 @@ void PacketStart()
|
||||||
|
|
||||||
void PacketFinish()
|
void PacketFinish()
|
||||||
{
|
{
|
||||||
int i, ch;
|
int i, ch, count = 0;
|
||||||
|
|
||||||
PacketSent = 0;
|
PacketSent = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
SerialWrite('$');
|
if (!count)
|
||||||
for (i = 0; i < DataOutAddr; i++)
|
{
|
||||||
{
|
SerialWrite('$');
|
||||||
SerialWrite(DataOutBuffer[i]);
|
for (i = 0; i < DataOutAddr; i++)
|
||||||
|
{
|
||||||
|
SerialWrite(DataOutBuffer[i]);
|
||||||
|
}
|
||||||
|
SerialWrite('#');
|
||||||
|
SerialWrite(hex[(DataOutCsum >> 4) & 15]);
|
||||||
|
SerialWrite(hex[DataOutCsum & 15]);
|
||||||
}
|
}
|
||||||
SerialWrite('#');
|
while(count-- != 0)
|
||||||
SerialWrite(hex[(DataOutCsum >> 4) & 15]);
|
{
|
||||||
SerialWrite(hex[DataOutCsum & 15]);
|
if (chr(serport))
|
||||||
|
{
|
||||||
|
ch = SerialRead();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ch)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
while(!rdy(serport));
|
case '-':
|
||||||
if (SerialRead() == '+') break;
|
count = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '+':
|
||||||
|
PacketSent = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
} while(PacketSent != 1);
|
} while(PacketSent != 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -293,10 +320,13 @@ void PacketWriteError(int code)
|
||||||
PacketFinish();
|
PacketFinish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void marker() { }
|
||||||
|
|
||||||
void GotPacket()
|
void GotPacket()
|
||||||
{
|
{
|
||||||
int i, memaddr, memsize;
|
int i, memaddr, memsize;
|
||||||
|
|
||||||
|
Continue = 0;
|
||||||
switch (DataInBuffer[DataInAddr++])
|
switch (DataInBuffer[DataInAddr++])
|
||||||
{
|
{
|
||||||
case 'g':
|
case 'g':
|
||||||
|
@ -349,10 +379,16 @@ void GotPacket()
|
||||||
Continue = 1;
|
Continue = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'S':
|
||||||
|
PacketOk();
|
||||||
|
Continue = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
RegisterSaveArea->srr1 |= 16;
|
RegisterSaveArea->srr1 |= 0x400;
|
||||||
PacketOk();
|
PacketOk();
|
||||||
Continue = 1;
|
Continue = 1;
|
||||||
|
marker();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'q':
|
case 'q':
|
||||||
|
@ -374,59 +410,74 @@ void GotPacket()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SerialInterrupt()
|
int SerialInterrupt(int signal, ppc_trap_frame_t *tf)
|
||||||
{
|
{
|
||||||
int ch = SerialRead();
|
int ch;
|
||||||
|
|
||||||
if (ch == '+')
|
if (!chr(serport)) return 0;
|
||||||
|
|
||||||
|
Signal = signal;
|
||||||
|
RegisterSaveArea = tf;
|
||||||
|
|
||||||
|
do
|
||||||
{
|
{
|
||||||
PacketSent = 1;
|
ch = SerialRead();
|
||||||
}
|
|
||||||
else if (ch == '-')
|
if (ch == 3) /* Break in - tehe */
|
||||||
{
|
|
||||||
PacketSent = -1;
|
|
||||||
}
|
|
||||||
else if (ch == '$')
|
|
||||||
{
|
|
||||||
DataInAddr = 0;
|
|
||||||
ParseState = 0;
|
|
||||||
ComputedCsum = 0;
|
|
||||||
ActualCsum = 0;
|
|
||||||
}
|
|
||||||
else if (ch == '#' && ParseState == 0)
|
|
||||||
{
|
|
||||||
ParseState = 2;
|
|
||||||
}
|
|
||||||
else if (ParseState == 0)
|
|
||||||
{
|
|
||||||
ComputedCsum += ch;
|
|
||||||
DataInBuffer[DataInAddr++] = ch;
|
|
||||||
}
|
|
||||||
else if (ParseState == 2)
|
|
||||||
{
|
|
||||||
ActualCsum = ch;
|
|
||||||
ParseState++;
|
|
||||||
}
|
|
||||||
else if (ParseState == 3)
|
|
||||||
{
|
|
||||||
ActualCsum = hex2int(ch) | (hex2int(ActualCsum) << 4);
|
|
||||||
ComputedCsum &= 255;
|
|
||||||
ParseState = -1;
|
|
||||||
if (ComputedCsum == ActualCsum)
|
|
||||||
{
|
{
|
||||||
ComputedCsum = 0;
|
|
||||||
DataInBuffer[DataInAddr] = 0;
|
|
||||||
DataInAddr = 0;
|
|
||||||
Continue = 0;
|
Continue = 0;
|
||||||
SerialWrite('+');
|
PacketWriteSignal(3);
|
||||||
GotPacket();
|
|
||||||
}
|
}
|
||||||
else
|
else if (ch == '-' || ch == '+')
|
||||||
|
{
|
||||||
|
/* Nothing */
|
||||||
|
}
|
||||||
|
else if (ch == '$')
|
||||||
|
{
|
||||||
|
DataInAddr = 0;
|
||||||
|
ParseState = 0;
|
||||||
|
ComputedCsum = 0;
|
||||||
|
ActualCsum = 0;
|
||||||
|
}
|
||||||
|
else if (ch == '#' && ParseState == 0)
|
||||||
|
{
|
||||||
|
ParseState = 2;
|
||||||
|
}
|
||||||
|
else if (ParseState == 0)
|
||||||
|
{
|
||||||
|
ComputedCsum += ch;
|
||||||
|
DataInBuffer[DataInAddr++] = ch;
|
||||||
|
}
|
||||||
|
else if (ParseState == 2)
|
||||||
|
{
|
||||||
|
ActualCsum = ch;
|
||||||
|
ParseState++;
|
||||||
|
}
|
||||||
|
else if (ParseState == 3)
|
||||||
|
{
|
||||||
|
ActualCsum = hex2int(ch) | (hex2int(ActualCsum) << 4);
|
||||||
|
ComputedCsum &= 255;
|
||||||
|
ParseState = -1;
|
||||||
|
if (ComputedCsum == ActualCsum)
|
||||||
|
{
|
||||||
|
ComputedCsum = 0;
|
||||||
|
DataInBuffer[DataInAddr] = 0;
|
||||||
|
DataInAddr = 0;
|
||||||
|
Continue = 0;
|
||||||
|
SerialWrite('+');
|
||||||
|
GotPacket();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SerialWrite('-');
|
||||||
|
}
|
||||||
|
else if (ParseState == -1)
|
||||||
SerialWrite('-');
|
SerialWrite('-');
|
||||||
}
|
}
|
||||||
|
while (!Continue);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TakeException(int n, int *tf)
|
int TakeException(int n, ppc_trap_frame_t *tf)
|
||||||
{
|
{
|
||||||
Signal = n;
|
Signal = n;
|
||||||
RegisterSaveArea = tf;
|
RegisterSaveArea = tf;
|
||||||
|
@ -434,7 +485,8 @@ void TakeException(int n, int *tf)
|
||||||
PacketWriteSignal(Signal);
|
PacketWriteSignal(Signal);
|
||||||
SendSignal = 0;
|
SendSignal = 0;
|
||||||
Continue = 0;
|
Continue = 0;
|
||||||
Wait();
|
while(!Continue) SerialInterrupt(n, tf);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -68,7 +68,8 @@ MmuVsidInfo *Segs[16], *VsidHead = 0;
|
||||||
extern void fmtout(const char *fmt, ...);
|
extern void fmtout(const char *fmt, ...);
|
||||||
int ptegreload(ppc_trap_frame_t *frame, vaddr_t addr);
|
int ptegreload(ppc_trap_frame_t *frame, vaddr_t addr);
|
||||||
void SerialSetUp(int deviceType, void *deviceAddr, int baud);
|
void SerialSetUp(int deviceType, void *deviceAddr, int baud);
|
||||||
void TakeException(int n, int *tf);
|
int SerialInterrupt(int n, ppc_trap_frame_t *tf);
|
||||||
|
void TakeException(int n, ppc_trap_frame_t *tf);
|
||||||
|
|
||||||
int _mmumain(int action, void *arg1, void *arg2, void *arg3, void *tf)
|
int _mmumain(int action, void *arg1, void *arg2, void *arg3, void *tf)
|
||||||
{
|
{
|
||||||
|
@ -83,36 +84,42 @@ int _mmumain(int action, void *arg1, void *arg2, void *arg3, void *tf)
|
||||||
if(!ptegreload(trap_frame, trap_frame->dar))
|
if(!ptegreload(trap_frame, trap_frame->dar))
|
||||||
{
|
{
|
||||||
__asm__("mfmsr 3\n\tori 3,3,0x30\n\tmtmsr 3\n\t");
|
__asm__("mfmsr 3\n\tori 3,3,0x30\n\tmtmsr 3\n\t");
|
||||||
if (!callback[action](action,tf)) hang(action, tf);
|
if (!callback[action](action,trap_frame)) hang(action, trap_frame);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
if(!ptegreload(trap_frame, trap_frame->srr0))
|
if(!ptegreload(trap_frame, trap_frame->srr0))
|
||||||
{
|
{
|
||||||
__asm__("mfmsr 3\n\tori 3,3,0x30\n\tmtmsr 3\n\t");
|
__asm__("mfmsr 3\n\tori 3,3,0x30\n\tmtmsr 3\n\t");
|
||||||
if (!callback[action](action,tf)) hang(action, tf);
|
if (!callback[action](action,trap_frame)) hang(action, trap_frame);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
/* EE -- Try to get a serial interrupt if debugging enabled, then fall
|
||||||
|
* back to primary handler
|
||||||
|
*/
|
||||||
|
if (!SerialInterrupt(action, trap_frame))
|
||||||
|
callback[action](action, trap_frame);
|
||||||
|
else
|
||||||
|
trap_frame->srr1 |= 0x8000;
|
||||||
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
case 2:
|
case 2:
|
||||||
case 5:
|
|
||||||
case 6:
|
case 6:
|
||||||
case 7:
|
case 7:
|
||||||
case 8:
|
case 8:
|
||||||
case 9:
|
case 9:
|
||||||
case 0xa:
|
case 0xa:
|
||||||
if (!callback[action](action,tf)) hang(action, tf);
|
case 0xc:
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x20:
|
case 0x20:
|
||||||
// Single step
|
if (!callback[action](action,trap_frame)) hang(action, trap_frame);
|
||||||
TakeException(action, tf);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* MMU Functions */
|
/* MMU Functions */
|
||||||
case 0x100:
|
case 0x100:
|
||||||
initme();
|
initme();
|
||||||
|
trap_frame->srr1 |= 0x8000;
|
||||||
break;
|
break;
|
||||||
case 0x101:
|
case 0x101:
|
||||||
ret = mmuaddpage(arg1, (int)arg2);
|
ret = mmuaddpage(arg1, (int)arg2);
|
||||||
|
@ -161,7 +168,7 @@ int _mmumain(int action, void *arg1, void *arg2, void *arg3, void *tf)
|
||||||
SerialSetUp((int)arg1, arg2, 9600);
|
SerialSetUp((int)arg1, arg2, 9600);
|
||||||
break;
|
break;
|
||||||
case 0x201:
|
case 0x201:
|
||||||
TakeException((int)arg1, (int *)trap_frame);
|
TakeException((int)arg1, trap_frame);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -251,7 +258,7 @@ int hang(int trapCode, ppc_trap_frame_t *trap)
|
||||||
GdbAttach = 1;
|
GdbAttach = 1;
|
||||||
SerialSetUp(0, (void *)0x800003f8, 9600);
|
SerialSetUp(0, (void *)0x800003f8, 9600);
|
||||||
}
|
}
|
||||||
TakeException(trapCode, (int *)trap);
|
while(1) SerialInterrupt(trapCode, trap);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,11 +301,17 @@ void initme()
|
||||||
copy_trap_handler(i);
|
copy_trap_handler(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Serial Interrupt */
|
||||||
|
callback[5] = SerialInterrupt;
|
||||||
|
|
||||||
/* Floating point exception */
|
/* Floating point exception */
|
||||||
callback[8] = fpenable;
|
callback[8] = fpenable;
|
||||||
|
|
||||||
/* Ignore decrementer and EE */
|
/* Ignore decrementer and EE */
|
||||||
callback[9] = ignore;
|
callback[9] = ignore;
|
||||||
|
|
||||||
|
/* Single Step */
|
||||||
|
callback[0x20] = TakeException;
|
||||||
}
|
}
|
||||||
|
|
||||||
ppc_map_t *allocpage()
|
ppc_map_t *allocpage()
|
||||||
|
|
Loading…
Reference in a new issue