aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2023-11-03 10:43:48 -0700
committerTim Newsome <tim@sifive.com>2023-11-06 09:25:46 -0800
commitb5bd88441c3745e37f87c9940809f212f96c3547 (patch)
tree45185424e522f840668faf88ebfab333e62065ac /src/server
parentb75bfab0261aa06597ee68895884a62eabceec18 (diff)
parent05ee88915520d1dd82da94a016a9374a1f3a8129 (diff)
downloadriscv-openocd-b5bd88441c3745e37f87c9940809f212f96c3547.zip
riscv-openocd-b5bd88441c3745e37f87c9940809f212f96c3547.tar.gz
riscv-openocd-b5bd88441c3745e37f87c9940809f212f96c3547.tar.bz2
Merge commit '05ee88915520d1dd82da94a016a9374a1f3a8129' into from_upstream
Conflicts: src/jtag/drivers/xds110.c src/target/riscv/riscv.c src/target/riscv/riscv_semihosting.c tcl/target/esp_common.cfg Change-Id: If0c02817df03b7fd700cc84b4da2c02d36737d28
Diffstat (limited to 'src/server')
-rw-r--r--src/server/gdb_server.c2
-rw-r--r--src/server/ipdbg.c36
2 files changed, 33 insertions, 5 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index 8409012..57a6d5f 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -1836,7 +1836,7 @@ static int gdb_breakpoint_watchpoint_packet(struct connection *connection,
case 4:
{
if (packet[0] == 'Z') {
- retval = watchpoint_add(target, address, size, wp_type, 0, 0xffffffffu);
+ retval = watchpoint_add(target, address, size, wp_type, 0, WATCHPOINT_IGNORE_DATA_VALUE_MASK);
if (retval == ERROR_NOT_IMPLEMENTED) {
/* Send empty reply to report that watchpoints of this type are not supported */
gdb_put_packet(connection, "", 0);
diff --git a/src/server/ipdbg.c b/src/server/ipdbg.c
index 69d0f57..c1bdb29 100644
--- a/src/server/ipdbg.c
+++ b/src/server/ipdbg.c
@@ -10,11 +10,12 @@
#include <jtag/jtag.h>
#include <server/server.h>
#include <target/target.h>
+#include <pld/pld.h>
#include "ipdbg.h"
#define IPDBG_BUFFER_SIZE 16384
-#define IPDBG_MIN_NUM_OF_OPTIONS 4
+#define IPDBG_MIN_NUM_OF_OPTIONS 2
#define IPDBG_MAX_NUM_OF_OPTIONS 14
#define IPDBG_MIN_DR_LENGTH 11
#define IPDBG_MAX_DR_LENGTH 13
@@ -631,10 +632,8 @@ static int ipdbg_start(uint16_t port, struct jtag_tap *tap, uint32_t user_instru
}
} else {
int retval = ipdbg_create_hub(tap, user_instruction, data_register_length, virtual_ir, &hub);
- if (retval != ERROR_OK) {
- free(virtual_ir);
+ if (retval != ERROR_OK)
return retval;
- }
}
struct ipdbg_service *service = NULL;
@@ -716,6 +715,7 @@ COMMAND_HANDLER(handle_ipdbg_command)
uint32_t virtual_ir_length = 5;
uint32_t virtual_ir_value = 0x11;
struct ipdbg_virtual_ir_info *virtual_ir = NULL;
+ int user_num = 1;
if ((CMD_ARGC < IPDBG_MIN_NUM_OF_OPTIONS) || (CMD_ARGC > IPDBG_MAX_NUM_OF_OPTIONS))
return ERROR_COMMAND_SYNTAX_ERROR;
@@ -742,6 +742,34 @@ COMMAND_HANDLER(handle_ipdbg_command)
IPDBG_MIN_DR_LENGTH, IPDBG_MAX_DR_LENGTH);
return ERROR_FAIL;
}
+ } else if (strcmp(CMD_ARGV[i], "-pld") == 0) {
+ ++i;
+ if (i >= CMD_ARGC || CMD_ARGV[i][0] == '-')
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ struct pld_device *device = get_pld_device_by_name_or_numstr(CMD_ARGV[i]);
+ if (!device || !device->driver) {
+ command_print(CMD, "pld device '#%s' is out of bounds or unknown", CMD_ARGV[i]);
+ return ERROR_FAIL;
+ }
+ COMMAND_PARSE_OPTIONAL_NUMBER(int, i, user_num);
+ struct pld_ipdbg_hub pld_hub;
+ struct pld_driver *driver = device->driver;
+ if (!driver->get_ipdbg_hub) {
+ command_print(CMD, "pld driver has no ipdbg support");
+ return ERROR_FAIL;
+ }
+ if (driver->get_ipdbg_hub(user_num, device, &pld_hub) != ERROR_OK) {
+ command_print(CMD, "unable to retrieve hub from pld driver");
+ return ERROR_FAIL;
+ }
+ if (!pld_hub.tap) {
+ command_print(CMD, "no tap received from pld driver");
+ return ERROR_FAIL;
+ }
+ hub_configured = true;
+ user_instruction = pld_hub.user_ir_code;
+ tap = pld_hub.tap;
+
} else if (strcmp(CMD_ARGV[i], "-vir") == 0) {
COMMAND_PARSE_OPTIONAL_NUMBER(u32, i, virtual_ir_value);
COMMAND_PARSE_OPTIONAL_NUMBER(u32, i, virtual_ir_length);