Nicolas Eder <nicolas.e...@lauterbach.com> writes:

> ---
>  include/exec/cpu-common.h |  3 +++
>  include/exec/memory.h     |  9 +++++++++
>  system/memory.c           | 11 +++++++++++
>  system/physmem.c          | 26 ++++++++++++++++++++++++++
>  4 files changed, 49 insertions(+)
>
> diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
> index 41115d8919..dd989b5ab2 100644
> --- a/include/exec/cpu-common.h
> +++ b/include/exec/cpu-common.h
> @@ -182,6 +182,9 @@ int ram_block_discard_range(RAMBlock *rb, uint64_t start, 
> size_t length);
>  int cpu_memory_rw_debug(CPUState *cpu, vaddr addr,
>                          void *ptr, size_t len, bool is_write);
>  
> +int cpu_memory_get_physical_address(CPUState *cpu, vaddr *addr, size_t *len);
> +
> +
>  /* vl.c */
>  void list_cpus(void);
>  
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index 831f7c996d..174de807d5 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -3142,6 +3142,15 @@ bool ram_block_discard_is_disabled(void);
>   */
>  bool ram_block_discard_is_required(void);
>  
> +/*
> + * mcd_find_address_space() - Find the address spaces with the corresponding
> + * name.
> + *
> + * Currently only used by the mcd debugger.
> + * @as_name: Name to look for.
> + */
> +AddressSpace *mcd_find_address_space(const char *as_name);
> +

Don't hard code this for mcd - maybe address_space_find_byname()?

>  #endif
>  
>  #endif
> diff --git a/system/memory.c b/system/memory.c
> index 798b6c0a17..9a8fa79e0c 100644
> --- a/system/memory.c
> +++ b/system/memory.c
> @@ -3562,6 +3562,17 @@ void mtree_info(bool flatview, bool dispatch_tree, 
> bool owner, bool disabled)
>      }
>  }
>  
> +AddressSpace *mcd_find_address_space(const char *as_name)
> +{
> +    AddressSpace *as;
> +    QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
> +        if (strcmp(as->name, as_name) == 0) {
> +            return as;
> +        }
> +    }
> +    return NULL;
> +}
> +
>  void memory_region_init_ram(MemoryRegion *mr,
>                              Object *owner,
>                              const char *name,
> diff --git a/system/physmem.c b/system/physmem.c
> index a63853a7bc..70733c67c7 100644
> --- a/system/physmem.c
> +++ b/system/physmem.c
> @@ -3422,6 +3422,32 @@ int cpu_memory_rw_debug(CPUState *cpu, vaddr addr,
>      return 0;
>  }
>  
> +int cpu_memory_get_physical_address(CPUState *cpu, vaddr *addr, size_t *len)
> +{
> +    hwaddr phys_addr;
> +    vaddr l, page;
> +
> +    cpu_synchronize_state(cpu);
> +    MemTxAttrs attrs;
> +
> +    page = *addr & TARGET_PAGE_MASK;
> +    phys_addr = cpu_get_phys_page_attrs_debug(cpu, page, &attrs);
> +    /* if no physical page mapped, return an error */
> +    if (phys_addr == -1) {
> +        return -1;
> +    }
> +    l = (page + TARGET_PAGE_SIZE) - *addr;
> +    if (l > *len) {
> +        l = *len;
> +    }
> +    phys_addr += (*addr & ~TARGET_PAGE_MASK);
> +
> +    /* set output values */
> +    *addr = phys_addr;
> +    *len = l;
> +    return 0;
> +}

I think there is some scope to re-factor some code that is shared with
cpu_memory_rw_debug. In fact rather than using this to feed
mcd_read_write_memory() maybe you really just want a
cpu_physical_memory_rw_debug()?

Although as you are going from vaddr anyway where does
cpu_memory_rw_debug() fail for you?

> +
>  /*
>   * Allows code that needs to deal with migration bitmaps etc to still be 
> built
>   * target independent.

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro

Reply via email to