Author: arty Date: Thu Oct 18 12:12:28 2007 New Revision: 29658
URL: http://svn.reactos.org/svn/reactos?rev=29658&view=rev Log: 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.
Modified: trunk/reactos/lib/ppcmmu/devint.s trunk/reactos/lib/ppcmmu/gdblib.c trunk/reactos/lib/ppcmmu/mmuobject.c
Modified: trunk/reactos/lib/ppcmmu/devint.s URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/ppcmmu/devint.s?rev=296... ============================================================================== --- trunk/reactos/lib/ppcmmu/devint.s (original) +++ trunk/reactos/lib/ppcmmu/devint.s Thu Oct 18 12:12:28 2007 @@ -5,61 +5,60 @@ mmumain: mr 0,1 lis 1,2 - subi 1,1,432 - stw 0,4(1) - stw 2,8(1) - stw 3,12(1) - stw 4,16(1) - stw 5,20(1) - stw 6,24(1) - stw 7,28(1) - stw 8,32(1) - stw 9,36(1) - stw 10,40(1) - stw 11,44(1) - stw 12,48(1) - stw 13,52(1) - stw 14,56(1) - stw 15,60(1) - stw 16,64(1) - stw 17,68(1) - stw 18,72(1) - stw 19,76(1) - stw 20,80(1) - stw 21,84(1) - stw 22,88(1) - stw 23,92(1) - stw 24,96(1) - stw 25,100(1) - stw 26,104(1) - stw 27,108(1) - stw 28,112(1) - stw 29,116(1) - stw 30,120(1) - stw 31,124(1) + subi 1,1,448 + stw 0,20(1) + stw 2,24(1) + stw 3,28(1) + stw 4,32(1) + stw 5,36(1) + stw 6,40(1) + stw 7,44(1) + stw 8,48(1) + stw 9,52(1) + stw 10,56(1) + stw 11,60(1) + stw 12,64(1) + stw 13,68(1) + stw 14,72(1) + stw 15,76(1) + stw 16,80(1) + stw 17,84(1) + stw 18,88(1) + stw 19,92(1) + stw 20,96(1) + stw 21,100(1) + stw 22,104(1) + stw 23,108(1) + stw 24,112(1) + stw 25,116(1) + stw 26,120(1) + stw 27,124(1) + stw 28,128(1) + stw 29,132(1) + stw 30,136(1) + stw 31,140(1) + mfsrr0 0 + stw 0,400(1) + mfmsr 0 + stw 0,404(1) + mfcr 0 + stw 0,408(1) mflr 0 - stw 0,384(1) - mfmsr 0 - stw 0,388(1) - mfcr 0 - stw 0,392(1) - mflr 0 - stw 0,396(1) + stw 0,412(1) mfctr 0 - stw 0,400(1) + stw 0,416(1) mfxer 0 - stw 0,404(1) - xor 0,0,0 - stw 0,408(1) + 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,412(1) + stw 0,428(1) mfdar 0 - stw 0,416(1) - mr 7,1 + stw 0,432(1) + addi 7,1,16 lis 8,_mmumain@ha addi 8,8,_mmumain@l mtctr 8 - subi 1,1,16 bctrl addi 1,1,16 lwz 2,8(1) @@ -98,7 +97,9 @@ mtlr 0 lwz 0,400(1) mtctr 0 + lwz 0,388(1) /* Copy out new MSR bits if needed */ lwz 1,4(1) + mtmsr 0 blr
.globl trap_start @@ -106,68 +107,67 @@ trap_start: mtsprg1 1 lis 1,2 - subi 1,1,432 - stw 0,0(1) + subi 1,1,448 + stw 0,16(1) mfsprg1 0 - stw 0,4(1) - stw 2,8(1) - stw 3,12(1) - stw 4,16(1) - stw 5,20(1) - stw 6,24(1) - stw 7,28(1) - stw 8,32(1) - stw 9,36(1) - stw 10,40(1) - stw 11,44(1) - stw 12,48(1) - stw 13,52(1) - stw 14,56(1) - stw 15,60(1) - stw 16,64(1) - stw 17,68(1) - stw 18,72(1) - stw 19,76(1) - stw 20,80(1) - stw 21,84(1) - stw 22,88(1) - stw 23,92(1) - stw 24,96(1) - stw 25,100(1) - stw 26,104(1) - stw 27,108(1) - stw 28,112(1) - stw 29,116(1) - stw 30,120(1) - stw 31,124(1) + stw 0,20(1) + stw 2,24(1) + stw 3,28(1) + stw 4,32(1) + stw 5,36(1) + stw 6,40(1) + stw 7,44(1) + stw 8,48(1) + stw 9,52(1) + stw 10,56(1) + stw 11,60(1) + stw 12,64(1) + stw 13,68(1) + stw 14,72(1) + stw 15,76(1) + stw 16,80(1) + stw 17,84(1) + stw 18,88(1) + stw 19,92(1) + stw 20,96(1) + stw 21,100(1) + stw 22,104(1) + stw 23,108(1) + stw 24,112(1) + stw 25,116(1) + stw 26,120(1) + stw 27,124(1) + stw 28,128(1) + stw 29,132(1) + stw 30,136(1) + stw 31,140(1) mfsrr0 0 - stw 0,384(1) + stw 0,400(1) mfsrr1 0 - stw 0,388(1) + stw 0,404(1) mfcr 0 - stw 0,392(1) + stw 0,408(1) mflr 0 - stw 0,396(1) + stw 0,412(1) mfctr 0 - stw 0,400(1) + stw 0,416(1) mfxer 0 - stw 0,404(1) - xor 0,0,0 - stw 0,408(1) + 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,412(1) + stw 0,428(1) mfdar 0 - stw 0,416(1) + stw 0,432(1) bl 1f 1: mflr 5 - mr 4,1 + addi 4,1,16 rlwinm 3,5,24,0xff lwz 5,36(5) mtctr 5 lis 5,trap_finish_start@ha addi 5,5,trap_finish_start@l mtlr 5 - subi 1,1,16 bctr trap_end: .space 4
Modified: trunk/reactos/lib/ppcmmu/gdblib.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/ppcmmu/gdblib.c?rev=296... ============================================================================== --- trunk/reactos/lib/ppcmmu/gdblib.c (original) +++ trunk/reactos/lib/ppcmmu/gdblib.c Thu Oct 18 12:12:28 2007 @@ -31,6 +31,7 @@ * * Modified for 386 by Jim Kingdon, Cygnus Support. * 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 * up a routine so that it is in the exception path, is necessary in order @@ -127,12 +128,12 @@ (ch >= '0' && ch <= '9'); }
-void sync() { +inline void sync() { __asm__("eieio\n\t" "sync"); }
-void send(char *serport, char c) { +inline void send(char *serport, char c) { /* Wait for Clear to Send */ while( !(serport[LSR] & 0x20) ) sync();
@@ -140,16 +141,22 @@ sync(); }
-int rdy(char *serport) +inline int rdy(char *serport) { sync(); 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;
- while( !(serport[LSR] & 1) ) sync(); + while( !chr(serport) ) sync();
c = serport[RCV]; sync(); @@ -167,8 +174,6 @@ sync(); serport[LCR] = 3; sync(); - serport[IER] = 1; - sync(); }
void SerialSetUp(int deviceType, void *deviceAddr, int baud) @@ -178,11 +183,11 @@ setup(serport, baud); }
-extern void SerialInterrupt(); - -void Wait() -{ - while(!Continue) if (rdy(serport)) SerialInterrupt(); +extern int SerialInterrupt(int signal, ppc_trap_frame_t *tf); + +void IntEnable() +{ + serport[IER] |= 1; }
void SerialWrite(int ch) @@ -240,22 +245,44 @@
void PacketFinish() { - int i, ch; + int i, ch, count = 0;
PacketSent = 0;
do { - SerialWrite('$'); - for (i = 0; i < DataOutAddr; i++) - { - SerialWrite(DataOutBuffer[i]); - } - SerialWrite('#'); - SerialWrite(hex[(DataOutCsum >> 4) & 15]); - SerialWrite(hex[DataOutCsum & 15]); - - while(!rdy(serport)); - if (SerialRead() == '+') break; + if (!count) + { + 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; + } + } + + switch (ch) + { + default: + break; + + case '-': + count = 0; + break; + + case '+': + PacketSent = 1; + break; + } } while(PacketSent != 1); }
@@ -293,10 +320,13 @@ PacketFinish(); }
+void marker() { } + void GotPacket() { int i, memaddr, memsize; - + + Continue = 0; switch (DataInBuffer[DataInAddr++]) { case 'g': @@ -349,10 +379,16 @@ Continue = 1; break;
+ case 'S': + PacketOk(); + Continue = 0; + break; + case 's': - RegisterSaveArea->srr1 |= 16; + RegisterSaveArea->srr1 |= 0x400; PacketOk(); Continue = 1; + marker(); break;
case 'q': @@ -374,59 +410,74 @@ } }
-void SerialInterrupt() -{ - int ch = SerialRead(); - - if (ch == '+') +int SerialInterrupt(int signal, ppc_trap_frame_t *tf) +{ + int ch; + + if (!chr(serport)) return 0; + + Signal = signal; + RegisterSaveArea = tf; + + do { - PacketSent = 1; - } - else if (ch == '-') - { - 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) - { + ch = SerialRead(); + + if (ch == 3) /* Break in - tehe */ + { + Continue = 0; + PacketWriteSignal(3); + } + else if (ch == '-' || ch == '+') + { + /* Nothing */ + } + else if (ch == '$') + { + DataInAddr = 0; + ParseState = 0; ComputedCsum = 0; - DataInBuffer[DataInAddr] = 0; - DataInAddr = 0; - Continue = 0; - SerialWrite('+'); - GotPacket(); - } - else + 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('-'); } -} - -void TakeException(int n, int *tf) + while (!Continue); + return 1; +} + +int TakeException(int n, ppc_trap_frame_t *tf) { Signal = n; RegisterSaveArea = tf; @@ -434,7 +485,8 @@ PacketWriteSignal(Signal); SendSignal = 0; Continue = 0; - Wait(); + while(!Continue) SerialInterrupt(n, tf); + return 1; }
/* EOF */
Modified: trunk/reactos/lib/ppcmmu/mmuobject.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/ppcmmu/mmuobject.c?rev=... ============================================================================== --- trunk/reactos/lib/ppcmmu/mmuobject.c (original) +++ trunk/reactos/lib/ppcmmu/mmuobject.c Thu Oct 18 12:12:28 2007 @@ -68,7 +68,8 @@ extern void fmtout(const char *fmt, ...); int ptegreload(ppc_trap_frame_t *frame, vaddr_t addr); 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) { @@ -83,36 +84,42 @@ if(!ptegreload(trap_frame, trap_frame->dar)) { __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; case 4: if(!ptegreload(trap_frame, trap_frame->srr0)) { __asm__("mfmsr 3\n\tori 3,3,0x30\n\tmtmsr 3\n\t"); - if (!callback[action](action,tf)) hang(action, tf); - } - break; - + if (!callback[action](action,trap_frame)) hang(action, trap_frame); + } + 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 2: - case 5: case 6: case 7: case 8: case 9: case 0xa: - if (!callback[action](action,tf)) hang(action, tf); - break; - + case 0xc: case 0x20: - // Single step - TakeException(action, tf); + if (!callback[action](action,trap_frame)) hang(action, trap_frame); break;
/* MMU Functions */ case 0x100: initme(); + trap_frame->srr1 |= 0x8000; break; case 0x101: ret = mmuaddpage(arg1, (int)arg2); @@ -161,7 +168,7 @@ SerialSetUp((int)arg1, arg2, 9600); break; case 0x201: - TakeException((int)arg1, (int *)trap_frame); + TakeException((int)arg1, trap_frame); break;
default: @@ -251,7 +258,7 @@ GdbAttach = 1; SerialSetUp(0, (void *)0x800003f8, 9600); } - TakeException(trapCode, (int *)trap); + while(1) SerialInterrupt(trapCode, trap); return 1; }
@@ -294,11 +301,17 @@ copy_trap_handler(i); }
+ /* Serial Interrupt */ + callback[5] = SerialInterrupt; + /* Floating point exception */ callback[8] = fpenable;
/* Ignore decrementer and EE */ callback[9] = ignore; + + /* Single Step */ + callback[0x20] = TakeException; }
ppc_map_t *allocpage()