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:
Art Yerkes 2007-10-18 08:12:28 +00:00
parent 884b9c5804
commit 9b64d11bf9
3 changed files with 236 additions and 171 deletions

View file

@ -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

View file

@ -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(DataOutBuffer[i]); SerialWrite('$');
for (i = 0; i < DataOutAddr; i++)
{
SerialWrite(DataOutBuffer[i]);
}
SerialWrite('#');
SerialWrite(hex[(DataOutCsum >> 4) & 15]);
SerialWrite(hex[DataOutCsum & 15]);
}
while(count-- != 0)
{
if (chr(serport))
{
ch = SerialRead();
break;
}
} }
SerialWrite('#');
SerialWrite(hex[(DataOutCsum >> 4) & 15]);
SerialWrite(hex[DataOutCsum & 15]);
while(!rdy(serport)); switch (ch)
if (SerialRead() == '+') break; {
default:
break;
case '-':
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 */

View file

@ -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()