All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: Laszlo Ersek <lersek@redhat.com>
Cc: qemu-devel@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,
	Richard Henderson <rth@twiddle.net>,
	Peter Crosthwaite <crosthwaite.peter@gmail.com>
Subject: Re: [Qemu-devel] [PATCH 6/6] qapi: discriminate CpuInfo[Fast] on SysEmuTarget, not CpuInfoArch
Date: Wed, 25 Apr 2018 09:33:16 +0200	[thread overview]
Message-ID: <8736zjagg3.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <20180424214550.32549-7-lersek@redhat.com> (Laszlo Ersek's message of "Tue, 24 Apr 2018 23:45:50 +0200")

Laszlo Ersek <lersek@redhat.com> writes:

> Add a new field @target (of type @SysEmuTarget) to the outputs of the
> @query-cpus and @query-cpus-fast commands, which provides more information
> about the emulation target than the field @arch (of type @CpuInfoArch).
> Keep @arch for compatibility.
>
> Make @target the new discriminator for the @CpuInfo and @CpuInfoFast
> return structures. This lets us hoist @arch to @CpuInfoCommon, but it also
> requires some gymnastics in qmp_query_cpus() and qmp_query_cpus_fast().
>
> In particular, conditional compilation cannot be removed, because each
> pair of CPU base arch structures, such as X86CPU/CPUX86State,
> PowerPCCPU/CPUPPCState, SPARCCPU/CPUSPARCState, is only visible when
> building QEMU for a target that maps to that CPU base arch.
>
> Cc: Eric Blake <eblake@redhat.com>
> Cc: Markus Armbruster <armbru@redhat.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Peter Crosthwaite <crosthwaite.peter@gmail.com>
> Cc: Richard Henderson <rth@twiddle.net>
> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> ---
>
> Notes:
>     PATCHv1:
>     
>     - new patch
>
>  qapi/misc.json | 118 ++++++++++++++++++-------
>  cpus.c         | 275 ++++++++++++++++++++++++++++++++++++++++++---------------
>  2 files changed, 291 insertions(+), 102 deletions(-)
>
> diff --git a/qapi/misc.json b/qapi/misc.json
> index d7b776a5af37..98c15880f9f0 100644
> --- a/qapi/misc.json
> +++ b/qapi/misc.json
> @@ -361,77 +361,105 @@
>  # Collects fields common to @CpuInfoBase and @CpuInfoFastBase; that is,
>  # fields that are shared by @query-cpus and @query-cpus-fast, and not
>  # specific to the target architecture.
>  #
>  # @qom-path: path to the CPU object in the QOM tree (since 2.4)
>  #
>  # @thread-id: ID of the underlying host thread
>  #
>  # @props: properties describing which node/socket/core/thread the
>  #         virtual CPU belongs to, if supported by the board (since 2.10)
>  #
> +# @arch: base architecture of the cpu (since 2.6)
> +#
>  # Since: 2.13
>  ##
>  { 'struct' : 'CpuInfoCommon',
>    'data'   : { 'qom-path'  : 'str',
>                 'thread-id' : 'int',
> -               '*props'    : 'CpuInstanceProperties' } }
> +               '*props'    : 'CpuInstanceProperties',
> +               'arch'      : 'CpuInfoArch' } }
>  
>  ##
>  # @CpuInfoBase:
>  #
>  # Extends @CpuInfoCommon with fields that are specific to the @query-cpus
>  # command, but not specific to the target architecture.
>  #
>  # @CPU: the index of the virtual CPU
>  #
>  # @current: this only exists for backwards compatibility and should be ignored
>  #
>  # @halted: true if the virtual CPU is in the halt state.  Halt usually refers
>  #          to a processor specific low power mode.
>  #
> -# @arch: architecture of the cpu, which determines which additional fields
> -#        will be listed (since 2.6)
> +# @target: the QEMU system emulation target, which is more specific than
> +#          @arch and determines which additional fields will be listed
> +#
>  #
>  # Since: 2.13
>  #
>  # Notes: @halted is a transient state that changes frequently.  By the time the
>  #        data is sent to the client, the guest may no longer be halted.
> -#        Moreover, @arch cannot be moved up to @CpuInfoCommon because
> +#        Moreover, @target cannot be moved up to @CpuInfoCommon because
>  #        that would prevent its use as the discriminator in @CpuInfo.
>  ##
>  { 'struct' : 'CpuInfoBase',
>    'base'   : 'CpuInfoCommon',
>    'data'   : { 'CPU'     : 'int',
>                 'current' : 'bool',
>                 'halted'  : 'bool',
> -               'arch'    : 'CpuInfoArch' } }
> +               'target'  : 'SysEmuTarget' } }
>  
>  ##
>  # @CpuInfo:
>  #
>  # Information about a virtual CPU
>  #
>  # Since: 0.14.0
>  ##
> -{ 'union': 'CpuInfo',
> -  'base': 'CpuInfoBase',
> -  'discriminator': 'arch',
> -  'data': { 'x86': 'CpuInfoX86',
> -            'sparc': 'CpuInfoSPARC',
> -            'ppc': 'CpuInfoPPC',
> -            'mips': 'CpuInfoMIPS',
> -            'tricore': 'CpuInfoTricore',
> -            's390': 'CpuInfoS390',
> -            'riscv': 'CpuInfoRISCV',
> -            'other': 'CpuInfoOther' } }
> +{ 'union'         : 'CpuInfo',
> +  'base'          : 'CpuInfoBase',
> +  'discriminator' : 'target',
> +  'data'          : { 'i386'         : 'CpuInfoX86',
> +                      'x86_64'       : 'CpuInfoX86',
> +                      'sparc'        : 'CpuInfoSPARC',
> +                      'sparc64'      : 'CpuInfoSPARC',
> +                      'ppc'          : 'CpuInfoPPC',
> +                      'ppcemb'       : 'CpuInfoPPC',
> +                      'ppc64'        : 'CpuInfoPPC',
> +                      'mips'         : 'CpuInfoMIPS',
> +                      'mipsel'       : 'CpuInfoMIPS',
> +                      'mips64'       : 'CpuInfoMIPS',
> +                      'mips64el'     : 'CpuInfoMIPS',
> +                      'tricore'      : 'CpuInfoTricore',
> +                      's390x'        : 'CpuInfoS390',
> +                      'riscv32'      : 'CpuInfoRISCV',
> +                      'riscv64'      : 'CpuInfoRISCV',
> +                      'aarch64'      : 'CpuInfoOther',
> +                      'alpha'        : 'CpuInfoOther',
> +                      'arm'          : 'CpuInfoOther',
> +                      'cris'         : 'CpuInfoOther',
> +                      'hppa'         : 'CpuInfoOther',
> +                      'lm32'         : 'CpuInfoOther',
> +                      'm68k'         : 'CpuInfoOther',
> +                      'microblaze'   : 'CpuInfoOther',
> +                      'microblazeel' : 'CpuInfoOther',
> +                      'moxie'        : 'CpuInfoOther',
> +                      'nios2'        : 'CpuInfoOther',
> +                      'or1k'         : 'CpuInfoOther',
> +                      'sh4'          : 'CpuInfoOther',
> +                      'sh4eb'        : 'CpuInfoOther',
> +                      'unicore32'    : 'CpuInfoOther',
> +                      'xtensa'       : 'CpuInfoOther',
> +                      'xtensaeb'     : 'CpuInfoOther' } }
>  
>  ##
>  # @CpuInfoX86:
>  #
>  # Additional information about a virtual i386 or x86_64 CPU
>  #
>  # @pc: the 64-bit instruction pointer
>  #
>  # Since: 2.6
>  ##
>  { 'struct': 'CpuInfoX86', 'data': { 'pc': 'int' } }
> @@ -543,84 +571,110 @@
>  #
>  # Example:
>  #
>  # -> { "execute": "query-cpus" }
>  # <- { "return": [
>  #          {
>  #             "CPU":0,
>  #             "current":true,
>  #             "halted":false,
>  #             "qom-path":"/machine/unattached/device[0]",
>  #             "arch":"x86",
> +#             "target":"x86_64",
>  #             "pc":3227107138,
>  #             "thread-id":3134
>  #          },
>  #          {
>  #             "CPU":1,
>  #             "current":false,
>  #             "halted":true,
>  #             "qom-path":"/machine/unattached/device[2]",
>  #             "arch":"x86",
> +#             "target":"x86_64",
>  #             "pc":7108165,
>  #             "thread-id":3135
>  #          }
>  #       ]
>  #    }
>  #
>  # Notes: This interface is deprecated (since 2.12.0), and it is strongly
>  #        recommended that you avoid using it. Use @query-cpus-fast to
>  #        obtain information about virtual CPUs.
>  #
>  ##
>  { 'command': 'query-cpus', 'returns': ['CpuInfo'] }
>  
>  ##
>  # @CpuInfoFastBase:
>  #
>  # Extends @CpuInfoCommon with fields that are specific to the
>  # @query-cpus-fast command, but not specific to the target architecture.
>  #
>  # @cpu-index: index of the virtual CPU
>  #
> -# @arch: architecture of the cpu, which determines which additional fields
> -#        will be listed
> +# @target: the QEMU system emulation target, which is more specific than
> +#          @arch and determines which additional fields will be listed
>  #
>  # Since: 2.13
>  #
> -# Notes: @arch cannot be moved up to @CpuInfoCommon because that would
> +# Notes: @target cannot be moved up to @CpuInfoCommon because that would
>  #        prevent its use as the discriminator in @CpuInfoFast.
>  ##
>  { 'struct' : 'CpuInfoFastBase',
>    'base'   : 'CpuInfoCommon',
>    'data'   : { 'cpu-index' : 'int',
> -               'arch'      : 'CpuInfoArch' } }
> +               'target'    : 'SysEmuTarget' } }
>  
>  ##
>  # @CpuInfoFast:
>  #
>  # Information about a virtual CPU
>  #
>  # Since: 2.12
>  #
>  ##
> -{ 'union': 'CpuInfoFast',
> -  'base': 'CpuInfoFastBase',
> -  'discriminator': 'arch',
> -  'data': { 'x86': 'CpuInfoOther',
> -            'sparc': 'CpuInfoOther',
> -            'ppc': 'CpuInfoOther',
> -            'mips': 'CpuInfoOther',
> -            'tricore': 'CpuInfoOther',
> -            's390': 'CpuInfoS390',
> -            'riscv': 'CpuInfoOther',
> -            'other': 'CpuInfoOther' } }
> +{ 'union'         : 'CpuInfoFast',
> +  'base'          : 'CpuInfoFastBase',
> +  'discriminator' : 'target',
> +  'data'          : { 'i386'         : 'CpuInfoOther',
> +                      'x86_64'       : 'CpuInfoOther',
> +                      'sparc'        : 'CpuInfoOther',
> +                      'sparc64'      : 'CpuInfoOther',
> +                      'ppc'          : 'CpuInfoOther',
> +                      'ppcemb'       : 'CpuInfoOther',
> +                      'ppc64'        : 'CpuInfoOther',
> +                      'mips'         : 'CpuInfoOther',
> +                      'mipsel'       : 'CpuInfoOther',
> +                      'mips64'       : 'CpuInfoOther',
> +                      'mips64el'     : 'CpuInfoOther',
> +                      'tricore'      : 'CpuInfoOther',
> +                      's390x'        : 'CpuInfoS390',
> +                      'riscv32'      : 'CpuInfoOther',
> +                      'riscv64'      : 'CpuInfoOther',
> +                      'aarch64'      : 'CpuInfoOther',
> +                      'alpha'        : 'CpuInfoOther',
> +                      'arm'          : 'CpuInfoOther',
> +                      'cris'         : 'CpuInfoOther',
> +                      'hppa'         : 'CpuInfoOther',
> +                      'lm32'         : 'CpuInfoOther',
> +                      'm68k'         : 'CpuInfoOther',
> +                      'microblaze'   : 'CpuInfoOther',
> +                      'microblazeel' : 'CpuInfoOther',
> +                      'moxie'        : 'CpuInfoOther',
> +                      'nios2'        : 'CpuInfoOther',
> +                      'or1k'         : 'CpuInfoOther',
> +                      'sh4'          : 'CpuInfoOther',
> +                      'sh4eb'        : 'CpuInfoOther',
> +                      'unicore32'    : 'CpuInfoOther',
> +                      'xtensa'       : 'CpuInfoOther',
> +                      'xtensaeb'     : 'CpuInfoOther' } }
>  
>  ##
>  # @query-cpus-fast:
>  #
>  # Returns information about all virtual CPUs. This command does not
>  # incur a performance penalty and should be used in production
>  # instead of query-cpus.
>  #
>  # Returns: list of @CpuInfoFast
>  #
>  # Since: 2.12
> @@ -630,33 +684,35 @@
>  # -> { "execute": "query-cpus-fast" }
>  # <- { "return": [
>  #         {
>  #             "thread-id": 25627,
>  #             "props": {
>  #                 "core-id": 0,
>  #                 "thread-id": 0,
>  #                 "socket-id": 0
>  #             },
>  #             "qom-path": "/machine/unattached/device[0]",
>  #             "arch":"x86",
> +#             "target":"x86_64",
>  #             "cpu-index": 0
>  #         },
>  #         {
>  #             "thread-id": 25628,
>  #             "props": {
>  #                 "core-id": 0,
>  #                 "thread-id": 0,
>  #                 "socket-id": 1
>  #             },
>  #             "qom-path": "/machine/unattached/device[2]",
>  #             "arch":"x86",
> +#             "target":"x86_64",
>  #             "cpu-index": 1
>  #         }
>  #     ]
>  # }
>  ##
>  { 'command': 'query-cpus-fast', 'returns': [ 'CpuInfoFast' ] }
>  
>  ##
>  # @IOThreadInfo:
>  #
>  # Information about an iothread
> diff --git a/cpus.c b/cpus.c
> index 60563a6d54ec..86eed0ffe796 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -2093,88 +2093,235 @@ int vm_stop_force_state(RunState state)
>      }
>  }
>  
>  void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
>  {
>      /* XXX: implement xxx_cpu_list for targets that still miss it */
>  #if defined(cpu_list)
>      cpu_list(f, cpu_fprintf);
>  #endif
>  }
>  
> +static CpuInfoArch sysemu_target_to_cpuinfo_arch(SysEmuTarget target)
> +{
> +    /*
> +     * The @SysEmuTarget -> @CpuInfoArch mapping below is based on the
> +     * TARGET_ARCH -> TARGET_BASE_ARCH mapping in the "configure" script.
> +     */
> +    switch (target) {
> +    case SYS_EMU_TARGET_I386:
> +    case SYS_EMU_TARGET_X86_64:
> +        return CPU_INFO_ARCH_X86;
> +
> +    case SYS_EMU_TARGET_PPC:
> +    case SYS_EMU_TARGET_PPCEMB:
> +    case SYS_EMU_TARGET_PPC64:
> +        return CPU_INFO_ARCH_PPC;
> +
> +    case SYS_EMU_TARGET_SPARC:
> +    case SYS_EMU_TARGET_SPARC64:
> +        return CPU_INFO_ARCH_SPARC;
> +
> +    case SYS_EMU_TARGET_MIPS:
> +    case SYS_EMU_TARGET_MIPSEL:
> +    case SYS_EMU_TARGET_MIPS64:
> +    case SYS_EMU_TARGET_MIPS64EL:
> +        return CPU_INFO_ARCH_MIPS;
> +
> +    case SYS_EMU_TARGET_TRICORE:
> +        return CPU_INFO_ARCH_TRICORE;
> +
> +    case SYS_EMU_TARGET_S390X:
> +        return CPU_INFO_ARCH_S390;
> +
> +    case SYS_EMU_TARGET_RISCV32:
> +    case SYS_EMU_TARGET_RISCV64:
> +        return CPU_INFO_ARCH_RISCV;
> +
> +    default:
> +        return CPU_INFO_ARCH_OTHER;
> +    }
> +}

