Message ID | 20190709113715.7761-2-philmd@redhat.com |
---|---|
State | New |
Headers | show |
Series | hw: Avoid crash when reading empty RX FIFO | expand |
On Tue, Jul 9, 2019 at 4:40 AM Philippe Mathieu-Daudé <philmd@redhat.com> wrote: > > Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > Useful while debugging, can be skipped for next dev cycle. > > Makefile.objs | 1 + > hw/ssi/mss-spi.c | 23 ++++++----------------- > hw/ssi/trace-events | 6 ++++++ > 3 files changed, 13 insertions(+), 17 deletions(-) > create mode 100644 hw/ssi/trace-events > > diff --git a/Makefile.objs b/Makefile.objs > index 6a143dcd57..60ec443091 100644 > --- a/Makefile.objs > +++ b/Makefile.objs > @@ -178,6 +178,7 @@ trace-events-subdirs += hw/scsi > trace-events-subdirs += hw/sd > trace-events-subdirs += hw/sparc > trace-events-subdirs += hw/sparc64 > +trace-events-subdirs += hw/ssi > trace-events-subdirs += hw/timer > trace-events-subdirs += hw/tpm > trace-events-subdirs += hw/usb > diff --git a/hw/ssi/mss-spi.c b/hw/ssi/mss-spi.c > index 918b1f3e82..4878279482 100644 > --- a/hw/ssi/mss-spi.c > +++ b/hw/ssi/mss-spi.c > @@ -27,18 +27,8 @@ > #include "hw/ssi/mss-spi.h" > #include "qemu/log.h" > #include "qemu/module.h" > +#include "trace.h" > > -#ifndef MSS_SPI_ERR_DEBUG > -#define MSS_SPI_ERR_DEBUG 0 > -#endif > - > -#define DB_PRINT_L(lvl, fmt, args...) do { \ > - if (MSS_SPI_ERR_DEBUG >= lvl) { \ > - qemu_log("%s: " fmt "\n", __func__, ## args); \ > - } \ > -} while (0) > - > -#define DB_PRINT(fmt, args...) DB_PRINT_L(1, fmt, ## args) > > #define FIFO_CAPACITY 32 > > @@ -187,9 +177,9 @@ spi_read(void *opaque, hwaddr addr, unsigned int size) > } > break; > } > - > - DB_PRINT("addr=0x%" HWADDR_PRIx " = 0x%" PRIx32, addr * 4, ret); > + trace_mss_spi_read(addr << 2, ret); > spi_update_irq(s); > + > return ret; > } > > @@ -225,9 +215,9 @@ static void spi_flush_txfifo(MSSSpiState *s) > s->regs[R_SPI_STATUS] &= ~(S_TXDONE | S_RXRDY); > > tx = fifo32_pop(&s->tx_fifo); > - DB_PRINT("data tx:0x%" PRIx32, tx); > + trace_mss_spi_flush_fifo("tx", tx); > rx = ssi_transfer(s->spi, tx); > - DB_PRINT("data rx:0x%" PRIx32, rx); > + trace_mss_spi_flush_fifo("rx", rx); > > if (fifo32_num_used(&s->rx_fifo) == s->fifo_depth) { > s->regs[R_SPI_STATUS] |= S_RXCHOVRF; > @@ -262,9 +252,8 @@ static void spi_write(void *opaque, hwaddr addr, > MSSSpiState *s = opaque; > uint32_t value = val64; > > - DB_PRINT("addr=0x%" HWADDR_PRIx " =0x%" PRIx32, addr, value); > + trace_mss_spi_write(addr, value); > addr >>= 2; > - > switch (addr) { > case R_SPI_TX: > /* adding to already full FIFO */ > diff --git a/hw/ssi/trace-events b/hw/ssi/trace-events > new file mode 100644 > index 0000000000..6e494b913c > --- /dev/null > +++ b/hw/ssi/trace-events > @@ -0,0 +1,6 @@ > +# See docs/devel/tracing.txt for syntax documentation. > + > +# mss-spi.c > +mss_spi_read(uint32_t addr, uint32_t value) "read addr:0x%02x value:0x%08x" > +mss_spi_write(uint32_t addr, uint32_t value) "write addr:0x%02x value:0x%08x" > +mss_spi_flush_fifo(const char *name, uint32_t value) "flush fifo:%s value:0x%08x" > -- > 2.20.1 > >
diff --git a/Makefile.objs b/Makefile.objs index 6a143dcd57..60ec443091 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -178,6 +178,7 @@ trace-events-subdirs += hw/scsi trace-events-subdirs += hw/sd trace-events-subdirs += hw/sparc trace-events-subdirs += hw/sparc64 +trace-events-subdirs += hw/ssi trace-events-subdirs += hw/timer trace-events-subdirs += hw/tpm trace-events-subdirs += hw/usb diff --git a/hw/ssi/mss-spi.c b/hw/ssi/mss-spi.c index 918b1f3e82..4878279482 100644 --- a/hw/ssi/mss-spi.c +++ b/hw/ssi/mss-spi.c @@ -27,18 +27,8 @@ #include "hw/ssi/mss-spi.h" #include "qemu/log.h" #include "qemu/module.h" +#include "trace.h" -#ifndef MSS_SPI_ERR_DEBUG -#define MSS_SPI_ERR_DEBUG 0 -#endif - -#define DB_PRINT_L(lvl, fmt, args...) do { \ - if (MSS_SPI_ERR_DEBUG >= lvl) { \ - qemu_log("%s: " fmt "\n", __func__, ## args); \ - } \ -} while (0) - -#define DB_PRINT(fmt, args...) DB_PRINT_L(1, fmt, ## args) #define FIFO_CAPACITY 32 @@ -187,9 +177,9 @@ spi_read(void *opaque, hwaddr addr, unsigned int size) } break; } - - DB_PRINT("addr=0x%" HWADDR_PRIx " = 0x%" PRIx32, addr * 4, ret); + trace_mss_spi_read(addr << 2, ret); spi_update_irq(s); + return ret; } @@ -225,9 +215,9 @@ static void spi_flush_txfifo(MSSSpiState *s) s->regs[R_SPI_STATUS] &= ~(S_TXDONE | S_RXRDY); tx = fifo32_pop(&s->tx_fifo); - DB_PRINT("data tx:0x%" PRIx32, tx); + trace_mss_spi_flush_fifo("tx", tx); rx = ssi_transfer(s->spi, tx); - DB_PRINT("data rx:0x%" PRIx32, rx); + trace_mss_spi_flush_fifo("rx", rx); if (fifo32_num_used(&s->rx_fifo) == s->fifo_depth) { s->regs[R_SPI_STATUS] |= S_RXCHOVRF; @@ -262,9 +252,8 @@ static void spi_write(void *opaque, hwaddr addr, MSSSpiState *s = opaque; uint32_t value = val64; - DB_PRINT("addr=0x%" HWADDR_PRIx " =0x%" PRIx32, addr, value); + trace_mss_spi_write(addr, value); addr >>= 2; - switch (addr) { case R_SPI_TX: /* adding to already full FIFO */ diff --git a/hw/ssi/trace-events b/hw/ssi/trace-events new file mode 100644 index 0000000000..6e494b913c --- /dev/null +++ b/hw/ssi/trace-events @@ -0,0 +1,6 @@ +# See docs/devel/tracing.txt for syntax documentation. + +# mss-spi.c +mss_spi_read(uint32_t addr, uint32_t value) "read addr:0x%02x value:0x%08x" +mss_spi_write(uint32_t addr, uint32_t value) "write addr:0x%02x value:0x%08x" +mss_spi_flush_fifo(const char *name, uint32_t value) "flush fifo:%s value:0x%08x"
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> --- Useful while debugging, can be skipped for next dev cycle. Makefile.objs | 1 + hw/ssi/mss-spi.c | 23 ++++++----------------- hw/ssi/trace-events | 6 ++++++ 3 files changed, 13 insertions(+), 17 deletions(-) create mode 100644 hw/ssi/trace-events