From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53033) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UtivX-0001vJ-Al for qemu-devel@nongnu.org; Mon, 01 Jul 2013 14:34:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UtivV-0005VW-KX for qemu-devel@nongnu.org; Mon, 01 Jul 2013 14:34:15 -0400 Received: from goliath.siemens.de ([192.35.17.28]:26461) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UtivV-0005VI-A7 for qemu-devel@nongnu.org; Mon, 01 Jul 2013 14:34:13 -0400 Message-ID: <51D1CBA3.9020004@siemens.com> Date: Mon, 01 Jul 2013 20:34:11 +0200 From: Jan Kiszka MIME-Version: 1.0 References: <1372438702-20491-1-git-send-email-pbonzini@redhat.com> <1372438702-20491-10-git-send-email-pbonzini@redhat.com> In-Reply-To: <1372438702-20491-10-git-send-email-pbonzini@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2 09/11] memory: return MemoryRegion from qemu_ram_addr_from_host List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: "peter.maydell@linaro.org" , "qemu-devel@nongnu.org" On 2013-06-28 18:58, Paolo Bonzini wrote: > It will be needed in the next patches. > > Signed-off-by: Paolo Bonzini > --- > 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 -- Siemens AG, Corporate Technology, CT RTC ITP SES-DE Corporate Competence Center Embedded Linux