Merge pull request #171 from shenki/mw-debug-features

mw debug features
jtag-port
Anton Blanchard 4 years ago committed by GitHub
commit 354e0fbfea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,9 +1,10 @@
CFLAGS = -O2 -g -Wall -std=c99
# CFLAGS += -I urjtag/urjtag/include/ -L urjtag/urjtag/src/.libs/

all: mw_debug

mw_debug: mw_debug.c
$(CC) -o $@ $^ -lurjtag
$(CC) -o $@ $^ $(CFLAGS) -lurjtag

clean:
rm -f mw_debug

@ -0,0 +1,63 @@
mw_debug is the microwatt debugger.

It can talk to the simulator using a socket.

On an Arty board it uses the FTDI device via liburjtag.

## Building on Fedora

```
dnf install urjtag-devel
make
```

If you commonly use it against one target, create an alias as follows:
```
alias mw="$HOME/microwatt/scripts/mw_debug/mw_debug -b jtag"
$ mw gpr 0 10
Connected to libftdi driver.
Found device ID: 0x0362d093
r0: 0000000000001094
r1: 0000000000001ed0
r2: 000000000000a000
r3: 0000000000000003
r4: 000000000000000d
r5: 00000000ffff2ca5
r6: 00000000ffff3eb8
r7: 0000000000000000
r8: 00000000ffff3c33
r9: 0000000000000003
Core: running
NIA: 00000000000011d4
MSR: 8000000000000001
```

## Building on Debian

Debian disables the library in the urjtag package. Instead, build against
local urjtag:

```
sudo apt install libftdi-dev
git clone https://git.code.sf.net/p/urjtag/git urjtag
cd urjtag/urjtag
./autogen.sh
make
```

And then uncomment the following line in Makefile to build against that copy

```
CFLAGS += -I urjtag/urjtag/include/ -L urjtag/urjtag/src/.libs/
```

To run:
```
alias mw="LD_LIBRARY_PATH=$HOME/microwatt/scripts/mw_debug/urjtag/urjtag/src/.libs/ $HOME/microwatt/scripts/mw_debug/mw_debug -b jtag"
$ mw
Connected to libftdi driver.
Found device ID: 0x0362d093
Core: running
NIA: 00000000000011b8
MSR: 8000000000000001
```

@ -1,3 +1,6 @@
#define _POSIX_C_SOURCE 200809L
#define _GNU_SOURCE

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@ -15,6 +18,7 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <urjtag/urjtag.h>
#include <inttypes.h>

#define DBG_WB_ADDR 0x00
#define DBG_WB_DATA 0x01
@ -104,6 +108,7 @@ static int sim_init(const char *target)

static int sim_reset(void)
{
return 0;
}

static void add_bits(uint8_t **p, int *b, uint64_t d, int c)
@ -152,7 +157,7 @@ static int sim_command(uint8_t op, uint8_t addr, uint64_t *data)
{
uint8_t buf[16], *p;
uint64_t d = data ? *data : 0;
int r, s, b = 0;
int r, b = 0;

memset(buf, 0, 16);
p = buf+1;
@ -280,6 +285,7 @@ static int jtag_init(const char *target)

static int jtag_reset(void)
{
return 0;
}

static int jtag_command(uint8_t op, uint8_t addr, uint64_t *data)
@ -382,8 +388,8 @@ static void core_status(void)
else if (stat & DBG_CORE_STAT_TERM)
statstr = "odd state (TERM but no STOP)";
printf("Core: %s%s\n", statstr, statstr2);
printf(" NIA: %016llx\n", (unsigned long long)nia);
printf(" MSR: %016llx\n", msr);
printf(" NIA: %016" PRIx64 "\n", nia);
printf(" MSR: %016" PRIx64 "\n", msr);
}

static void core_stop(void)
@ -438,12 +444,12 @@ static void gpr_read(uint64_t reg, uint64_t count)
data = 0xdeadbeef;
check(dmi_read(DBG_CORE_GSPR_DATA, &data), "reading GPR data");
if (reg <= 31)
printf("r%d", reg);
printf("r%"PRId64, reg);
else if ((reg - 32) < sizeof(fast_spr_names) / sizeof(fast_spr_names[0]))
printf("%s", fast_spr_names[reg - 32]);
else
printf("gspr%d", reg);
printf(":\t%016llx\n", data);
printf("gspr%"PRId64, reg);
printf(":\t%016"PRIx64"\n", data);
}
}

@ -505,7 +511,33 @@ static void load(const char *filename, uint64_t addr)

static void usage(const char *cmd)
{
fprintf(stderr, "Usage: %s <command> <args>\n", cmd);
fprintf(stderr, "Usage: %s -b <jtag|sim> <command> <args>\n", cmd);

fprintf(stderr, "\n");
fprintf(stderr, " CPU core:\n");
fprintf(stderr, " start\n");
fprintf(stderr, " stop\n");
fprintf(stderr, " step\n");
fprintf(stderr, " creset core reset\n");
fprintf(stderr, " icreset icache reset\n");

fprintf(stderr, "\n");
fprintf(stderr, " Memory:\n");
fprintf(stderr, " mr <hex addr>\n");
fprintf(stderr, " mw <hex addr> <hex value>\n");
fprintf(stderr, " load <file> [addr] If omitted address is 0\n");

fprintf(stderr, "\n");
fprintf(stderr, " Registers:\n");
fprintf(stderr, " gpr <reg> [count]\n");
fprintf(stderr, " status\n");

fprintf(stderr, "\n");
fprintf(stderr, " JTAG:\n");
fprintf(stderr, " dmiread <hex addr>\n");
fprintf(stderr, " dmiwrite <hex addr> <hex value>\n");
fprintf(stderr, " quit\n");

exit(1);
}


Loading…
Cancel
Save