| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- /*
- * Copyright (C) 2021 Ant Group. All rights reserved.
- * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- */
- #include "bh_platform.h"
- #include "packets.h"
- #include "gdbserver.h"
- void
- write_data_raw(WASMGDBServer *gdbserver, const uint8 *data, ssize_t len)
- {
- ssize_t nwritten;
- nwritten = os_socket_send(gdbserver->socket_fd, data, len);
- if (nwritten < 0) {
- LOG_ERROR("Write error\n");
- exit(-2);
- }
- }
- void
- write_hex(WASMGDBServer *gdbserver, unsigned long hex)
- {
- char buf[32];
- size_t len;
- len = snprintf(buf, sizeof(buf) - 1, "%02lx", hex);
- write_data_raw(gdbserver, (uint8 *)buf, len);
- }
- void
- write_packet_bytes(WASMGDBServer *gdbserver, const uint8 *data,
- size_t num_bytes)
- {
- uint8 checksum;
- size_t i;
- write_data_raw(gdbserver, (uint8 *)"$", 1);
- for (i = 0, checksum = 0; i < num_bytes; ++i)
- checksum += data[i];
- write_data_raw(gdbserver, (uint8 *)data, num_bytes);
- write_data_raw(gdbserver, (uint8 *)"#", 1);
- write_hex(gdbserver, checksum);
- }
- void
- write_packet(WASMGDBServer *gdbserver, const char *data)
- {
- LOG_VERBOSE("send replay:%s", data);
- write_packet_bytes(gdbserver, (const uint8 *)data, strlen(data));
- }
- void
- write_binary_packet(WASMGDBServer *gdbserver, const char *pfx,
- const uint8 *data, ssize_t num_bytes)
- {
- uint8 *buf;
- ssize_t pfx_num_chars = strlen(pfx);
- ssize_t buf_num_bytes = 0, total_size;
- int32 i;
- total_size = 2 * num_bytes + pfx_num_chars;
- buf = wasm_runtime_malloc(total_size);
- if (!buf) {
- LOG_ERROR("Failed to allocate memory for binary packet");
- return;
- }
- memset(buf, 0, total_size);
- memcpy(buf, pfx, pfx_num_chars);
- buf_num_bytes += pfx_num_chars;
- for (i = 0; i < num_bytes; ++i) {
- uint8 b = data[i];
- switch (b) {
- case '#':
- case '$':
- case '}':
- case '*':
- buf[buf_num_bytes++] = '}';
- buf[buf_num_bytes++] = b ^ 0x20;
- break;
- default:
- buf[buf_num_bytes++] = b;
- break;
- }
- }
- write_packet_bytes(gdbserver, buf, buf_num_bytes);
- wasm_runtime_free(buf);
- }
|