Hmm.  Can we avoid duplicating configure's mapping here?  More on that
below.

> +
> +static void cpustate_to_cpuinfo_x86(CpuInfoX86 *info, const CPUState *cpu)
> +{
> +#ifdef TARGET_I386
> +    X86CPU *x86_cpu = X86_CPU(cpu);
> +    CPUX86State *env = &x86_cpu->env;
> +
> +    info->pc = env->eip + env->segs[R_CS].base;
> +#else
> +    abort();
> +#endif
> +}
> +
> +static void cpustate_to_cpuinfo_ppc(CpuInfoPPC *info, const CPUState *cpu)
> +{
> +#ifdef TARGET_PPC
> +    PowerPCCPU *ppc_cpu = POWERPC_CPU(cpu);
> +    CPUPPCState *env = &ppc_cpu->env;
> +
> +    info->nip = env->nip;
> +#else
> +    abort();
> +#endif
> +}
> +
> +static void cpustate_to_cpuinfo_sparc(CpuInfoSPARC *info, const CPUState *cpu)
> +{
> +#ifdef TARGET_SPARC
> +    SPARCCPU *sparc_cpu = SPARC_CPU(cpu);
> +    CPUSPARCState *env = &sparc_cpu->env;
> +
> +    info->pc = env->pc;
> +    info->npc = env->npc;
> +#else
> +    abort();
> +#endif
> +}
> +
> +static void cpustate_to_cpuinfo_mips(CpuInfoMIPS *info, const CPUState *cpu)
> +{
> +#ifdef TARGET_MIPS
> +    MIPSCPU *mips_cpu = MIPS_CPU(cpu);
> +    CPUMIPSState *env = &mips_cpu->env;
> +
> +    info->PC = env->active_tc.PC;
> +#else
> +    abort();
> +#endif
> +}
> +
> +static void cpustate_to_cpuinfo_tricore(CpuInfoTricore *info,
> +                                        const CPUState *cpu)
> +{
> +#ifdef TARGET_TRICORE
> +    TriCoreCPU *tricore_cpu = TRICORE_CPU(cpu);
> +    CPUTriCoreState *env = &tricore_cpu->env;
> +
> +    info->PC = env->PC;
> +#else
> +    abort();
> +#endif
> +}
> +
> +static void cpustate_to_cpuinfo_s390(CpuInfoS390 *info, const CPUState *cpu)
> +{
> +#ifdef TARGET_S390X
> +    S390CPU *s390_cpu = S390_CPU(cpu);
> +    CPUS390XState *env = &s390_cpu->env;
> +
> +    info->cpu_state = env->cpu_state;
> +#else
> +    abort();
> +#endif
> +}
> +
> +static void cpustate_to_cpuinfo_riscv(CpuInfoRISCV *info, const CPUState *cpu)
> +{
> +#ifdef TARGET_RISCV
> +    RISCVCPU *riscv_cpu = RISCV_CPU(cpu);
> +    CPURISCVState *env = &riscv_cpu->env;
> +
> +    info->pc = env->pc;
> +#else
> +    abort();
> +#endif
> +}
> +

