static int rap__write(RIO *io, RIODesc *fd, const ut8 *buf, int count) { RSocket *s = RIORAP_FD (fd); ut8 *tmp; int ret; if (count < 1) { return count; } // TOOD: if count > RMT_MAX iterate ! if (count > RMT_MAX) { count = RMT_MAX; } if (!(tmp = (ut8 *)malloc (count + 5))) { eprintf ("rap__write: malloc failed\n"); return -1; } tmp[0] = RMT_WRITE; r_write_be32 (tmp + 1, count); memcpy (tmp + 5, buf, count); ret = r_socket_write (s, tmp, count + 5); r_socket_flush (s); if (r_socket_read (s, tmp, 5) != 5) { // TODO read_block? eprintf ("rap__write: error\n"); ret = -1; } else { ret = r_read_be32 (tmp + 1); if (!ret) { ret = -1; } } free (tmp); return ret; }
static bool check_bytes (const ut8 *buf, ut64 length) { ut32 magic = 0x80371240; if (length < N64_ROM_START) { return false; } return magic == r_read_be32 (buf); }
static RList *symbols(RBinFile *bf) { ut32 *vtable = (ut32 *) bf->buf->buf; RList *ret = NULL; const char *name; SMD_Header *hdr; int i; if (!(ret = r_list_new ())) { return NULL; } ret->free = free; // TODO: store all this stuff in SDB hdr = (SMD_Header *) (bf->buf->buf + 0x100); addsym (ret, "rom_start", r_read_be32 (&hdr->RomStart)); addsym (ret, "rom_end", r_read_be32 (&hdr->RomEnd)); addsym (ret, "ram_start", r_read_be32 (&hdr->RamStart)); addsym (ret, "ram_end", r_read_be32 (&hdr->RamEnd)); showstr ("Copyright", hdr->CopyRights, 32); showstr ("DomesticName", hdr->DomesticName, 48); showstr ("OverseasName", hdr->OverseasName, 48); showstr ("ProductCode", hdr->ProductCode, 14); eprintf ("Checksum: 0x%04x\n", (ut32) hdr->CheckSum); showstr ("Peripherials", hdr->Peripherials, 16); showstr ("SramCode", hdr->CountryCode, 12); showstr ("ModemCode", hdr->CountryCode, 12); showstr ("CountryCode", hdr->CountryCode, 16); /* parse vtable */ for (i = 0; i < 64; i++) { switch (i) { case 0: name = "SSP"; break; case 1: name = "Reset"; break; case 2: name = "BusErr"; break; case 3: name = "AdrErr"; break; case 4: name = "InvOpCode"; break; case 5: name = "DivBy0"; break; case 6: name = "Check"; break; case 7: name = "TrapV"; break; case 8: name = "GPF"; break; case 9: name = "Trace"; break; case 10: name = "Reserv0"; break; case 11: name = "Reserv1"; break; case 12: name = "Reserv2"; break; case 13: name = "Reserv3"; break; case 14: name = "Reserv4"; break; case 15: name = "BadInt"; break; case 16: name = "Reserv10"; break; case 17: name = "Reserv11"; break; case 18: name = "Reserv12"; break; case 19: name = "Reserv13"; break; case 20: name = "Reserv14"; break; case 21: name = "Reserv15"; break; case 22: name = "Reserv16"; break; case 23: name = "Reserv17"; break; case 24: name = "BadIRQ"; break; case 25: name = "IRQ1"; break; case 26: name = "EXT"; break; case 27: name = "IRQ3"; break; case 28: name = "HBLANK"; break; case 29: name = "IRQ5"; break; case 30: name = "VBLANK"; break; case 31: name = "IRQ7"; break; case 32: name = "Trap0"; break; case 33: name = "Trap1"; break; case 34: name = "Trap2"; break; case 35: name = "Trap3"; break; case 36: name = "Trap4"; break; case 37: name = "Trap5"; break; case 38: name = "Trap6"; break; case 39: name = "Trap7"; break; case 40: name = "Trap8"; break; case 41: name = "Trap9"; break; case 42: name = "Trap10"; break; case 43: name = "Trap11"; break; case 44: name = "Trap12"; break; case 45: name = "Trap13"; break; case 46: name = "Trap14"; break; case 47: name = "Trap15"; break; case 48: name = "Reserv30"; break; case 49: name = "Reserv31"; break; case 50: name = "Reserv32"; break; case 51: name = "Reserv33"; break; case 52: name = "Reserv34"; break; case 53: name = "Reserv35"; break; case 54: name = "Reserv36"; break; case 55: name = "Reserv37"; break; case 56: name = "Reserv38"; break; case 57: name = "Reserv39"; break; case 58: name = "Reserv3A"; break; case 59: name = "Reserv3B"; break; case 60: name = "Reserv3C"; break; case 61: name = "Reserv3D"; break; case 62: name = "Reserv3E"; break; case 63: name = "Reserv3F"; break; default: name = NULL; } if (name && vtable[i]) { ut32 addr = r_read_be32 (&vtable[i]); addsym (ret, name, addr); } } return ret; }
static ut64 baddr(RBinFile *bf) { return (ut64) r_read_be32(&n64_header.BootAddress); }
R_API bool r_socket_rap_server_continue (RSocketRapServer *rap_s) { int i, whence, ret = true; ut64 offset; char *ptr = NULL; if (!rap_s || !rap_s->fd) return false; if (!r_socket_is_connected (rap_s->fd)) return false; r_socket_read_block (rap_s->fd, rap_s->buf, 1); ret = rap_s->buf[0]; switch (ret) { case RAP_RMT_OPEN: r_socket_read_block (rap_s->fd, &rap_s->buf[1], 2); r_socket_read_block (rap_s->fd, &rap_s->buf[3], (int)rap_s->buf[2]); rap_s->open (rap_s->user, (const char *)&rap_s->buf[3], (int)rap_s->buf[1], 0); rap_s->buf[0] = RAP_RMT_OPEN | RAP_RMT_REPLY; r_socket_write (rap_s->fd, rap_s->buf, 5); r_socket_flush (rap_s->fd); break; case RAP_RMT_READ: r_socket_read_block (rap_s->fd, &rap_s->buf[1], 4); i = r_read_be32 (&rap_s->buf[1]); if (i > RAP_RMT_MAX || i < 0) i = RAP_RMT_MAX; rap_s->read (rap_s->user, &rap_s->buf[5], i); rap_s->buf[0] = RAP_RMT_READ | RAP_RMT_REPLY; r_socket_write (rap_s->fd, rap_s->buf, i + 5); r_socket_flush (rap_s->fd); break; case RAP_RMT_WRITE: r_socket_read_block (rap_s->fd, rap_s->buf + 1, 4); i = r_read_be32 (rap_s->buf + 1); if (i > RAP_RMT_MAX || i < 0) { i = RAP_RMT_MAX; } r_socket_read_block (rap_s->fd, rap_s->buf + 5, i); int ret = rap_s->write (rap_s->user, rap_s->buf + 5, i); r_write_be32 (rap_s->buf + 1, ret); rap_s->buf[0] = RAP_RMT_WRITE | RAP_RMT_REPLY; r_socket_write (rap_s->fd, rap_s->buf, 5); r_socket_flush (rap_s->fd); break; case RAP_RMT_SEEK: r_socket_read_block (rap_s->fd, &rap_s->buf[1], 9); whence = rap_s->buf[1]; offset = r_read_be64 (rap_s->buf + 2); offset = rap_s->seek (rap_s->user, offset, whence); /* prepare reply */ rap_s->buf[0] = RAP_RMT_SEEK | RAP_RMT_REPLY; r_write_be64 (rap_s->buf + 1, offset); r_socket_write (rap_s->fd, rap_s->buf, 9); r_socket_flush (rap_s->fd); break; case RAP_RMT_CMD: r_socket_read_block (rap_s->fd, &rap_s->buf[1], 4); i = r_read_be32 (&rap_s->buf[1]); r_socket_read_block (rap_s->fd, &rap_s->buf[5], i); ptr = rap_s->cmd (rap_s->user, (const char *)&rap_s->buf[5]); i = (ptr)? strlen (ptr) + 1: 0; r_write_be32 (&rap_s->buf[1], i); rap_s->buf[0] = RAP_RMT_CMD | RAP_RMT_REPLY; r_socket_write (rap_s->fd, rap_s->buf, 5); if (i) r_socket_write (rap_s->fd, ptr, i); r_socket_flush (rap_s->fd); free (ptr); ptr = NULL; break; case RAP_RMT_CLOSE: r_socket_read_block (rap_s->fd, &rap_s->buf[1], 4); i = r_read_be32 (&rap_s->buf[1]); rap_s->close (rap_s->user, i); rap_s->buf[0] = RAP_RMT_CLOSE | RAP_RMT_REPLY; r_socket_write (rap_s->fd, rap_s->buf, 5); r_socket_flush (rap_s->fd); break; default: eprintf ("unknown command 0x%02x\n", \ (unsigned int)(unsigned char)rap_s->buf[0]); r_socket_close (rap_s->fd); ret = false; break; } return ret; }