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:
Paolo Bonzini 2013-05-06 14:36:15 +02:00
parent 7443b43758
commit 1b5ec23467
4 changed files with 26 additions and 19 deletions

View File

@ -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
View File

@ -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;

View File

@ -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,

View File

@ -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 "