mirror of https://github.com/xqemu/xqemu.git
Make flatview_translate() take a MemTxAttrs argument
As part of plumbing MemTxAttrs down to the IOMMU translate method, add MemTxAttrs as an argument to flatview_translate(); all its callers now have attrs available. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20180521140402.23318-11-peter.maydell@linaro.org
This commit is contained in:
parent
eace72b7a6
commit
efa99a2ff8
17
exec.c
17
exec.c
|
@ -618,7 +618,8 @@ iotlb_fail:
|
||||||
|
|
||||||
/* Called from RCU critical section */
|
/* Called from RCU critical section */
|
||||||
MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
|
MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
|
||||||
hwaddr *plen, bool is_write)
|
hwaddr *plen, bool is_write,
|
||||||
|
MemTxAttrs attrs)
|
||||||
{
|
{
|
||||||
MemoryRegion *mr;
|
MemoryRegion *mr;
|
||||||
MemoryRegionSection section;
|
MemoryRegionSection section;
|
||||||
|
@ -3152,7 +3153,7 @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr,
|
||||||
}
|
}
|
||||||
|
|
||||||
l = len;
|
l = len;
|
||||||
mr = flatview_translate(fv, addr, &addr1, &l, true);
|
mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -3168,7 +3169,7 @@ static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
|
||||||
MemTxResult result = MEMTX_OK;
|
MemTxResult result = MEMTX_OK;
|
||||||
|
|
||||||
l = len;
|
l = len;
|
||||||
mr = flatview_translate(fv, addr, &addr1, &l, true);
|
mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
|
||||||
result = flatview_write_continue(fv, addr, attrs, buf, len,
|
result = flatview_write_continue(fv, addr, attrs, buf, len,
|
||||||
addr1, l, mr);
|
addr1, l, mr);
|
||||||
|
|
||||||
|
@ -3239,7 +3240,7 @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,
|
||||||
}
|
}
|
||||||
|
|
||||||
l = len;
|
l = len;
|
||||||
mr = flatview_translate(fv, addr, &addr1, &l, false);
|
mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -3254,7 +3255,7 @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
|
||||||
MemoryRegion *mr;
|
MemoryRegion *mr;
|
||||||
|
|
||||||
l = len;
|
l = len;
|
||||||
mr = flatview_translate(fv, addr, &addr1, &l, false);
|
mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
|
||||||
return flatview_read_continue(fv, addr, attrs, buf, len,
|
return flatview_read_continue(fv, addr, attrs, buf, len,
|
||||||
addr1, l, mr);
|
addr1, l, mr);
|
||||||
}
|
}
|
||||||
|
@ -3468,7 +3469,7 @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
|
||||||
|
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
l = len;
|
l = len;
|
||||||
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
|
mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
|
||||||
if (!memory_access_is_direct(mr, is_write)) {
|
if (!memory_access_is_direct(mr, is_write)) {
|
||||||
l = memory_access_size(mr, l, addr);
|
l = memory_access_size(mr, l, addr);
|
||||||
if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
|
if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
|
||||||
|
@ -3516,7 +3517,7 @@ flatview_extend_translation(FlatView *fv, hwaddr addr,
|
||||||
|
|
||||||
len = target_len;
|
len = target_len;
|
||||||
this_mr = flatview_translate(fv, addr, &xlat,
|
this_mr = flatview_translate(fv, addr, &xlat,
|
||||||
&len, is_write);
|
&len, is_write, attrs);
|
||||||
if (this_mr != mr || xlat != base + done) {
|
if (this_mr != mr || xlat != base + done) {
|
||||||
return done;
|
return done;
|
||||||
}
|
}
|
||||||
|
@ -3549,7 +3550,7 @@ void *address_space_map(AddressSpace *as,
|
||||||
l = len;
|
l = len;
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
fv = address_space_to_flatview(as);
|
fv = address_space_to_flatview(as);
|
||||||
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
|
mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
|
||||||
|
|
||||||
if (!memory_access_is_direct(mr, is_write)) {
|
if (!memory_access_is_direct(mr, is_write)) {
|
||||||
if (atomic_xchg(&bounce.in_use, true)) {
|
if (atomic_xchg(&bounce.in_use, true)) {
|
||||||
|
|
|
@ -1913,7 +1913,8 @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
|
||||||
*/
|
*/
|
||||||
MemoryRegion *flatview_translate(FlatView *fv,
|
MemoryRegion *flatview_translate(FlatView *fv,
|
||||||
hwaddr addr, hwaddr *xlat,
|
hwaddr addr, hwaddr *xlat,
|
||||||
hwaddr *len, bool is_write);
|
hwaddr *len, bool is_write,
|
||||||
|
MemTxAttrs attrs);
|
||||||
|
|
||||||
static inline MemoryRegion *address_space_translate(AddressSpace *as,
|
static inline MemoryRegion *address_space_translate(AddressSpace *as,
|
||||||
hwaddr addr, hwaddr *xlat,
|
hwaddr addr, hwaddr *xlat,
|
||||||
|
@ -1921,7 +1922,7 @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
|
||||||
MemTxAttrs attrs)
|
MemTxAttrs attrs)
|
||||||
{
|
{
|
||||||
return flatview_translate(address_space_to_flatview(as),
|
return flatview_translate(address_space_to_flatview(as),
|
||||||
addr, xlat, len, is_write);
|
addr, xlat, len, is_write, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* address_space_access_valid: check for validity of accessing an address
|
/* address_space_access_valid: check for validity of accessing an address
|
||||||
|
@ -2030,7 +2031,7 @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr,
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
fv = address_space_to_flatview(as);
|
fv = address_space_to_flatview(as);
|
||||||
l = len;
|
l = len;
|
||||||
mr = flatview_translate(fv, addr, &addr1, &l, false);
|
mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
|
||||||
if (len == l && memory_access_is_direct(mr, false)) {
|
if (len == l && memory_access_is_direct(mr, false)) {
|
||||||
ptr = qemu_map_ram_ptr(mr->ram_block, addr1);
|
ptr = qemu_map_ram_ptr(mr->ram_block, addr1);
|
||||||
memcpy(buf, ptr, len);
|
memcpy(buf, ptr, len);
|
||||||
|
|
Loading…
Reference in New Issue