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

Rashmica Gupta rashmica.g at gmail.com
Mon Dec 3 09:57:59 AEDT 2018


Looks good to me

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


On Fri, 2018-11-23 at 15:40 +1100, Amitay Isaacs wrote:
> Signed-off-by: Amitay Isaacs <amitay at 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
> 



More information about the Pdbg mailing list