Export qemu_ram_addr_from_host

To be used by next patches.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
Marcelo Tosatti 2010-10-11 15:31:19 -03:00 committed by Anthony Liguori
parent e7701825e1
commit e890261f67
3 changed files with 20 additions and 11 deletions

View File

@ -47,7 +47,8 @@ void qemu_ram_free(ram_addr_t addr);
/* This should only be used for ram local to a device. */ /* This should only be used for ram local to a device. */
void *qemu_get_ram_ptr(ram_addr_t addr); void *qemu_get_ram_ptr(ram_addr_t addr);
/* This should not be used by devices. */ /* This should not be used by devices. */
ram_addr_t qemu_ram_addr_from_host(void *ptr); int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr);
ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr);
int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read, int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read,
CPUWriteMemoryFunc * const *mem_write, CPUWriteMemoryFunc * const *mem_write,

View File

@ -334,7 +334,7 @@ static inline tb_page_addr_t get_page_addr_code(CPUState *env1, target_ulong add
} }
p = (void *)(unsigned long)addr p = (void *)(unsigned long)addr
+ env1->tlb_table[mmu_idx][page_index].addend; + env1->tlb_table[mmu_idx][page_index].addend;
return qemu_ram_addr_from_host(p); return qemu_ram_addr_from_host_nofail(p);
} }
#endif #endif

26
exec.c
View File

@ -2085,7 +2085,7 @@ static inline void tlb_update_dirty(CPUTLBEntry *tlb_entry)
if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) { if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) {
p = (void *)(unsigned long)((tlb_entry->addr_write & TARGET_PAGE_MASK) p = (void *)(unsigned long)((tlb_entry->addr_write & TARGET_PAGE_MASK)
+ tlb_entry->addend); + tlb_entry->addend);
ram_addr = qemu_ram_addr_from_host(p); ram_addr = qemu_ram_addr_from_host_nofail(p);
if (!cpu_physical_memory_is_dirty(ram_addr)) { if (!cpu_physical_memory_is_dirty(ram_addr)) {
tlb_entry->addr_write |= TLB_NOTDIRTY; tlb_entry->addr_write |= TLB_NOTDIRTY;
} }
@ -2938,23 +2938,31 @@ void *qemu_get_ram_ptr(ram_addr_t addr)
return NULL; return NULL;
} }
/* Some of the softmmu routines need to translate from a host pointer int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
(typically a TLB entry) back to a ram offset. */
ram_addr_t qemu_ram_addr_from_host(void *ptr)
{ {
RAMBlock *block; RAMBlock *block;
uint8_t *host = ptr; uint8_t *host = ptr;
QLIST_FOREACH(block, &ram_list.blocks, next) { QLIST_FOREACH(block, &ram_list.blocks, next) {
if (host - block->host < block->length) { if (host - block->host < block->length) {
return block->offset + (host - block->host); *ram_addr = block->offset + (host - block->host);
return 0;
} }
} }
return -1;
}
fprintf(stderr, "Bad ram pointer %p\n", ptr); /* Some of the softmmu routines need to translate from a host pointer
abort(); (typically a TLB entry) back to a ram offset. */
ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr)
{
ram_addr_t ram_addr;
return 0; if (qemu_ram_addr_from_host(ptr, &ram_addr)) {
fprintf(stderr, "Bad ram pointer %p\n", ptr);
abort();
}
return ram_addr;
} }
static uint32_t unassigned_mem_readb(void *opaque, target_phys_addr_t addr) static uint32_t unassigned_mem_readb(void *opaque, target_phys_addr_t addr)
@ -3703,7 +3711,7 @@ void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
{ {
if (buffer != bounce.buffer) { if (buffer != bounce.buffer) {
if (is_write) { if (is_write) {
ram_addr_t addr1 = qemu_ram_addr_from_host(buffer); ram_addr_t addr1 = qemu_ram_addr_from_host_nofail(buffer);
while (access_len) { while (access_len) {
unsigned l; unsigned l;
l = TARGET_PAGE_SIZE; l = TARGET_PAGE_SIZE;