unsigned int GetCurrentValue(struct AddressWatcher *watch) { switch (watch->Size) { case 0x62: return MappedMemoryReadByte(watch->Address); case 0x77: return MappedMemoryReadWord(watch->Address); case 0x64: return MappedMemoryReadLong(watch->Address); } return 0; // return ReadValueAtHardwareAddress(watch.Address, watch.Size == 'd' ? 4 : watch.Size == 'w' ? 2 : 1); }
void gdb_client_received(gdb_client * client, gdb_packet * packet) { char ack = '+'; printf("packet received: %s\n", packet->buffer); YabSockSend(client->sock, &ack, 1, 0); if (packet->buffer[0] == '?') gdb_client_break(client); else if (packet->buffer[0] == 'c') gdb_client_unlock(client); else if (packet->buffer[0] == 'g') { int i; char buffer[184+1]; for(i = 0;i < 16;i++) sprintf(buffer + 8 * i, "%08x", client->context->regs.R[i]); sprintf(buffer + 8 * 16, "%08x", client->context->regs.PC); sprintf(buffer + 8 * 17, "%08x", client->context->regs.PR); sprintf(buffer + 8 * 18, "%08x", client->context->regs.GBR); sprintf(buffer + 8 * 19, "%08x", client->context->regs.VBR); sprintf(buffer + 8 * 20, "%08x", client->context->regs.MACH); sprintf(buffer + 8 * 21, "%08x", client->context->regs.MACL); sprintf(buffer + 8 * 22, "%08x", client->context->regs.SR); gdb_client_send(client, buffer, 184); } else if (packet->buffer[0] == 'H') gdb_client_send(client, "OK", 2); else if (packet->buffer[0] == 'q') { if (!strncmp(packet->buffer, "qSupported", 10)) gdb_client_send(client, "PacketSize=1024", 15); else if (packet->buffer[1] == 'C') gdb_client_send(client, "", 0); else if (!strncmp(packet->buffer, "qAttached", 9)) gdb_client_send(client, "0", 1); else if (!strncmp(packet->buffer, "qTStatus", 8)) gdb_client_send(client, "T0", 2); else if (!strncmp(packet->buffer, "qTfP", 8)) gdb_client_send(client, "", 0); else if (!strncmp(packet->buffer, "qTfV", 8)) gdb_client_send(client, "", 0); else if (!strncmp(packet->buffer, "qTsP", 8)) gdb_client_send(client, "", 0); } else if (packet->buffer[0] == 'm') { u32 addr; int len, i; char * buffer; char * pos; sscanf(packet->buffer, "m%x,%d", &addr, &len); buffer = malloc(2 * len); pos = buffer; i = 0; while(i < len / 4) { u32 val = MappedMemoryReadLong(addr + 4 * i); sprintf(pos, "%08x", val); i += 1; pos += 8; } switch(len % 4) { case 2: { u16 val = MappedMemoryReadWord(addr + 4 * i); sprintf(pos, "%04x", val); break; } case 1: { u8 val = MappedMemoryReadByte(addr + 4 * i); sprintf(pos, "%02x", val); break; } } gdb_client_send(client, buffer, 2 * len); free(buffer); } else if (packet->buffer[0] == 'v') { if (!strncmp(packet->buffer, "vCont?", 6)) gdb_client_send(client, "", 0); } else if (packet->buffer[0] == 's') gdb_client_step(client); else if (packet->buffer[0] == 'Z') /* insert breakpoint */ { if (packet->buffer[1] == '0') /* code breakpoint */ { u32 addr; int dummy; sscanf(packet->buffer, "Z0,%x,%d", &addr, &dummy); SH2AddCodeBreakpoint(client->context, addr); } gdb_client_send(client, "OK", 2); } else if (packet->buffer[0] == 'z') /* remove breakpoint */ { if (packet->buffer[1] == '0') /* code breakpoint */ { u32 addr; int dummy; sscanf(packet->buffer, "Z0,%x,%d", &addr, &dummy); SH2DelCodeBreakpoint(client->context, addr); } gdb_client_send(client, "OK", 2); } }
result_struct *MappedMemorySearch(u32 startaddr, u32 endaddr, int searchtype, const char *searchstr, result_struct *prevresults, u32 *maxresults) { u32 i=0; result_struct *results; u32 numresults=0; unsigned long searchval; int issigned=0; u32 addr; if ((results = (result_struct *)malloc(sizeof(result_struct) * maxresults[0])) == NULL) return NULL; switch (searchtype & 0x70) { case SEARCHSTRING: case SEARCHREL8BIT: case SEARCHREL16BIT: { // String/8-bit relative/16-bit relative search(not supported, yet) if (SearchString(startaddr, endaddr, searchtype, searchstr, results, maxresults) == 0) { maxresults[0] = 0; free(results); return NULL; } return results; } case SEARCHHEX: sscanf(searchstr, "%08lx", &searchval); break; case SEARCHUNSIGNED: searchval = (unsigned long)strtoul(searchstr, NULL, 10); issigned = 0; break; case SEARCHSIGNED: searchval = (unsigned long)strtol(searchstr, NULL, 10); issigned = 1; break; } if (prevresults) { addr = prevresults[i].addr; i++; } else addr = startaddr; // Regular value search for (;;) { u32 val=0; u32 newaddr; // Fetch byte/word/etc. switch (searchtype & 0x3) { case SEARCHBYTE: val = MappedMemoryReadByte(addr); // sign extend if neccessary if (issigned) val = (s8)val; if (SearchIncrementAndCheckBounds(prevresults, maxresults, numresults, &i, addr+1, &newaddr, endaddr)) return results; break; case SEARCHWORD: val = MappedMemoryReadWord(addr); // sign extend if neccessary if (issigned) val = (s16)val; if (SearchIncrementAndCheckBounds(prevresults, maxresults, numresults, &i, addr+2, &newaddr, endaddr)) return results; break; case SEARCHLONG: val = MappedMemoryReadLong(addr); if (SearchIncrementAndCheckBounds(prevresults, maxresults, numresults, &i, addr+4, &newaddr, endaddr)) return results; break; default: maxresults[0] = 0; if (results) free(results); return NULL; } // Do a comparison switch (searchtype & 0xC) { case SEARCHEXACT: if (val == searchval) MappedMemoryAddMatch(addr, val, searchtype, results, &numresults); break; case SEARCHLESSTHAN: if ((!issigned && val < searchval) || (issigned && (signed)val < (signed)searchval)) MappedMemoryAddMatch(addr, val, searchtype, results, &numresults); break; case SEARCHGREATERTHAN: if ((!issigned && val > searchval) || (issigned && (signed)val > (signed)searchval)) MappedMemoryAddMatch(addr, val, searchtype, results, &numresults); break; default: maxresults[0] = 0; if (results) free(results); return NULL; } addr = newaddr; } maxresults[0] = numresults; return results; }