On 2013-06-28 18:58, Paolo Bonzini wrote: > It will be needed in the next patches. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > cputlb.c | 2 +- > exec.c | 33 ++++++++++++++++++++------------- > include/exec/cpu-common.h | 2 +- > target-i386/kvm.c | 4 ++-- > 4 files changed, 24 insertions(+), 17 deletions(-) > > diff --git a/cputlb.c b/cputlb.c > index b716bbe..51381ae 100644 > --- a/cputlb.c > +++ b/cputlb.c > @@ -162,7 +162,7 @@ static inline ram_addr_t > qemu_ram_addr_from_host_nofail(void *ptr) > { > 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); > abort(); > } > diff --git a/exec.c b/exec.c > index aa76366..a372963 100644 > --- a/exec.c > +++ b/exec.c > @@ -1296,15 +1296,7 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length) > } > #endif /* !_WIN32 */ > > -/* 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) > +static RAMBlock *qemu_get_ram_block(ram_addr_t addr) > { > RAMBlock *block; > > @@ -1324,6 +1316,21 @@ void *qemu_get_ram_ptr(ram_addr_t addr) > > found: > 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()) { > /* We need to check if the requested address is in the RAM > * because we don't want to map the entire memory in QEMU. > @@ -1400,14 +1407,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 > (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; > uint8_t *host = ptr; > > if (xen_enabled()) { > *ram_addr = xen_ram_addr_from_mapcache(ptr); > - return 0; > + return qemu_get_ram_block(*ram_addr)->mr; > } > > block = ram_list.mru_block; > @@ -1425,11 +1432,11 @@ int qemu_ram_addr_from_host(void *ptr, ram_addr_t > *ram_addr) > } > } > > - return -1; > + return NULL; > > found: > *ram_addr = block->offset + (host - block->host); > - return 0; > + return block->mr; > } > > static void notdirty_mem_write(void *opaque, hwaddr ram_addr, > diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h > index 8063ba2..8f75233 100644 > --- a/include/exec/cpu-common.h > +++ b/include/exec/cpu-common.h > @@ -50,7 +50,7 @@ typedef uint32_t CPUReadMemoryFunc(void *opaque, hwaddr > addr); > > void qemu_ram_remap(ram_addr_t addr, ram_addr_t length); > /* 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 cpu_physical_memory_rw(hwaddr addr, uint8_t *buf, > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > index 9ffb6ca..7ba98cd 100644 > --- a/target-i386/kvm.c > +++ b/target-i386/kvm.c > @@ -318,7 +318,7 @@ int kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void > *addr) > > if ((env->mcg_cap & MCG_SER_P) && addr > && (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)) > { > fprintf(stderr, "Hardware memory error for memory used by " > "QEMU itself instead of guest system!\n"); > @@ -350,7 +350,7 @@ int kvm_arch_on_sigbus(int code, void *addr) > hwaddr paddr; > > /* 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, > addr, &paddr)) { > fprintf(stderr, "Hardware memory error for memory used by " >
Reviewed-by: Jan Kiszka <jan.kis...@siemens.com> Jan -- Siemens AG, Corporate Technology, CT RTC ITP SES-DE Corporate Competence Center Embedded Linux