exec.c: Convert subpage memory ops to _with_attrs

Convert the subpage memory ops to _with_attrs; this will allow
us to pass the attributes through to the underlying access
functions. (Nothing uses the attributes yet.)

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
This commit is contained in:
Peter Maydell 2015-04-26 16:49:24 +01:00
parent fadc1cbe85
commit f25a49e005
1 changed files with 21 additions and 12 deletions

33
exec.c
View File

@ -1941,8 +1941,8 @@ static const MemoryRegionOps watch_mem_ops = {
.endianness = DEVICE_NATIVE_ENDIAN, .endianness = DEVICE_NATIVE_ENDIAN,
}; };
static uint64_t subpage_read(void *opaque, hwaddr addr, static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data,
unsigned len) unsigned len, MemTxAttrs attrs)
{ {
subpage_t *subpage = opaque; subpage_t *subpage = opaque;
uint8_t buf[8]; uint8_t buf[8];
@ -1951,23 +1951,29 @@ static uint64_t subpage_read(void *opaque, hwaddr addr,
printf("%s: subpage %p len %u addr " TARGET_FMT_plx "\n", __func__, printf("%s: subpage %p len %u addr " TARGET_FMT_plx "\n", __func__,
subpage, len, addr); subpage, len, addr);
#endif #endif
address_space_read(subpage->as, addr + subpage->base, buf, len); if (address_space_read(subpage->as, addr + subpage->base, buf, len)) {
return MEMTX_DECODE_ERROR;
}
switch (len) { switch (len) {
case 1: case 1:
return ldub_p(buf); *data = ldub_p(buf);
return MEMTX_OK;
case 2: case 2:
return lduw_p(buf); *data = lduw_p(buf);
return MEMTX_OK;
case 4: case 4:
return ldl_p(buf); *data = ldl_p(buf);
return MEMTX_OK;
case 8: case 8:
return ldq_p(buf); *data = ldq_p(buf);
return MEMTX_OK;
default: default:
abort(); abort();
} }
} }
static void subpage_write(void *opaque, hwaddr addr, static MemTxResult subpage_write(void *opaque, hwaddr addr,
uint64_t value, unsigned len) uint64_t value, unsigned len, MemTxAttrs attrs)
{ {
subpage_t *subpage = opaque; subpage_t *subpage = opaque;
uint8_t buf[8]; uint8_t buf[8];
@ -1993,7 +1999,10 @@ static void subpage_write(void *opaque, hwaddr addr,
default: default:
abort(); abort();
} }
address_space_write(subpage->as, addr + subpage->base, buf, len); if (address_space_write(subpage->as, addr + subpage->base, buf, len)) {
return MEMTX_DECODE_ERROR;
}
return MEMTX_OK;
} }
static bool subpage_accepts(void *opaque, hwaddr addr, static bool subpage_accepts(void *opaque, hwaddr addr,
@ -2010,8 +2019,8 @@ static bool subpage_accepts(void *opaque, hwaddr addr,
} }
static const MemoryRegionOps subpage_ops = { static const MemoryRegionOps subpage_ops = {
.read = subpage_read, .read_with_attrs = subpage_read,
.write = subpage_write, .write_with_attrs = subpage_write,
.impl.min_access_size = 1, .impl.min_access_size = 1,
.impl.max_access_size = 8, .impl.max_access_size = 8,
.valid.min_access_size = 1, .valid.min_access_size = 1,