diff mbox series

[v2,09/10] main: Convert gdbserver command to path based targeting

Message ID 20181123044019.633814-10-amitay@ozlabs.org
State Accepted
Headers show
Series Convert more commands to path based targeting | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch success master/apply_patch Successfully applied
snowpatch_ozlabs/build-multiarch success Test build-multiarch on branch master

Commit Message

Amitay Isaacs Nov. 23, 2018, 4:40 a.m. UTC
Signed-off-by: Amitay Isaacs <amitay@ozlabs.org>
---
 src/pdbgproxy.c | 77 ++++++++++++++++++++++++-------------------------
 1 file changed, 38 insertions(+), 39 deletions(-)

Comments

Rashmica Gupta Dec. 2, 2018, 10:57 p.m. UTC | #1
Looks good to me

Reviewed-by: Rashmica Gupta <rashmica.g@gmail.com>


On Fri, 2018-11-23 at 15:40 +1100, Amitay Isaacs wrote:
> Signed-off-by: Amitay Isaacs <amitay@ozlabs.org>
> ---
>  src/pdbgproxy.c | 77 ++++++++++++++++++++++++-----------------------
> --
>  1 file changed, 38 insertions(+), 39 deletions(-)
> 
> diff --git a/src/pdbgproxy.c b/src/pdbgproxy.c
> index 697e58e..dedea7a 100644
> --- a/src/pdbgproxy.c
> +++ b/src/pdbgproxy.c
> @@ -24,6 +24,7 @@
>  #include "optcmd.h"
>  #include "debug.h"
>  #include "chip.h"
> +#include "path.h"
>  
>  #ifndef DISABLE_GDBSERVER
>  
> @@ -41,6 +42,7 @@
>  #define TEST_SKIBOOT_ADDR 0x40000000
>  
>  static struct pdbg_target *thread_target = NULL;
> +static struct pdbg_target *adu_target;
>  static struct timeval timeout;
>  static int poll_interval = 100;
>  static int fd = -1;
> @@ -200,7 +202,6 @@ static uint64_t get_real_addr(uint64_t addr)
>  
>  static void get_mem(uint64_t *stack, void *priv)
>  {
> -	struct pdbg_target *adu;
>  	uint64_t addr, len, linear_map;
>  	int i, err = 0;
>  	uint64_t data[MAX_DATA/sizeof(uint64_t)];
> @@ -210,17 +211,6 @@ static void get_mem(uint64_t *stack, void *priv)
>  	addr = stack[0];
>  	len = stack[1];
>  
> -	pdbg_for_each_class_target("adu", adu) {
> -		if (pdbg_target_probe(adu) == PDBG_TARGET_ENABLED)
> -			break;
> -	}
> -
> -	if (adu == NULL) {
> -		PR_ERROR("ADU NOT FOUND\n");
> -		err=3;
> -		goto out;
> -	}
> -
>  	if (len > MAX_DATA) {
>  		PR_INFO("Too much memory requested, truncating\n");
>  		len = MAX_DATA;
> @@ -233,7 +223,7 @@ static void get_mem(uint64_t *stack, void *priv)
>  
>  	linear_map = get_real_addr(addr);
>  	if (linear_map != -1UL) {
> -		if (adu_getmem(adu, linear_map, (uint8_t *) data, len))
> {
> +		if (adu_getmem(adu_target, linear_map, (uint8_t *)
> data, len)) {
>  			PR_ERROR("Unable to read memory\n");
>  			err = 1;
>  		}
> @@ -261,7 +251,6 @@ out:
>  
>  static void put_mem(uint64_t *stack, void *priv)
>  {
> -	struct pdbg_target *adu;
>  	uint64_t addr, len;
>  	uint8_t *data;
>  	uint8_t attn_opcode[] = {0x00, 0x00, 0x02, 0x00};
> @@ -277,17 +266,6 @@ static void put_mem(uint64_t *stack, void *priv)
>  	len = stack[1];
>  	data = (uint8_t *) &stack[2];
>  
> -	pdbg_for_each_class_target("adu", adu) {
> -		if (pdbg_target_probe(adu) == PDBG_TARGET_ENABLED)
> -			break;
> -	}
> -
> -	if (adu == NULL) {
> -		PR_ERROR("ADU NOT FOUND\n");
> -		err=3;
> -		goto out;
> -	}
> -
>  	addr = get_real_addr(addr);
>  	if (addr == -1UL) {
>  		PR_ERROR("TODO: No virtual address support for
> putmem\n");
> @@ -315,7 +293,7 @@ static void put_mem(uint64_t *stack, void *priv)
>  
>  	PR_INFO("put_mem 0x%016" PRIx64 " = 0x%016" PRIx64 "\n", addr,
> stack[2]);
>  
> -	if (adu_putmem(adu, addr, data, len)) {
> +	if (adu_putmem(adu_target, addr, data, len)) {
>  		PR_ERROR("Unable to write memory\n");
>  		err = 3;
>  	}
> @@ -442,14 +420,15 @@ command_cb callbacks[LAST_CMD + 1] = {
>  	disconnect,
>  	NULL};
>  
> -int gdbserver_start(struct pdbg_target *target, uint16_t port)
> +int gdbserver_start(struct pdbg_target *thread, struct pdbg_target
> *adu, uint16_t port)
>  {
>  	int sock, i;
>  	struct sockaddr_in name;
>  	fd_set active_fd_set, read_fd_set;
>  
>  	parser_init(callbacks);
> -	thread_target = target;
> +	thread_target = thread;
> +	adu_target = adu;
>  
>  	sock = socket(PF_INET, SOCK_STREAM, 0);
>  	if (sock < 0) {
> @@ -516,34 +495,54 @@ int gdbserver_start(struct pdbg_target *target,
> uint16_t port)
>  
>  static int gdbserver(uint16_t port)
>  {
> -	struct pdbg_target *target = NULL;
> +	struct pdbg_target *target, *adu, *thread = NULL;
>  	uint64_t msr;
>  	int rc;
>  
> -	for_each_class_target("thread", target) {
> -		if (!target_selected(target))
> +	for_each_path_target_class("thread", target) {
> +		if (pdbg_target_probe(target) != PDBG_TARGET_ENABLED)
>  			continue;
> -		if (pdbg_target_probe(target) == PDBG_TARGET_ENABLED)
> -			break;
> +
> +		if (!thread) {
> +			thread = target;
> +		} else {
> +			fprintf(stderr, "GDB server cannot be run on
> multiple threads at once.\n");
> +			return 0;
> +		}
>  	}
> -	if (!target->class)
> -		return -1;
> -	assert(!strcmp(target->class, "thread"));
> +
> +	if (!thread) {
> +		fprintf(stderr, "No thread selected\n");
> +		return 0;
> +	}
> +
> +	//
>  	// Temporary until I can get this working a bit smoother on p9
> -	if (strcmp(target->compatible, "ibm,power8-thread")) {
> +	if (strcmp(thread->compatible, "ibm,power8-thread")) {
>  		PR_ERROR("GDBSERVER is only tested on POWER8\n");
>  		return -1;
>  	}
>  
>  	/* Check endianess in MSR */
> -	rc = ram_getmsr(target, &msr);
> +	rc = ram_getmsr(thread, &msr);
>  	if (rc) {
>  		PR_ERROR("Couldn't read the MSR. Are all threads on
> this chiplet quiesced?\n");
>  		return 1;
>  	}
>  	littleendian = 0x01 & msr;
>  
> -	gdbserver_start(target, port);
> +	/* Select ADU target */
> +	pdbg_for_each_class_target("adu", adu) {
> +		if (pdbg_target_probe(adu) == PDBG_TARGET_ENABLED)
> +			break;
> +	}
> +
> +	if (!adu) {
> +		fprintf(stderr, "No ADU found\n");
> +		return 0;
> +	}
> +
> +	gdbserver_start(thread, adu, port);
>  	return 0;
>  }
>  #else
> -- 
> 2.19.1
>
diff mbox series

Patch

diff --git a/src/pdbgproxy.c b/src/pdbgproxy.c
index 697e58e..dedea7a 100644
--- a/src/pdbgproxy.c
+++ b/src/pdbgproxy.c
@@ -24,6 +24,7 @@ 
 #include "optcmd.h"
 #include "debug.h"
 #include "chip.h"
+#include "path.h"
 
 #ifndef DISABLE_GDBSERVER
 
@@ -41,6 +42,7 @@ 
 #define TEST_SKIBOOT_ADDR 0x40000000
 
 static struct pdbg_target *thread_target = NULL;
+static struct pdbg_target *adu_target;
 static struct timeval timeout;
 static int poll_interval = 100;
 static int fd = -1;
@@ -200,7 +202,6 @@  static uint64_t get_real_addr(uint64_t addr)
 
 static void get_mem(uint64_t *stack, void *priv)
 {
-	struct pdbg_target *adu;
 	uint64_t addr, len, linear_map;
 	int i, err = 0;
 	uint64_t data[MAX_DATA/sizeof(uint64_t)];
@@ -210,17 +211,6 @@  static void get_mem(uint64_t *stack, void *priv)
 	addr = stack[0];
 	len = stack[1];
 
-	pdbg_for_each_class_target("adu", adu) {
-		if (pdbg_target_probe(adu) == PDBG_TARGET_ENABLED)
-			break;
-	}
-
-	if (adu == NULL) {
-		PR_ERROR("ADU NOT FOUND\n");
-		err=3;
-		goto out;
-	}
-
 	if (len > MAX_DATA) {
 		PR_INFO("Too much memory requested, truncating\n");
 		len = MAX_DATA;
@@ -233,7 +223,7 @@  static void get_mem(uint64_t *stack, void *priv)
 
 	linear_map = get_real_addr(addr);
 	if (linear_map != -1UL) {
-		if (adu_getmem(adu, linear_map, (uint8_t *) data, len)) {
+		if (adu_getmem(adu_target, linear_map, (uint8_t *) data, len)) {
 			PR_ERROR("Unable to read memory\n");
 			err = 1;
 		}
@@ -261,7 +251,6 @@  out:
 
 static void put_mem(uint64_t *stack, void *priv)
 {
-	struct pdbg_target *adu;
 	uint64_t addr, len;
 	uint8_t *data;
 	uint8_t attn_opcode[] = {0x00, 0x00, 0x02, 0x00};
@@ -277,17 +266,6 @@  static void put_mem(uint64_t *stack, void *priv)
 	len = stack[1];
 	data = (uint8_t *) &stack[2];
 
-	pdbg_for_each_class_target("adu", adu) {
-		if (pdbg_target_probe(adu) == PDBG_TARGET_ENABLED)
-			break;
-	}
-
-	if (adu == NULL) {
-		PR_ERROR("ADU NOT FOUND\n");
-		err=3;
-		goto out;
-	}
-
 	addr = get_real_addr(addr);
 	if (addr == -1UL) {
 		PR_ERROR("TODO: No virtual address support for putmem\n");
@@ -315,7 +293,7 @@  static void put_mem(uint64_t *stack, void *priv)
 
 	PR_INFO("put_mem 0x%016" PRIx64 " = 0x%016" PRIx64 "\n", addr, stack[2]);
 
-	if (adu_putmem(adu, addr, data, len)) {
+	if (adu_putmem(adu_target, addr, data, len)) {
 		PR_ERROR("Unable to write memory\n");
 		err = 3;
 	}
@@ -442,14 +420,15 @@  command_cb callbacks[LAST_CMD + 1] = {
 	disconnect,
 	NULL};
 
-int gdbserver_start(struct pdbg_target *target, uint16_t port)
+int gdbserver_start(struct pdbg_target *thread, struct pdbg_target *adu, uint16_t port)
 {
 	int sock, i;
 	struct sockaddr_in name;
 	fd_set active_fd_set, read_fd_set;
 
 	parser_init(callbacks);
-	thread_target = target;
+	thread_target = thread;
+	adu_target = adu;
 
 	sock = socket(PF_INET, SOCK_STREAM, 0);
 	if (sock < 0) {
@@ -516,34 +495,54 @@  int gdbserver_start(struct pdbg_target *target, uint16_t port)
 
 static int gdbserver(uint16_t port)
 {
-	struct pdbg_target *target = NULL;
+	struct pdbg_target *target, *adu, *thread = NULL;
 	uint64_t msr;
 	int rc;
 
-	for_each_class_target("thread", target) {
-		if (!target_selected(target))
+	for_each_path_target_class("thread", target) {
+		if (pdbg_target_probe(target) != PDBG_TARGET_ENABLED)
 			continue;
-		if (pdbg_target_probe(target) == PDBG_TARGET_ENABLED)
-			break;
+
+		if (!thread) {
+			thread = target;
+		} else {
+			fprintf(stderr, "GDB server cannot be run on multiple threads at once.\n");
+			return 0;
+		}
 	}
-	if (!target->class)
-		return -1;
-	assert(!strcmp(target->class, "thread"));
+
+	if (!thread) {
+		fprintf(stderr, "No thread selected\n");
+		return 0;
+	}
+
+	//
 	// Temporary until I can get this working a bit smoother on p9
-	if (strcmp(target->compatible, "ibm,power8-thread")) {
+	if (strcmp(thread->compatible, "ibm,power8-thread")) {
 		PR_ERROR("GDBSERVER is only tested on POWER8\n");
 		return -1;
 	}
 
 	/* Check endianess in MSR */
-	rc = ram_getmsr(target, &msr);
+	rc = ram_getmsr(thread, &msr);
 	if (rc) {
 		PR_ERROR("Couldn't read the MSR. Are all threads on this chiplet quiesced?\n");
 		return 1;
 	}
 	littleendian = 0x01 & msr;
 
-	gdbserver_start(target, port);
+	/* Select ADU target */
+	pdbg_for_each_class_target("adu", adu) {
+		if (pdbg_target_probe(adu) == PDBG_TARGET_ENABLED)
+			break;
+	}
+
+	if (!adu) {
+		fprintf(stderr, "No ADU found\n");
+		return 0;
+	}
+
+	gdbserver_start(thread, adu, port);
 	return 0;
 }
 #else