comparison rvinterf/lowlevel/tfc139.c @ 360:f9d78057d766

tfc139 hack works!
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Thu, 15 May 2014 11:09:45 +0000
parents 144b5d222de8
children 62f850da5d49
comparison
equal deleted inserted replaced
359:144b5d222de8 360:f9d78057d766
48 }; 48 };
49 49
50 static unsigned iram_load_addr = 0x800000; 50 static unsigned iram_load_addr = 0x800000;
51 static unsigned stack_smash_addr = 0x837C54; 51 static unsigned stack_smash_addr = 0x837C54;
52 52
53 static u_char stack_smash_payload[4];
54
53 static void 55 static void
54 send_compal_memwrite(addr, payload, payload_len) 56 send_compal_memwrite(addr, payload, payload_len)
55 unsigned addr; 57 unsigned addr;
56 u_char *payload; 58 u_char *payload;
57 { 59 {
79 extern char *optarg; 81 extern char *optarg;
80 extern int optind; 82 extern int optind;
81 int c; 83 int c;
82 fd_set fds; 84 fd_set fds;
83 85
84 while ((c = getopt(argc, argv, "l:")) != EOF) 86 while ((c = getopt(argc, argv, "l:w:")) != EOF)
85 switch (c) { 87 switch (c) {
86 case 'l': 88 case 'l':
87 logfname = optarg; 89 logfname = optarg;
90 continue;
91 case 'w':
92 wakeup_after_sec = strtoul(optarg, 0, 0);
88 continue; 93 continue;
89 case '?': 94 case '?':
90 default: 95 default:
91 usage: fprintf(stderr, 96 usage: fprintf(stderr,
92 "usage: %s [options] ttyport\n", argv[0]); 97 "usage: %s [options] ttyport\n", argv[0]);
108 setlinebuf(logF); 113 setlinebuf(logF);
109 fprintf(logF, "*** Log of TFC139 break-in session ***\n"); 114 fprintf(logF, "*** Log of TFC139 break-in session ***\n");
110 } 115 }
111 output_line("Sending IRAM payload"); 116 output_line("Sending IRAM payload");
112 send_compal_memwrite(iram_load_addr, iram_payload, sizeof iram_payload); 117 send_compal_memwrite(iram_load_addr, iram_payload, sizeof iram_payload);
118 stack_smash_payload[0] = iram_load_addr;
119 stack_smash_payload[1] = iram_load_addr >> 8;
120 stack_smash_payload[2] = iram_load_addr >> 16;
121 stack_smash_payload[3] = iram_load_addr >> 24;
113 for (;;) { 122 for (;;) {
114 FD_ZERO(&fds); 123 FD_ZERO(&fds);
115 FD_SET(target_fd, &fds); 124 FD_SET(target_fd, &fds);
116 c = select(target_fd+1, &fds, 0, 0, 0); 125 c = select(target_fd+1, &fds, 0, 0, 0);
117 time(&logtime); 126 time(&logtime);
124 if (FD_ISSET(target_fd, &fds)) 133 if (FD_ISSET(target_fd, &fds))
125 process_serial_rx(); 134 process_serial_rx();
126 } 135 }
127 } 136 }
128 137
138 static void
139 handle_etm_response()
140 {
141 char msgbuf[80];
142
143 if (rxpkt_len != 4 || rxpkt[1] != 0x40 || rxpkt[2] || rxpkt[3] != 0x40){
144 output_line("ETM response differs from expected");
145 return;
146 }
147 sprintf(msgbuf, "Sending stack smash write at 0x%x", stack_smash_addr);
148 output_line(msgbuf);
149 send_compal_memwrite(stack_smash_addr, stack_smash_payload, 4);
150 stack_smash_addr += 4;
151 }
152
129 handle_rx_packet() 153 handle_rx_packet()
130 { 154 {
155 if (rxpkt_len == 2 && rxpkt[0] == 'O' && rxpkt[1] == 'K') {
156 output_line("Success! Run fc-loadtool now!");
157 return;
158 }
131 switch (rxpkt[0]) { 159 switch (rxpkt[0]) {
132 case RVT_RV_HEADER: 160 case RVT_RV_HEADER:
133 if (rxpkt_len < 6) 161 if (rxpkt_len < 6)
134 goto unknown; 162 goto unknown;
135 print_rv_trace(); 163 print_rv_trace();
140 case RVT_L23_HEADER: 168 case RVT_L23_HEADER:
141 print_g23_trace(); 169 print_g23_trace();
142 return; 170 return;
143 case RVT_TM_HEADER: 171 case RVT_TM_HEADER:
144 print_etm_output_raw(); 172 print_etm_output_raw();
173 handle_etm_response();
145 return; 174 return;
146 default: 175 default:
147 unknown: 176 unknown:
148 print_unknown_packet(); 177 print_unknown_packet();
149 } 178 }