mirror of https://github.com/xemu-project/xemu.git
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:
parent
e7701825e1
commit
e890261f67
|
@ -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,
|
||||||
|
|
|
@ -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
26
exec.c
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue