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=29…
==============================================================================
--- 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=29…
==============================================================================
--- 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(a)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()