qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2] gdb: provide the name of the architecture in


From: Christian Borntraeger
Subject: Re: [Qemu-devel] [PATCH v2] gdb: provide the name of the architecture in the target.xml
Date: Thu, 14 Jan 2016 15:27:17 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0

Ping?

On 12/03/2015 01:14 PM, Christian Borntraeger wrote:
> From: David Hildenbrand <address@hidden>
> 
> This patch provides the name of the architecture in the target.xml
> if available.
> 
> This allows the remote gdb to detect the target architecture on its
> own - so there is no need to specify it manually (e.g. if gdb is
> started without a binary) using "set arch *arch_name*".
> 
> The name of the architecture is provided by a callback that can
> be implemented by all architectures. The arm implementation has
> special handling for iwmmxt and returns arm otherwise. This can
> be extended if necessary.
> 
> Signed-off-by: David Hildenbrand <address@hidden>
> Acked-by: Cornelia Huck <address@hidden>
> Signed-off-by: Christian Borntraeger <address@hidden>
> [rework to use a callback]
> ---
> v1->v2: replace the fixed string with a callback
> 
>  gdbstub.c                   | 21 ++++++++++++++-------
>  include/qom/cpu.h           |  3 +++
>  target-arm/cpu.c            | 12 ++++++++++++
>  target-arm/cpu64.c          |  6 ++++++
>  target-ppc/translate_init.c | 10 ++++++++++
>  target-s390x/cpu.c          |  6 ++++++
>  6 files changed, 51 insertions(+), 7 deletions(-)
> 
> diff --git a/gdbstub.c b/gdbstub.c
> index 9c29aa0..6a674b2 100644
> --- a/gdbstub.c
> +++ b/gdbstub.c
> @@ -540,13 +540,20 @@ static const char *get_feature_xml(const char *p, const 
> char **newp,
>              GDBRegisterState *r;
>              CPUState *cpu = first_cpu;
> 
> -            snprintf(target_xml, sizeof(target_xml),
> -                     "<?xml version=\"1.0\"?>"
> -                     "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
> -                     "<target>"
> -                     "<xi:include href=\"%s\"/>",
> -                     cc->gdb_core_xml_file);
> -
> +            pstrcat(target_xml, sizeof(target_xml),
> +                    "<?xml version=\"1.0\"?>"
> +                    "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">"
> +                    "<target>");
> +            if (cc->gdb_arch_name) {
> +                gchar *arch = cc->gdb_arch_name(cpu);
> +                pstrcat(target_xml, sizeof(target_xml), "<architecture>");
> +                pstrcat(target_xml, sizeof(target_xml), arch);
> +                pstrcat(target_xml, sizeof(target_xml), "</architecture>");
> +             g_free(arch);
> +            }
> +            pstrcat(target_xml, sizeof(target_xml), "<xi:include href=\"");
> +            pstrcat(target_xml, sizeof(target_xml), cc->gdb_core_xml_file);
> +            pstrcat(target_xml, sizeof(target_xml), "\"/>");
>              for (r = cpu->gdb_regs; r; r = r->next) {
>                  pstrcat(target_xml, sizeof(target_xml), "<xi:include 
> href=\"");
>                  pstrcat(target_xml, sizeof(target_xml), r->xml);
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index 51a1323..c3c2812 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -114,6 +114,8 @@ struct TranslationBlock;
>   * @gdb_core_xml_file: File name for core registers GDB XML description.
>   * @gdb_stop_before_watchpoint: Indicates whether GDB expects the CPU to stop
>   *           before the insn which triggers a watchpoint rather than after 
> it.
> + * @gdb_arch_name: Optional callback that returns the architecture name known
> + * to GDB. The caller must free the returned string with g_free.
>   * @cpu_exec_enter: Callback for cpu_exec preparation.
>   * @cpu_exec_exit: Callback for cpu_exec cleanup.
>   * @cpu_exec_interrupt: Callback for processing interrupts in cpu_exec.
> @@ -168,6 +170,7 @@ typedef struct CPUClass {
>      const struct VMStateDescription *vmsd;
>      int gdb_num_core_regs;
>      const char *gdb_core_xml_file;
> +    gchar * (*gdb_arch_name)(CPUState *cpu);
>      bool gdb_stop_before_watchpoint;
> 
>      void (*cpu_exec_enter)(CPUState *cpu);
> diff --git a/target-arm/cpu.c b/target-arm/cpu.c
> index 30739fc..771cf91 100644
> --- a/target-arm/cpu.c
> +++ b/target-arm/cpu.c
> @@ -1393,6 +1393,17 @@ static int arm_cpu_handle_mmu_fault(CPUState *cs, 
> vaddr address, int rw,
>  }
>  #endif
> 
> +static gchar *arm_gdb_arch_name(CPUState *cs)
> +{
> +    ARMCPU *cpu = ARM_CPU(cs);
> +    CPUARMState *env = &cpu->env;
> +
> +    if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
> +        return g_strdup("iwmmxt");
> +    }
> +    return g_strdup("arm");
> +}
> +
>  static void arm_cpu_class_init(ObjectClass *oc, void *data)
>  {
>      ARMCPUClass *acc = ARM_CPU_CLASS(oc);
> @@ -1423,6 +1434,7 @@ static void arm_cpu_class_init(ObjectClass *oc, void 
> *data)
>  #endif
>      cc->gdb_num_core_regs = 26;
>      cc->gdb_core_xml_file = "arm-core.xml";
> +    cc->gdb_arch_name = arm_gdb_arch_name;
>      cc->gdb_stop_before_watchpoint = true;
>      cc->debug_excp_handler = arm_debug_excp_handler;
> 
> diff --git a/target-arm/cpu64.c b/target-arm/cpu64.c
> index 63c8b1c..ad1991d 100644
> --- a/target-arm/cpu64.c
> +++ b/target-arm/cpu64.c
> @@ -286,6 +286,11 @@ static void aarch64_cpu_set_pc(CPUState *cs, vaddr value)
>      }
>  }
> 
> +static gchar *aarch64_gdb_arch_name(CPUState *cs)
> +{
> +    return g_strdup("aarch64");
> +}
> +
>  static void aarch64_cpu_class_init(ObjectClass *oc, void *data)
>  {
>      CPUClass *cc = CPU_CLASS(oc);
> @@ -299,6 +304,7 @@ static void aarch64_cpu_class_init(ObjectClass *oc, void 
> *data)
>      cc->gdb_write_register = aarch64_cpu_gdb_write_register;
>      cc->gdb_num_core_regs = 34;
>      cc->gdb_core_xml_file = "aarch64-core.xml";
> +    cc->gdb_arch_name = aarch64_gdb_arch_name;
>  }
> 
>  static void aarch64_cpu_register(const ARMCPUInfo *info)
> diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
> index e88dc7f..e36d0a3 100644
> --- a/target-ppc/translate_init.c
> +++ b/target-ppc/translate_init.c
> @@ -9681,6 +9681,15 @@ static bool ppc_pvr_match_default(PowerPCCPUClass 
> *pcc, uint32_t pvr)
>      return pcc->pvr == pvr;
>  }
> 
> +static gchar *ppc_gdb_arch_name(CPUState *cs)
> +{
> +#if defined(TARGET_PPC64)
> +    return g_strdup("powerpc:common64");
> +#else
> +    return g_strdup("powerpc:common");
> +#endif
> +}
> +
>  static void ppc_cpu_class_init(ObjectClass *oc, void *data)
>  {
>      PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
> @@ -9725,6 +9734,7 @@ static void ppc_cpu_class_init(ObjectClass *oc, void 
> *data)
>      cc->gdb_num_core_regs = 71 + 32;
>  #endif
> 
> +    cc->gdb_arch_name = ppc_gdb_arch_name;
>  #if defined(TARGET_PPC64)
>      cc->gdb_core_xml_file = "power64-core.xml";
>  #else
> diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c
> index 48ecd34..69f914f 100644
> --- a/target-s390x/cpu.c
> +++ b/target-s390x/cpu.c
> @@ -369,6 +369,11 @@ unsigned int s390_cpu_set_state(uint8_t cpu_state, 
> S390CPU *cpu)
>  }
>  #endif
> 
> +static gchar *s390_gdb_arch_name(CPUState *cs)
> +{
> +    return g_strdup("s390:64-bit");
> +}
> +
>  static void s390_cpu_class_init(ObjectClass *oc, void *data)
>  {
>      S390CPUClass *scc = S390_CPU_CLASS(oc);
> @@ -405,6 +410,7 @@ static void s390_cpu_class_init(ObjectClass *oc, void 
> *data)
> 
>      cc->gdb_num_core_regs = S390_NUM_CORE_REGS;
>      cc->gdb_core_xml_file = "s390x-core64.xml";
> +    cc->gdb_arch_name = s390_gdb_arch_name;
> 
>      /*
>       * Reason: s390_cpu_initfn() calls cpu_exec_init(), which saves
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]