Line 1003... |
Line 1003... |
{
|
{
|
char *ptype;
|
char *ptype;
|
char *port_name;
|
char *port_name;
|
char **argv;
|
char **argv;
|
|
|
|
int tmp, i;
|
|
unsigned int npc, ppc, r1, insn, result;
|
|
|
#ifdef DEBUG_JTAG
|
#ifdef DEBUG_JTAG
|
printf_unfiltered ("INIT\n");
|
printf_unfiltered ("INIT\n");
|
fflush(stdout);
|
fflush(stdout);
|
#endif
|
#endif
|
if (args == 0) /* CZ */
|
if (args == 0) /* CZ */
|
Line 1086... |
Line 1089... |
if(connection.location == JTAG_LOCAL)
|
if(connection.location == JTAG_LOCAL)
|
jp1_reset_JTAG ();
|
jp1_reset_JTAG ();
|
jtag_set_chain (SC_RISC_DEBUG);
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
|
free (port_name);
|
free (port_name);
|
|
|
|
#if 1
|
|
|
|
#define RAM_BASE 0x40000000
|
|
/* Stall risc */
|
|
jtag_set_chain (SC_REGISTER);
|
|
jtag_write_reg (4, 0x00000001);
|
|
|
|
jtag_set_chain (SC_WISHBONE);
|
|
jtag_write_reg (RAM_BASE + 0x00, 0x9c200000); /* l.addi r1,r0,0x0 */
|
|
jtag_write_reg (RAM_BASE + 0x04, 0x18400000 + (RAM_BASE >> 16)); /* l.movhi r2,0x4000 */
|
|
jtag_write_reg (RAM_BASE + 0x08, 0xa8420000 + ((RAM_BASE + 0x30) & 0xffff)); /* l.ori r2,r2,0x0000 */
|
|
jtag_write_reg (RAM_BASE + 0x0c, 0x9c210001); /* l.addi r1,r1,1 */
|
|
jtag_write_reg (RAM_BASE + 0x10, 0x9c210001); /* l.addi r1,r1,1 */
|
|
jtag_write_reg (RAM_BASE + 0x14, 0xd4020800); /* l.sw 0(r2),r1 */
|
|
jtag_write_reg (RAM_BASE + 0x18, 0x9c210001); /* l.addi r1,r1,1 */
|
|
jtag_write_reg (RAM_BASE + 0x1c, 0x84620000); /* l.lwz r3,0(r2) */
|
|
jtag_write_reg (RAM_BASE + 0x20, 0x03fffffb); /* l.j loop2 */
|
|
jtag_write_reg (RAM_BASE + 0x24, 0xe0211800); /* l.add r1,r1,r3 */
|
|
jtag_write_reg (RAM_BASE + 0x24, 0xe0211800); /* l.add r1,r1,r3 */
|
|
|
|
/* Enable exceptions */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((0 << 11) + 17, 0x03);
|
|
|
|
/* Trap causes stall */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((6 << 11) + 20, 0x2000);
|
|
|
|
/* Set PC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((0 << 11) + 16, RAM_BASE);
|
|
|
|
/* Set step bit */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((6 << 11) + 16, 1 << 22);
|
|
|
|
|
|
for (i = 0; i < 10; i++)
|
|
{
|
|
/* Unstall */
|
|
jtag_set_chain (SC_REGISTER);
|
|
jtag_write_reg (4, 0x00000000);
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
}
|
|
|
|
/* Read NPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
|
|
/* Read PPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
|
|
/* Read R1 */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
r1 = jtag_read_reg (0x401);
|
|
r1 = jtag_read_reg (0x401);
|
|
|
|
printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
|
|
printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 5);
|
|
result = npc + ppc + r1;
|
|
|
|
|
|
/* Reset step bit */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((6 << 11) + 16, 0);
|
|
|
|
|
|
|
|
/* Set trap insn in delay slot */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
insn = jtag_read_reg (RAM_BASE + 0x24);
|
|
insn = jtag_read_reg (RAM_BASE + 0x24);
|
|
jtag_write_reg (RAM_BASE + 0x24, 0x21000001);
|
|
|
|
/* Unstall */
|
|
jtag_set_chain (SC_REGISTER);
|
|
jtag_write_reg (4, 0x00000000);
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
|
|
/* Read NPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
|
|
/* Read PPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
|
|
/* Read R1 */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
r1 = jtag_read_reg (0x401);
|
|
r1 = jtag_read_reg (0x401);
|
|
|
|
/* Set back original insn */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
jtag_write_reg (RAM_BASE + 0x24, insn);
|
|
|
|
printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
|
|
printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 8);
|
|
result = npc + ppc + r1 + result;
|
|
|
|
|
|
/* Set trap insn in place of branch insn */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
insn = jtag_read_reg (RAM_BASE + 0x20);
|
|
insn = jtag_read_reg (RAM_BASE + 0x20);
|
|
jtag_write_reg (RAM_BASE + 0x20, 0x21000001);
|
|
|
|
/* Set PC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x0c);
|
|
|
|
/* Unstall */
|
|
jtag_set_chain (SC_REGISTER);
|
|
jtag_write_reg (4, 0x00000000);
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
|
|
/* Read NPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
|
|
/* Read PPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
|
|
/* Read R1 */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
r1 = jtag_read_reg (0x401);
|
|
r1 = jtag_read_reg (0x401);
|
|
|
|
/* Set back original insn */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
jtag_write_reg (RAM_BASE + 0x20, insn);
|
|
|
|
printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
|
|
printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000024, 0x40000020, 11);
|
|
result = npc + ppc + r1 + result;
|
|
|
|
|
|
/* Set trap insn before branch insn */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
insn = jtag_read_reg (RAM_BASE + 0x1c);
|
|
insn = jtag_read_reg (RAM_BASE + 0x1c);
|
|
jtag_write_reg (RAM_BASE + 0x1c, 0x21000001);
|
|
|
|
/* Set PC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x20);
|
|
|
|
/* Unstall */
|
|
jtag_set_chain (SC_REGISTER);
|
|
jtag_write_reg (4, 0x00000000);
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
|
|
/* Read NPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
|
|
/* Read PPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
|
|
/* Read R1 */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
r1 = jtag_read_reg (0x401);
|
|
r1 = jtag_read_reg (0x401);
|
|
|
|
/* Set back original insn */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
jtag_write_reg (RAM_BASE + 0x1c, insn);
|
|
|
|
printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
|
|
printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000020, 0x4000001c, 24);
|
|
result = npc + ppc + r1 + result;
|
|
|
|
|
|
/* Set trap insn behind lsu insn */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
insn = jtag_read_reg (RAM_BASE + 0x18);
|
|
insn = jtag_read_reg (RAM_BASE + 0x18);
|
|
jtag_write_reg (RAM_BASE + 0x18, 0x21000001);
|
|
|
|
/* Set PC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x1c);
|
|
|
|
/* Unstall */
|
|
jtag_set_chain (SC_REGISTER);
|
|
jtag_write_reg (4, 0x00000000);
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
|
|
/* Read NPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
|
|
/* Read PPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
|
|
/* Read R1 */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
r1 = jtag_read_reg (0x401);
|
|
r1 = jtag_read_reg (0x401);
|
|
|
|
/* Set back original insn */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
jtag_write_reg (RAM_BASE + 0x18, insn);
|
|
|
|
printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
|
|
printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000001c, 0x40000018, 49);
|
|
result = npc + ppc + r1 + result;
|
|
|
|
/* Set trap insn very near previous one */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
insn = jtag_read_reg (RAM_BASE + 0x1c);
|
|
insn = jtag_read_reg (RAM_BASE + 0x1c);
|
|
jtag_write_reg (RAM_BASE + 0x1c, 0x21000001);
|
|
|
|
/* Set PC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x18);
|
|
|
|
/* Unstall */
|
|
jtag_set_chain (SC_REGISTER);
|
|
jtag_write_reg (4, 0x00000000);
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
|
|
/* Read NPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
|
|
/* Read PPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
|
|
/* Read R1 */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
r1 = jtag_read_reg (0x401);
|
|
r1 = jtag_read_reg (0x401);
|
|
|
|
/* Set back original insn */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
jtag_write_reg (RAM_BASE + 0x1c, insn);
|
|
|
|
printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
|
|
printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000020, 0x4000001c, 50);
|
|
result = npc + ppc + r1 + result;
|
|
|
|
|
|
/* Set trap insn to the start */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
insn = jtag_read_reg (RAM_BASE + 0x0c);
|
|
insn = jtag_read_reg (RAM_BASE + 0x0c);
|
|
jtag_write_reg (RAM_BASE + 0x0c, 0x21000001);
|
|
|
|
/* Set PC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x1c);
|
|
|
|
/* Unstall */
|
|
jtag_set_chain (SC_REGISTER);
|
|
jtag_write_reg (4, 0x00000000);
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
|
|
/* Read NPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
|
|
/* Read PPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
|
|
/* Read R1 */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
r1 = jtag_read_reg (0x401);
|
|
r1 = jtag_read_reg (0x401);
|
|
|
|
/* Set back original insn */
|
|
jtag_set_chain (SC_WISHBONE);
|
|
jtag_write_reg (RAM_BASE + 0x0c, insn);
|
|
|
|
printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
|
|
printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000010, 0x4000000c, 99);
|
|
result = npc + ppc + r1 + result;
|
|
|
|
|
|
/* Set step bit */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((6 << 11) + 16, 1 << 22);
|
|
|
|
for (i = 0; i < 5; i++)
|
|
{
|
|
/* Unstall */
|
|
jtag_set_chain (SC_REGISTER);
|
|
jtag_write_reg (4, 0x00000000);
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
}
|
|
|
|
/* Read NPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
|
|
/* Read PPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
|
|
/* Read R1 */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
r1 = jtag_read_reg (0x401);
|
|
r1 = jtag_read_reg (0x401);
|
|
|
|
printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
|
|
printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x40000024, 0x40000020, 101);
|
|
result = npc + ppc + r1 + result;
|
|
|
|
/* Set PC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
jtag_write_reg ((0 << 11) + 16, RAM_BASE + 0x20);
|
|
|
|
for (i = 0; i < 2; i++)
|
|
{
|
|
/* Unstall */
|
|
jtag_set_chain (SC_REGISTER);
|
|
jtag_write_reg (4, 0x00000000);
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
}
|
|
|
|
/* Read NPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
npc = jtag_read_reg ((0 << 11) + 16);
|
|
|
|
/* Read PPC */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
ppc = jtag_read_reg ((0 << 11) + 18);
|
|
|
|
/* Read R1 */
|
|
jtag_set_chain (SC_RISC_DEBUG);
|
|
r1 = jtag_read_reg (0x401);
|
|
r1 = jtag_read_reg (0x401);
|
|
|
|
printf("Read npc = %.8lx ppc = %.8lx r1 = %.8lx\n", npc, ppc, r1);
|
|
printf("Expected npc = %.8lx ppc = %.8lx r1 = %.8lx\n", 0x4000000c, 0x40000024, 201);
|
|
result = npc + ppc + r1 + result;
|
|
|
|
printf("result = %.8lx\n", result + 0x5eaddaa9);
|
|
|
|
#endif
|
}
|
}
|
|
|
void
|
void
|
jtag_done () /* CZ */
|
jtag_done () /* CZ */
|
{
|
{
|