static struct s2packet *createwritepacket (TrapContext *ctx, uaecptr request) { uae_u8 flags = get_byte (request + 30); uae_u32 datalength = get_long (request + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES * 2); uaecptr data = get_long (request + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES * 2 + 4); uaecptr srcaddr = request + 32 + 4 + 4; uaecptr dstaddr = request + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES; uae_u16 packettype = get_long (request + 32 + 4); struct priv_s2devstruct *pdev = getps2devstruct (request); struct s2packet *s2p; if (!pdev) return NULL; if (!copyfrombuff (ctx, data, pdev->tempbuf, datalength, pdev->copyfrombuff)) return NULL; s2p = xcalloc (struct s2packet, 1); s2p->data = xmalloc (uae_u8, pdev->td->mtu + ETH_HEADER_SIZE + 2); if (flags & SANA2IOF_RAW) { memcpyah_safe (s2p->data, pdev->tempbuf, datalength); packettype = (s2p->data[2 * ADDR_SIZE + 0] << 8) | (s2p->data[2 * ADDR_SIZE + 1]); s2p->len = datalength; } else { memcpyah_safe (s2p->data + ETH_HEADER_SIZE, pdev->tempbuf, datalength); memcpy (s2p->data + ADDR_SIZE, pdev->td->mac, ADDR_SIZE); memcpyah_safe (s2p->data, dstaddr, ADDR_SIZE); s2p->data[2 * ADDR_SIZE + 0] = packettype >> 8; s2p->data[2 * ADDR_SIZE + 1] = packettype; s2p->len = datalength + ETH_HEADER_SIZE; } if (pdev->tracks[packettype]) { pdev->packetssent++; pdev->bytessent += datalength; } return s2p; }
void trap_memcpyah_safe(TrapContext *ctx, uae_u8 *dst, uaecptr src, int size) { if (size <= 0) return; if (trap_is_indirect()) { trap_get_bytes(ctx, dst, src, size); } else { memcpyah_safe(dst, src, size); } }