To reduce #ifdeffery here, these helpers could be moved to suitable
files in target/*/, plus stubs, but I doubt it's worth the bother.

>  CpuInfoList *qmp_query_cpus(Error **errp)
>  {
>      MachineState *ms = MACHINE(qdev_get_machine());
>      MachineClass *mc = MACHINE_GET_CLASS(ms);
>      CpuInfoList *head = NULL, *cur_item = NULL;
> +    SysEmuTarget target = qapi_enum_parse(&SysEmuTarget_lookup, TARGET_NAME,
> +                                          -1, &error_abort);

Note how configure providing TARGET_NAME makes computing target easy.

Compare to how sysemu_target_to_cpuinfo_arch() computes arch.  Would it
make sense to have configure provide TARGET_BASE_NAME, so we can compute
arch the same way as target?

>      CPUState *cpu;
>  
>      CPU_FOREACH(cpu) {
>          CpuInfoList *info;
> -#if defined(TARGET_I386)
> -        X86CPU *x86_cpu = X86_CPU(cpu);
> -        CPUX86State *env = &x86_cpu->env;
> -#elif defined(TARGET_PPC)
> -        PowerPCCPU *ppc_cpu = POWERPC_CPU(cpu);
> -        CPUPPCState *env = &ppc_cpu->env;
> -#elif defined(TARGET_SPARC)
> -        SPARCCPU *sparc_cpu = SPARC_CPU(cpu);
> -        CPUSPARCState *env = &sparc_cpu->env;
> -#elif defined(TARGET_RISCV)
> -        RISCVCPU *riscv_cpu = RISCV_CPU(cpu);
> -        CPURISCVState *env = &riscv_cpu->env;
> -#elif defined(TARGET_MIPS)
> -        MIPSCPU *mips_cpu = MIPS_CPU(cpu);
> -        CPUMIPSState *env = &mips_cpu->env;
> -#elif defined(TARGET_TRICORE)
> -        TriCoreCPU *tricore_cpu = TRICORE_CPU(cpu);
> -        CPUTriCoreState *env = &tricore_cpu->env;
> -#elif defined(TARGET_S390X)
> -        S390CPU *s390_cpu = S390_CPU(cpu);
> -        CPUS390XState *env = &s390_cpu->env;
> -#endif
>  
>          cpu_synchronize_state(cpu);
>  
>          info = g_malloc0(sizeof(*info));
>          info->value = g_malloc0(sizeof(*info->value));
>          info->value->CPU = cpu->cpu_index;
>          info->value->current = (cpu == first_cpu);
>          info->value->halted = cpu->halted;
>          info->value->qom_path = object_get_canonical_path(OBJECT(cpu));
>          info->value->thread_id = cpu->thread_id;
> -#if defined(TARGET_I386)
> -        info->value->arch = CPU_INFO_ARCH_X86;
> -        info->value->u.x86.pc = env->eip + env->segs[R_CS].base;
> -#elif defined(TARGET_PPC)
> -        info->value->arch = CPU_INFO_ARCH_PPC;
> -        info->value->u.ppc.nip = env->nip;
> -#elif defined(TARGET_SPARC)
> -        info->value->arch = CPU_INFO_ARCH_SPARC;
> -        info->value->u.q_sparc.pc = env->pc;
> -        info->value->u.q_sparc.npc = env->npc;
> -#elif defined(TARGET_MIPS)
> -        info->value->arch = CPU_INFO_ARCH_MIPS;
> -        info->value->u.q_mips.PC = env->active_tc.PC;
> -#elif defined(TARGET_TRICORE)
> -        info->value->arch = CPU_INFO_ARCH_TRICORE;
> -        info->value->u.tricore.PC = env->PC;
> -#elif defined(TARGET_S390X)
> -        info->value->arch = CPU_INFO_ARCH_S390;
> -        info->value->u.s390.cpu_state = env->cpu_state;
> -#elif defined(TARGET_RISCV)
> -        info->value->arch = CPU_INFO_ARCH_RISCV;
> -        info->value->u.riscv.pc = env->pc;
> -#else
> -        info->value->arch = CPU_INFO_ARCH_OTHER;
> -#endif
> +        info->value->arch = sysemu_target_to_cpuinfo_arch(target);
> +        info->value->target = target;
> +
> +        /*
> +         * The @SysEmuTarget -> @CpuInfo mapping below is based on the
> +         * TARGET_ARCH -> TARGET_BASE_ARCH mapping in the "configure" script.
> +         */
> +        switch (target) {
> +        case SYS_EMU_TARGET_I386:
> +            cpustate_to_cpuinfo_x86(&info->value->u.i386, cpu);
> +            break;
> +        case SYS_EMU_TARGET_X86_64:
> +            cpustate_to_cpuinfo_x86(&info->value->u.x86_64, cpu);
> +            break;
> +
> +        case SYS_EMU_TARGET_PPC:
> +            cpustate_to_cpuinfo_ppc(&info->value->u.ppc, cpu);
> +            break;
> +        case SYS_EMU_TARGET_PPCEMB:
> +            cpustate_to_cpuinfo_ppc(&info->value->u.ppcemb, cpu);
> +            break;
> +        case SYS_EMU_TARGET_PPC64:
> +            cpustate_to_cpuinfo_ppc(&info->value->u.ppc64, cpu);
> +            break;
> +
> +        case SYS_EMU_TARGET_SPARC:
> +            cpustate_to_cpuinfo_sparc(&info->value->u.q_sparc, cpu);
> +            break;
> +        case SYS_EMU_TARGET_SPARC64:
> +            cpustate_to_cpuinfo_sparc(&info->value->u.sparc64, cpu);
> +            break;
> +
> +        case SYS_EMU_TARGET_MIPS:
> +            cpustate_to_cpuinfo_mips(&info->value->u.q_mips, cpu);
> +            break;
> +        case SYS_EMU_TARGET_MIPSEL:
> +            cpustate_to_cpuinfo_mips(&info->value->u.mipsel, cpu);
> +            break;
> +        case SYS_EMU_TARGET_MIPS64:
> +            cpustate_to_cpuinfo_mips(&info->value->u.mips64, cpu);
> +            break;
> +        case SYS_EMU_TARGET_MIPS64EL:
> +            cpustate_to_cpuinfo_mips(&info->value->u.mips64el, cpu);
> +            break;
> +
> +        case SYS_EMU_TARGET_TRICORE:
> +            cpustate_to_cpuinfo_tricore(&info->value->u.tricore, cpu);
> +            break;
> +
> +        case SYS_EMU_TARGET_S390X:
> +            cpustate_to_cpuinfo_s390(&info->value->u.s390x, cpu);
> +            break;
> +
> +        case SYS_EMU_TARGET_RISCV32:
> +            cpustate_to_cpuinfo_riscv(&info->value->u.riscv32, cpu);
> +            break;
> +        case SYS_EMU_TARGET_RISCV64:
> +            cpustate_to_cpuinfo_riscv(&info->value->u.riscv64, cpu);
> +            break;
> +
> +        default:
> +            /* do nothing for @CpuInfoOther */
> +            break;
> +        }
> +
>          info->value->has_props = !!mc->cpu_index_to_instance_props;
>          if (info->value->has_props) {
>              CpuInstanceProperties *props;
>              props = g_malloc0(sizeof(*props));
>              *props = mc->cpu_index_to_instance_props(ms, cpu->cpu_index);
>              info->value->props = props;
>          }
>  
>          /* XXX: waiting for the qapi to support GSList */
>          if (!cur_item) {
>              head = cur_item = info;
> @@ -2188,64 +2335,50 @@ CpuInfoList *qmp_query_cpus(Error **errp)
>  }
>  
>  /*
>   * fast means: we NEVER interrupt vCPU threads to retrieve
>   * information from KVM.
>   */
>  CpuInfoFastList *qmp_query_cpus_fast(Error **errp)
>  {
>      MachineState *ms = MACHINE(qdev_get_machine());
>      MachineClass *mc = MACHINE_GET_CLASS(ms);
>      CpuInfoFastList *head = NULL, *cur_item = NULL;
> +    SysEmuTarget target = qapi_enum_parse(&SysEmuTarget_lookup, TARGET_NAME,
> +                                          -1, &error_abort);
>      CPUState *cpu;
> -#if defined(TARGET_S390X)
> -    S390CPU *s390_cpu;
> -    CPUS390XState *env;
> -#endif
>  
>      CPU_FOREACH(cpu) {
>          CpuInfoFastList *info = g_malloc0(sizeof(*info));
>          info->value = g_malloc0(sizeof(*info->value));
>  
>          info->value->cpu_index = cpu->cpu_index;
>          info->value->qom_path = object_get_canonical_path(OBJECT(cpu));
>          info->value->thread_id = cpu->thread_id;
>  
>          info->value->has_props = !!mc->cpu_index_to_instance_props;
>          if (info->value->has_props) {
>              CpuInstanceProperties *props;
>              props = g_malloc0(sizeof(*props));
>              *props = mc->cpu_index_to_instance_props(ms, cpu->cpu_index);
>              info->value->props = props;
>          }
>  
> -#if defined(TARGET_I386)
> -        info->value->arch = CPU_INFO_ARCH_X86;
> -#elif defined(TARGET_PPC)
> -        info->value->arch = CPU_INFO_ARCH_PPC;
> -#elif defined(TARGET_SPARC)
> -        info->value->arch = CPU_INFO_ARCH_SPARC;
> -#elif defined(TARGET_MIPS)
> -        info->value->arch = CPU_INFO_ARCH_MIPS;
> -#elif defined(TARGET_TRICORE)
> -        info->value->arch = CPU_INFO_ARCH_TRICORE;
> -#elif defined(TARGET_S390X)
> -        s390_cpu = S390_CPU(cpu);
> -        env = &s390_cpu->env;
> -        info->value->arch = CPU_INFO_ARCH_S390;
> -        info->value->u.s390.cpu_state = env->cpu_state;
> -#elif defined(TARGET_RISCV)
> -        info->value->arch = CPU_INFO_ARCH_RISCV;
> -#else
> -        info->value->arch = CPU_INFO_ARCH_OTHER;
> -#endif
> +        info->value->arch = sysemu_target_to_cpuinfo_arch(target);
> +        info->value->target = target;
> +        if (target == SYS_EMU_TARGET_S390X) {
> +            cpustate_to_cpuinfo_s390(&info->value->u.s390x, cpu);
> +        } else {
> +            /* do nothing for @CpuInfoOther */
> +        }
> +
>          if (!cur_item) {
>              head = cur_item = info;
>          } else {
>              cur_item->next = info;
>              cur_item = info;
>          }
>      }
>  
>      return head;
>  }

  reply	other threads:[~2018-04-25  7:33 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-24 21:45 [Qemu-devel] [PATCH 0/6] qapi: introduce the SysEmuTarget enumeration Laszlo Ersek
2018-04-24 21:45 ` [Qemu-devel] [PATCH 1/6] qapi: fill in CpuInfoFast.arch in query-cpus-fast Laszlo Ersek
2018-04-24 22:30   ` Eric Blake
2018-04-25 12:30     ` Laszlo Ersek
2018-04-25  6:39   ` Markus Armbruster
2018-04-25 12:30     ` Laszlo Ersek
2018-04-25  7:28   ` Cornelia Huck
2018-04-24 21:45 ` [Qemu-devel] [PATCH 2/6] qapi: handle the riscv CpuInfoArch " Laszlo Ersek
2018-04-24 22:32   ` Eric Blake
2018-04-25 12:32     ` Laszlo Ersek
2018-04-25  6:44   ` Markus Armbruster
2018-04-25  7:48     ` Cornelia Huck
2018-04-25 12:38       ` Viktor VM Mihajlovski
2018-04-25 12:43       ` Laszlo Ersek
2018-04-24 21:45 ` [Qemu-devel] [PATCH 3/6] qapi: add SysEmuTarget to "common.json" Laszlo Ersek
2018-04-24 23:11   ` Eric Blake
2018-04-25 12:54     ` Daniel P. Berrangé
2018-04-25 19:05       ` Laszlo Ersek
2018-04-25 19:08         ` Eric Blake
2018-04-25 22:57           ` Laszlo Ersek
2018-04-24 21:45 ` [Qemu-devel] [PATCH 4/6] qapi: change the type of TargetInfo.arch from string to enum SysEmuTarget Laszlo Ersek
2018-04-25  6:48   ` Markus Armbruster
2018-04-25 12:58     ` Laszlo Ersek
2018-04-24 21:45 ` [Qemu-devel] [PATCH 5/6] qapi: extract CpuInfoCommon to mitigate schema duplication Laszlo Ersek
2018-04-25  7:06   ` Markus Armbruster
2018-04-25 13:20     ` Laszlo Ersek
2018-04-25 17:12       ` Markus Armbruster
2018-04-25 19:12       ` Eric Blake
2018-04-25 22:56         ` Laszlo Ersek
2018-04-26  6:19           ` Markus Armbruster
2018-04-24 21:45 ` [Qemu-devel] [PATCH 6/6] qapi: discriminate CpuInfo[Fast] on SysEmuTarget, not CpuInfoArch Laszlo Ersek
2018-04-25  7:33   ` Markus Armbruster [this message]
2018-04-25 13:47     ` Laszlo Ersek
2018-04-26  6:26       ` Markus Armbruster
2018-04-26  9:18         ` Laszlo Ersek
2018-04-26 11:57           ` Markus Armbruster
2018-04-26 13:33           ` Laszlo Ersek
2018-04-26 14:34             ` Markus Armbruster
2018-04-26 14:48               ` Eric Blake
2018-04-26 15:51                 ` Markus Armbruster
2018-04-26 16:30                   ` Laszlo Ersek
2018-04-27  6:53                     ` Markus Armbruster
2018-04-27 13:46                       ` Eric Blake
2018-04-24 22:03 ` [Qemu-devel] [PATCH 0/6] qapi: introduce the SysEmuTarget enumeration no-reply
2018-04-25 12:26   ` Laszlo Ersek
2018-04-25 14:37     ` Eric Blake

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8736zjagg3.fsf@dusky.pond.sub.org \
    --to=armbru@redhat.com \
    --cc=crosthwaite.peter@gmail.com \
    --cc=lersek@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.