memory: return MemoryRegion from qemu_ram_addr_from_host
It will be needed in the next patch. Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
7443b43758
commit
1b5ec23467
2
cputlb.c
2
cputlb.c
@ -162,7 +162,7 @@ static inline ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr)
|
|||||||
{
|
{
|
||||||
ram_addr_t ram_addr;
|
ram_addr_t ram_addr;
|
||||||
|
|
||||||
if (qemu_ram_addr_from_host(ptr, &ram_addr)) {
|
if (qemu_ram_addr_from_host(ptr, &ram_addr) == NULL) {
|
||||||
fprintf(stderr, "Bad ram pointer %p\n", ptr);
|
fprintf(stderr, "Bad ram pointer %p\n", ptr);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
37
exec.c
37
exec.c
@ -1288,15 +1288,7 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
|
|||||||
}
|
}
|
||||||
#endif /* !_WIN32 */
|
#endif /* !_WIN32 */
|
||||||
|
|
||||||
/* Return a host pointer to ram allocated with qemu_ram_alloc.
|
static RAMBlock *qemu_get_ram_block(ram_addr_t addr)
|
||||||
With the exception of the softmmu code in this file, this should
|
|
||||||
only be used for local memory (e.g. video ram) that the device owns,
|
|
||||||
and knows it isn't going to access beyond the end of the block.
|
|
||||||
|
|
||||||
It should not be used for general purpose DMA.
|
|
||||||
Use cpu_physical_memory_map/cpu_physical_memory_rw instead.
|
|
||||||
*/
|
|
||||||
void *qemu_get_ram_ptr(ram_addr_t addr)
|
|
||||||
{
|
{
|
||||||
RAMBlock *block;
|
RAMBlock *block;
|
||||||
|
|
||||||
@ -1316,6 +1308,21 @@ void *qemu_get_ram_ptr(ram_addr_t addr)
|
|||||||
|
|
||||||
found:
|
found:
|
||||||
ram_list.mru_block = block;
|
ram_list.mru_block = block;
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return a host pointer to ram allocated with qemu_ram_alloc.
|
||||||
|
With the exception of the softmmu code in this file, this should
|
||||||
|
only be used for local memory (e.g. video ram) that the device owns,
|
||||||
|
and knows it isn't going to access beyond the end of the block.
|
||||||
|
|
||||||
|
It should not be used for general purpose DMA.
|
||||||
|
Use cpu_physical_memory_map/cpu_physical_memory_rw instead.
|
||||||
|
*/
|
||||||
|
void *qemu_get_ram_ptr(ram_addr_t addr)
|
||||||
|
{
|
||||||
|
RAMBlock *block = qemu_get_ram_block(addr);
|
||||||
|
|
||||||
if (xen_enabled()) {
|
if (xen_enabled()) {
|
||||||
/* We need to check if the requested address is in the RAM
|
/* We need to check if the requested address is in the RAM
|
||||||
* because we don't want to map the entire memory in QEMU.
|
* because we don't want to map the entire memory in QEMU.
|
||||||
@ -1392,14 +1399,14 @@ static void *qemu_ram_ptr_length(ram_addr_t addr, ram_addr_t *size)
|
|||||||
|
|
||||||
/* Some of the softmmu routines need to translate from a host pointer
|
/* Some of the softmmu routines need to translate from a host pointer
|
||||||
(typically a TLB entry) back to a ram offset. */
|
(typically a TLB entry) back to a ram offset. */
|
||||||
int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
|
MemoryRegion *qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
|
||||||
{
|
{
|
||||||
RAMBlock *block;
|
RAMBlock *block;
|
||||||
uint8_t *host = ptr;
|
uint8_t *host = ptr;
|
||||||
|
|
||||||
if (xen_enabled()) {
|
if (xen_enabled()) {
|
||||||
*ram_addr = xen_ram_addr_from_mapcache(ptr);
|
*ram_addr = xen_ram_addr_from_mapcache(ptr);
|
||||||
return 0;
|
return qemu_get_ram_block(*ram_addr)->mr;
|
||||||
}
|
}
|
||||||
|
|
||||||
block = ram_list.mru_block;
|
block = ram_list.mru_block;
|
||||||
@ -1417,11 +1424,11 @@ int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return NULL;
|
||||||
|
|
||||||
found:
|
found:
|
||||||
*ram_addr = block->offset + (host - block->host);
|
*ram_addr = block->offset + (host - block->host);
|
||||||
return 0;
|
return block->mr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
|
static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
|
||||||
@ -2111,8 +2118,8 @@ void address_space_unmap(AddressSpace *as, void *buffer, hwaddr len,
|
|||||||
if (buffer != bounce.buffer) {
|
if (buffer != bounce.buffer) {
|
||||||
if (is_write) {
|
if (is_write) {
|
||||||
ram_addr_t addr1;
|
ram_addr_t addr1;
|
||||||
int rc = qemu_ram_addr_from_host(buffer, &addr1);
|
MemoryRegion *mr = qemu_ram_addr_from_host(buffer, &addr1);
|
||||||
assert(rc == 0);
|
assert(mr != NULL);
|
||||||
while (access_len) {
|
while (access_len) {
|
||||||
unsigned l;
|
unsigned l;
|
||||||
l = TARGET_PAGE_SIZE;
|
l = TARGET_PAGE_SIZE;
|
||||||
|
@ -52,7 +52,7 @@ typedef uint32_t CPUReadMemoryFunc(void *opaque, hwaddr addr);
|
|||||||
|
|
||||||
void qemu_ram_remap(ram_addr_t addr, ram_addr_t length);
|
void qemu_ram_remap(ram_addr_t addr, ram_addr_t length);
|
||||||
/* This should not be used by devices. */
|
/* This should not be used by devices. */
|
||||||
int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr);
|
MemoryRegion *qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr);
|
||||||
void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev);
|
void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev);
|
||||||
|
|
||||||
void cpu_physical_memory_rw(hwaddr addr, uint8_t *buf,
|
void cpu_physical_memory_rw(hwaddr addr, uint8_t *buf,
|
||||||
|
@ -318,7 +318,7 @@ int kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void *addr)
|
|||||||
|
|
||||||
if ((env->mcg_cap & MCG_SER_P) && addr
|
if ((env->mcg_cap & MCG_SER_P) && addr
|
||||||
&& (code == BUS_MCEERR_AR || code == BUS_MCEERR_AO)) {
|
&& (code == BUS_MCEERR_AR || code == BUS_MCEERR_AO)) {
|
||||||
if (qemu_ram_addr_from_host(addr, &ram_addr) ||
|
if (qemu_ram_addr_from_host(addr, &ram_addr) == NULL ||
|
||||||
!kvm_physical_memory_addr_from_host(c->kvm_state, addr, &paddr)) {
|
!kvm_physical_memory_addr_from_host(c->kvm_state, addr, &paddr)) {
|
||||||
fprintf(stderr, "Hardware memory error for memory used by "
|
fprintf(stderr, "Hardware memory error for memory used by "
|
||||||
"QEMU itself instead of guest system!\n");
|
"QEMU itself instead of guest system!\n");
|
||||||
@ -350,7 +350,7 @@ int kvm_arch_on_sigbus(int code, void *addr)
|
|||||||
hwaddr paddr;
|
hwaddr paddr;
|
||||||
|
|
||||||
/* Hope we are lucky for AO MCE */
|
/* Hope we are lucky for AO MCE */
|
||||||
if (qemu_ram_addr_from_host(addr, &ram_addr) ||
|
if (qemu_ram_addr_from_host(addr, &ram_addr) == NULL ||
|
||||||
!kvm_physical_memory_addr_from_host(CPU(first_cpu)->kvm_state,
|
!kvm_physical_memory_addr_from_host(CPU(first_cpu)->kvm_state,
|
||||||
addr, &paddr)) {
|
addr, &paddr)) {
|
||||||
fprintf(stderr, "Hardware memory error for memory used by "
|
fprintf(stderr, "Hardware memory error for memory used by "
|
||||||
|
Loading…
Reference in New Issue
Block a user