memory: add return value to address_space_rw/read/write
Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
791af8c861
commit
fd8aaa767a
34
exec.c
34
exec.c
@ -1902,7 +1902,7 @@ static inline int memory_access_size(int l, hwaddr addr)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
|
bool address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
|
||||||
int len, bool is_write)
|
int len, bool is_write)
|
||||||
{
|
{
|
||||||
hwaddr l;
|
hwaddr l;
|
||||||
@ -1910,6 +1910,7 @@ void address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
|
|||||||
uint64_t val;
|
uint64_t val;
|
||||||
hwaddr addr1;
|
hwaddr addr1;
|
||||||
MemoryRegionSection *section;
|
MemoryRegionSection *section;
|
||||||
|
bool error = false;
|
||||||
|
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
l = len;
|
l = len;
|
||||||
@ -1923,15 +1924,15 @@ void address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
|
|||||||
if (l == 4) {
|
if (l == 4) {
|
||||||
/* 32 bit write access */
|
/* 32 bit write access */
|
||||||
val = ldl_p(buf);
|
val = ldl_p(buf);
|
||||||
io_mem_write(section->mr, addr1, val, 4);
|
error |= io_mem_write(section->mr, addr1, val, 4);
|
||||||
} else if (l == 2) {
|
} else if (l == 2) {
|
||||||
/* 16 bit write access */
|
/* 16 bit write access */
|
||||||
val = lduw_p(buf);
|
val = lduw_p(buf);
|
||||||
io_mem_write(section->mr, addr1, val, 2);
|
error |= io_mem_write(section->mr, addr1, val, 2);
|
||||||
} else {
|
} else {
|
||||||
/* 8 bit write access */
|
/* 8 bit write access */
|
||||||
val = ldub_p(buf);
|
val = ldub_p(buf);
|
||||||
io_mem_write(section->mr, addr1, val, 1);
|
error |= io_mem_write(section->mr, addr1, val, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
addr1 += memory_region_get_ram_addr(section->mr);
|
addr1 += memory_region_get_ram_addr(section->mr);
|
||||||
@ -1946,15 +1947,15 @@ void address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
|
|||||||
l = memory_access_size(l, addr1);
|
l = memory_access_size(l, addr1);
|
||||||
if (l == 4) {
|
if (l == 4) {
|
||||||
/* 32 bit read access */
|
/* 32 bit read access */
|
||||||
io_mem_read(section->mr, addr1, &val, 4);
|
error |= io_mem_read(section->mr, addr1, &val, 4);
|
||||||
stl_p(buf, val);
|
stl_p(buf, val);
|
||||||
} else if (l == 2) {
|
} else if (l == 2) {
|
||||||
/* 16 bit read access */
|
/* 16 bit read access */
|
||||||
io_mem_read(section->mr, addr1, &val, 2);
|
error |= io_mem_read(section->mr, addr1, &val, 2);
|
||||||
stw_p(buf, val);
|
stw_p(buf, val);
|
||||||
} else {
|
} else {
|
||||||
/* 8 bit read access */
|
/* 8 bit read access */
|
||||||
io_mem_read(section->mr, addr1, &val, 1);
|
error |= io_mem_read(section->mr, addr1, &val, 1);
|
||||||
stb_p(buf, val);
|
stb_p(buf, val);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1967,31 +1968,26 @@ void address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
|
|||||||
buf += l;
|
buf += l;
|
||||||
addr += l;
|
addr += l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
void address_space_write(AddressSpace *as, hwaddr addr,
|
bool address_space_write(AddressSpace *as, hwaddr addr,
|
||||||
const uint8_t *buf, int len)
|
const uint8_t *buf, int len)
|
||||||
{
|
{
|
||||||
address_space_rw(as, addr, (uint8_t *)buf, len, true);
|
return address_space_rw(as, addr, (uint8_t *)buf, len, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
bool address_space_read(AddressSpace *as, hwaddr addr, uint8_t *buf, int len)
|
||||||
* address_space_read: read from an address space.
|
|
||||||
*
|
|
||||||
* @as: #AddressSpace to be accessed
|
|
||||||
* @addr: address within that address space
|
|
||||||
* @buf: buffer with the data transferred
|
|
||||||
*/
|
|
||||||
void address_space_read(AddressSpace *as, hwaddr addr, uint8_t *buf, int len)
|
|
||||||
{
|
{
|
||||||
address_space_rw(as, addr, buf, len, false);
|
return address_space_rw(as, addr, buf, len, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void cpu_physical_memory_rw(hwaddr addr, uint8_t *buf,
|
void cpu_physical_memory_rw(hwaddr addr, uint8_t *buf,
|
||||||
int len, int is_write)
|
int len, int is_write)
|
||||||
{
|
{
|
||||||
return address_space_rw(&address_space_memory, addr, buf, len, is_write);
|
address_space_rw(&address_space_memory, addr, buf, len, is_write);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* used for ROM loading : can write in RAM and ROM */
|
/* used for ROM loading : can write in RAM and ROM */
|
||||||
|
@ -825,32 +825,38 @@ void address_space_destroy(AddressSpace *as);
|
|||||||
/**
|
/**
|
||||||
* address_space_rw: read from or write to an address space.
|
* address_space_rw: read from or write to an address space.
|
||||||
*
|
*
|
||||||
|
* Return true if the operation hit any unassigned memory.
|
||||||
|
*
|
||||||
* @as: #AddressSpace to be accessed
|
* @as: #AddressSpace to be accessed
|
||||||
* @addr: address within that address space
|
* @addr: address within that address space
|
||||||
* @buf: buffer with the data transferred
|
* @buf: buffer with the data transferred
|
||||||
* @is_write: indicates the transfer direction
|
* @is_write: indicates the transfer direction
|
||||||
*/
|
*/
|
||||||
void address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
|
bool address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
|
||||||
int len, bool is_write);
|
int len, bool is_write);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* address_space_write: write to address space.
|
* address_space_write: write to address space.
|
||||||
*
|
*
|
||||||
* @as: #AddressSpace to be accessed
|
* Return true if the operation hit any unassigned memory.
|
||||||
* @addr: address within that address space
|
|
||||||
* @buf: buffer with the data transferred
|
|
||||||
*/
|
|
||||||
void address_space_write(AddressSpace *as, hwaddr addr,
|
|
||||||
const uint8_t *buf, int len);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* address_space_read: read from an address space.
|
|
||||||
*
|
*
|
||||||
* @as: #AddressSpace to be accessed
|
* @as: #AddressSpace to be accessed
|
||||||
* @addr: address within that address space
|
* @addr: address within that address space
|
||||||
* @buf: buffer with the data transferred
|
* @buf: buffer with the data transferred
|
||||||
*/
|
*/
|
||||||
void address_space_read(AddressSpace *as, hwaddr addr, uint8_t *buf, int len);
|
bool address_space_write(AddressSpace *as, hwaddr addr,
|
||||||
|
const uint8_t *buf, int len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* address_space_read: read from an address space.
|
||||||
|
*
|
||||||
|
* Return true if the operation hit any unassigned memory.
|
||||||
|
*
|
||||||
|
* @as: #AddressSpace to be accessed
|
||||||
|
* @addr: address within that address space
|
||||||
|
* @buf: buffer with the data transferred
|
||||||
|
*/
|
||||||
|
bool address_space_read(AddressSpace *as, hwaddr addr, uint8_t *buf, int len);
|
||||||
|
|
||||||
/* address_space_translate: translate an address range into an address space
|
/* address_space_translate: translate an address range into an address space
|
||||||
* into a MemoryRegionSection and an address range into that section
|
* into a MemoryRegionSection and an address range into that section
|
||||||
|
Loading…
Reference in New Issue
Block a user