mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-16 01:03:31 +00:00
memory: Refactor common shifting code from accessors
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20180927002416.1781-3-f4bug@amsat.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
36960b4d66
commit
3c754a9383
30
memory.c
30
memory.c
|
@ -374,6 +374,21 @@ static void adjust_endianness(MemoryRegion *mr, uint64_t *data, unsigned size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void memory_region_shift_read_access(uint64_t *value,
|
||||||
|
unsigned shift,
|
||||||
|
uint64_t mask,
|
||||||
|
uint64_t tmp)
|
||||||
|
{
|
||||||
|
*value |= (tmp & mask) << shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint64_t memory_region_shift_write_access(uint64_t *value,
|
||||||
|
unsigned shift,
|
||||||
|
uint64_t mask)
|
||||||
|
{
|
||||||
|
return (*value >> shift) & mask;
|
||||||
|
}
|
||||||
|
|
||||||
static hwaddr memory_region_to_absolute_addr(MemoryRegion *mr, hwaddr offset)
|
static hwaddr memory_region_to_absolute_addr(MemoryRegion *mr, hwaddr offset)
|
||||||
{
|
{
|
||||||
MemoryRegion *root;
|
MemoryRegion *root;
|
||||||
|
@ -418,7 +433,7 @@ static MemTxResult memory_region_oldmmio_read_accessor(MemoryRegion *mr,
|
||||||
hwaddr abs_addr = memory_region_to_absolute_addr(mr, addr);
|
hwaddr abs_addr = memory_region_to_absolute_addr(mr, addr);
|
||||||
trace_memory_region_ops_read(get_cpu_index(), mr, abs_addr, tmp, size);
|
trace_memory_region_ops_read(get_cpu_index(), mr, abs_addr, tmp, size);
|
||||||
}
|
}
|
||||||
*value |= (tmp & mask) << shift;
|
memory_region_shift_read_access(value, shift, mask, tmp);
|
||||||
return MEMTX_OK;
|
return MEMTX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -444,7 +459,7 @@ static MemTxResult memory_region_read_accessor(MemoryRegion *mr,
|
||||||
hwaddr abs_addr = memory_region_to_absolute_addr(mr, addr);
|
hwaddr abs_addr = memory_region_to_absolute_addr(mr, addr);
|
||||||
trace_memory_region_ops_read(get_cpu_index(), mr, abs_addr, tmp, size);
|
trace_memory_region_ops_read(get_cpu_index(), mr, abs_addr, tmp, size);
|
||||||
}
|
}
|
||||||
*value |= (tmp & mask) << shift;
|
memory_region_shift_read_access(value, shift, mask, tmp);
|
||||||
return MEMTX_OK;
|
return MEMTX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -471,7 +486,7 @@ static MemTxResult memory_region_read_with_attrs_accessor(MemoryRegion *mr,
|
||||||
hwaddr abs_addr = memory_region_to_absolute_addr(mr, addr);
|
hwaddr abs_addr = memory_region_to_absolute_addr(mr, addr);
|
||||||
trace_memory_region_ops_read(get_cpu_index(), mr, abs_addr, tmp, size);
|
trace_memory_region_ops_read(get_cpu_index(), mr, abs_addr, tmp, size);
|
||||||
}
|
}
|
||||||
*value |= (tmp & mask) << shift;
|
memory_region_shift_read_access(value, shift, mask, tmp);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -483,9 +498,8 @@ static MemTxResult memory_region_oldmmio_write_accessor(MemoryRegion *mr,
|
||||||
uint64_t mask,
|
uint64_t mask,
|
||||||
MemTxAttrs attrs)
|
MemTxAttrs attrs)
|
||||||
{
|
{
|
||||||
uint64_t tmp;
|
uint64_t tmp = memory_region_shift_write_access(value, shift, mask);
|
||||||
|
|
||||||
tmp = (*value >> shift) & mask;
|
|
||||||
if (mr->subpage) {
|
if (mr->subpage) {
|
||||||
trace_memory_region_subpage_write(get_cpu_index(), mr, addr, tmp, size);
|
trace_memory_region_subpage_write(get_cpu_index(), mr, addr, tmp, size);
|
||||||
} else if (mr == &io_mem_notdirty) {
|
} else if (mr == &io_mem_notdirty) {
|
||||||
|
@ -509,9 +523,8 @@ static MemTxResult memory_region_write_accessor(MemoryRegion *mr,
|
||||||
uint64_t mask,
|
uint64_t mask,
|
||||||
MemTxAttrs attrs)
|
MemTxAttrs attrs)
|
||||||
{
|
{
|
||||||
uint64_t tmp;
|
uint64_t tmp = memory_region_shift_write_access(value, shift, mask);
|
||||||
|
|
||||||
tmp = (*value >> shift) & mask;
|
|
||||||
if (mr->subpage) {
|
if (mr->subpage) {
|
||||||
trace_memory_region_subpage_write(get_cpu_index(), mr, addr, tmp, size);
|
trace_memory_region_subpage_write(get_cpu_index(), mr, addr, tmp, size);
|
||||||
} else if (mr == &io_mem_notdirty) {
|
} else if (mr == &io_mem_notdirty) {
|
||||||
|
@ -535,9 +548,8 @@ static MemTxResult memory_region_write_with_attrs_accessor(MemoryRegion *mr,
|
||||||
uint64_t mask,
|
uint64_t mask,
|
||||||
MemTxAttrs attrs)
|
MemTxAttrs attrs)
|
||||||
{
|
{
|
||||||
uint64_t tmp;
|
uint64_t tmp = memory_region_shift_write_access(value, shift, mask);
|
||||||
|
|
||||||
tmp = (*value >> shift) & mask;
|
|
||||||
if (mr->subpage) {
|
if (mr->subpage) {
|
||||||
trace_memory_region_subpage_write(get_cpu_index(), mr, addr, tmp, size);
|
trace_memory_region_subpage_write(get_cpu_index(), mr, addr, tmp, size);
|
||||||
} else if (mr == &io_mem_notdirty) {
|
} else if (mr == &io_mem_notdirty) {
|
||||||
|
|
Loading…
Reference in a new issue