also das starten des bootloader zu verhindern ist sehr einfach ... da muss einfach nur 1 byte irgendwo im bootloader geändert werden, so das die signatur nicht mehr korrekt ist... dann sagt der XBOOT im XPU "zboot: failed" und die CPU wird dann auf ne endlosschleife bei bf800000 geschickt... (bin nich mehr 100% sicher ob die addresse richtig ist)
das mit dem PC verbiegen ist aber nicht so einfach. per JTAG kann man den PC nicht direkt ändern. es gibt nur den Umweg über DEPC. das hatte ich probiert und es schien ab und zu zu klappen... aber komischer weise nicht immer.
was aber noch mehrwürdiger war, ist das der ins ram geladene zboot trotzdem nicht funktionierte.
ich befürchte das die CPU Initialisierung durch die XPU nicht vollständig durchgeführt wird, wenn die bootloader Signatur inkorrekt ist.
ausserdem bin ich auch nicht sicher ob ich den JTAG code richtig zusammen gebaut hab.
neu im .h file
unsigned int jump_module[] = {
// #
// # MCE2222 jump to specified address
// #
// start:
// # Load R1 with the address of the pseudo-address register
0x3C01FF20, // lui $1, 0xFF20
0x34210000, // ori $1, 0x0000
//
// # Load R2 with the address to jump to
0x8C220000, // lw $2, ($1)
//
//# store the current DEPC in R3
0x4003C000, // mfc0 $3, $24
//# update DEPC with R2
0x4082C000, // mtc0 $2, $24
// # Store the value into the pseudo-data register
0xAC230004, // sw $3, 4($1)
0x00000000, // nop
0x1000FFF9, // beq $0, $0, start
0x00000000}; // nop
unsigned int getPc_module[] = {
// #
// # MCE2222 jump to specified address
// #
// start:
// # Load R1 with the address of the pseudo-address register
0x3C01FF20, // lui $1, 0xFF20
0x34210000, // ori $1, 0x0000
//
// # Load R2 with the address to jump to
0x8C220000, // lw $2, ($1)
//
//# store the current DEPC in R3
0x4003C000, // mfc0 $3, $24
// # Store the value into the pseudo-data register
0xAC230004, // sw $3, 4($1)
0x00000000, // nop
0x1000FFF9, // beq $0, $0, start
0x00000000}; // nop
und der aufruf im .c file
unsigned int ejtag_get_pc()
{
address_register = 0x0;
data_register = 0x0;
ExecuteDebugModule(getPc_module);
return(data_register);
}
unsigned int ejtag_set_pc(unsigned int addr)
{
address_register = addr;
data_register = 0x0;
ExecuteDebugModule(jump_module);
return(data_register);
}
das get_pc scheint immer richtig zu funktionieren.
beim set_pc und anschliessendem get_pc kam bei mir nicht immer das erwartete Ergebnis raus.