X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fqemu.git;a=blobdiff_plain;f=hw%2Fsd%2Fsdhci.c;fp=hw%2Fsd%2Fsdhci.c;h=27673e1c70e014818650b180032ce97b95b6636f;hp=c5e0bc018b09cb74e599edc0d6e6fc2798e3235d;hb=f243175727903a0d2b52422e7baef86c1838a895;hpb=fee571c7afced9bf4b01b864ea6e85f00fb50e30 diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c index c5e0bc018b0..27673e1c70e 100644 --- a/hw/sd/sdhci.c +++ b/hw/sd/sdhci.c @@ -473,6 +473,7 @@ static uint32_t sdhci_read_dataport(SDHCIState *s, unsigned size) } for (i = 0; i < size; i++) { + assert(s->data_count < s->buf_maxsz); value |= s->fifo_buffer[s->data_count] << i * 8; s->data_count++; /* check if we've read all valid data (blksize bytes) from buffer */ @@ -561,6 +562,7 @@ static void sdhci_write_dataport(SDHCIState *s, uint32_t value, unsigned size) } for (i = 0; i < size; i++) { + assert(s->data_count < s->buf_maxsz); s->fifo_buffer[s->data_count] = value & 0xFF; s->data_count++; value >>= 8; @@ -1208,6 +1210,12 @@ sdhci_write(void *opaque, hwaddr offset, uint64_t val, unsigned size) if (!(s->capareg & R_SDHC_CAPAB_SDMA_MASK)) { value &= ~SDHC_TRNS_DMA; } + + /* TRNMOD writes are inhibited while Command Inhibit (DAT) is true */ + if (s->prnsts & SDHC_DATA_INHIBIT) { + mask |= 0xffff; + } + MASKED_WRITE(s->trnmod, mask, value & SDHC_TRNMOD_MASK); MASKED_WRITE(s->cmdreg, mask >> 16, value >> 16);