Message ID | 1428931324-4973-6-git-send-email-peter.maydell@linaro.org |
---|---|
State | Accepted |
Headers | show |
Peter Maydell <peter.maydell@linaro.org> writes: > 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> > --- > exec.c | 33 +++++++++++++++++++++------------ > 1 file changed, 21 insertions(+), 12 deletions(-) > > diff --git a/exec.c b/exec.c > index 34dafd2..bba6f26 100644 > --- a/exec.c > +++ b/exec.c > @@ -1941,8 +1941,8 @@ static const MemoryRegionOps watch_mem_ops = { > .endianness = DEVICE_NATIVE_ENDIAN, > }; > > -static uint64_t subpage_read(void *opaque, hwaddr addr, > - unsigned len) > +static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data, > + unsigned len, MemTxAttrs attrs) > { > subpage_t *subpage = opaque; > 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__, > subpage, len, addr); > #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; > + } Doesn't this mean we loose potential other error bits that are returned by address_space_read()? Would MEMTX_ERROR ever potentially be returned? > switch (len) { > case 1: > - return ldub_p(buf); > + *data = ldub_p(buf); > + return MEMTX_OK; > case 2: > - return lduw_p(buf); > + *data = lduw_p(buf); > + return MEMTX_OK; > case 4: > - return ldl_p(buf); > + *data = ldl_p(buf); > + return MEMTX_OK; > case 8: > - return ldq_p(buf); > + *data = ldq_p(buf); > + return MEMTX_OK; > default: > abort(); > } > } > > -static void subpage_write(void *opaque, hwaddr addr, > - uint64_t value, unsigned len) > +static MemTxResult subpage_write(void *opaque, hwaddr addr, > + uint64_t value, unsigned len, MemTxAttrs attrs) > { > subpage_t *subpage = opaque; > uint8_t buf[8]; > @@ -1993,7 +1999,10 @@ static void subpage_write(void *opaque, hwaddr addr, > default: > 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; Same comment as above. > } > > 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 = { > - .read = subpage_read, > - .write = subpage_write, > + .read_with_attrs = subpage_read, > + .write_with_attrs = subpage_write, > .impl.min_access_size = 1, > .impl.max_access_size = 8, > .valid.min_access_size = 1,
On 17 April 2015 at 17:15, Alex Bennée <alex.bennee@linaro.org> wrote: > > Peter Maydell <peter.maydell@linaro.org> writes: > >> 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> >> --- >> exec.c | 33 +++++++++++++++++++++------------ >> 1 file changed, 21 insertions(+), 12 deletions(-) >> >> diff --git a/exec.c b/exec.c >> index 34dafd2..bba6f26 100644 >> --- a/exec.c >> +++ b/exec.c >> @@ -1941,8 +1941,8 @@ static const MemoryRegionOps watch_mem_ops = { >> .endianness = DEVICE_NATIVE_ENDIAN, >> }; >> >> -static uint64_t subpage_read(void *opaque, hwaddr addr, >> - unsigned len) >> +static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data, >> + unsigned len, MemTxAttrs attrs) >> { >> subpage_t *subpage = opaque; >> 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__, >> subpage, len, addr); >> #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; >> + } > > Doesn't this mean we loose potential other error bits that are returned > by address_space_read()? Would MEMTX_ERROR ever potentially be returned? At this point in the series address_space_read() returns a bool. In the next patch we change the return type of address_space_read() and this code is also changed to match (ie it returns the error value). -- PMM
Peter Maydell <peter.maydell@linaro.org> writes: > On 17 April 2015 at 17:15, Alex Bennée <alex.bennee@linaro.org> wrote: >> >> Peter Maydell <peter.maydell@linaro.org> writes: >> >>> 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> >>> --- >>> exec.c | 33 +++++++++++++++++++++------------ >>> 1 file changed, 21 insertions(+), 12 deletions(-) >>> >>> diff --git a/exec.c b/exec.c >>> index 34dafd2..bba6f26 100644 >>> --- a/exec.c >>> +++ b/exec.c >>> @@ -1941,8 +1941,8 @@ static const MemoryRegionOps watch_mem_ops = { >>> .endianness = DEVICE_NATIVE_ENDIAN, >>> }; >>> >>> -static uint64_t subpage_read(void *opaque, hwaddr addr, >>> - unsigned len) >>> +static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data, >>> + unsigned len, MemTxAttrs attrs) >>> { >>> subpage_t *subpage = opaque; >>> 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__, >>> subpage, len, addr); >>> #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; >>> + } >> >> Doesn't this mean we loose potential other error bits that are returned >> by address_space_read()? Would MEMTX_ERROR ever potentially be returned? > > At this point in the series address_space_read() returns a bool. > In the next patch we change the return type of address_space_read() > and this code is also changed to match (ie it returns the error > value). Ah yes, the jumping between patch and final tree confused me. Have a: Reviewed-by: Alex Bennée <alex.bennee@linaro.org> > > -- PMM
diff --git a/exec.c b/exec.c index 34dafd2..bba6f26 100644 --- a/exec.c +++ b/exec.c @@ -1941,8 +1941,8 @@ static const MemoryRegionOps watch_mem_ops = { .endianness = DEVICE_NATIVE_ENDIAN, }; -static uint64_t subpage_read(void *opaque, hwaddr addr, - unsigned len) +static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data, + unsigned len, MemTxAttrs attrs) { subpage_t *subpage = opaque; 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__, subpage, len, addr); #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) { case 1: - return ldub_p(buf); + *data = ldub_p(buf); + return MEMTX_OK; case 2: - return lduw_p(buf); + *data = lduw_p(buf); + return MEMTX_OK; case 4: - return ldl_p(buf); + *data = ldl_p(buf); + return MEMTX_OK; case 8: - return ldq_p(buf); + *data = ldq_p(buf); + return MEMTX_OK; default: abort(); } } -static void subpage_write(void *opaque, hwaddr addr, - uint64_t value, unsigned len) +static MemTxResult subpage_write(void *opaque, hwaddr addr, + uint64_t value, unsigned len, MemTxAttrs attrs) { subpage_t *subpage = opaque; uint8_t buf[8]; @@ -1993,7 +1999,10 @@ static void subpage_write(void *opaque, hwaddr addr, default: 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, @@ -2010,8 +2019,8 @@ static bool subpage_accepts(void *opaque, hwaddr addr, } static const MemoryRegionOps subpage_ops = { - .read = subpage_read, - .write = subpage_write, + .read_with_attrs = subpage_read, + .write_with_attrs = subpage_write, .impl.min_access_size = 1, .impl.max_access_size = 8, .valid.min_access_size = 1,