[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] [Qemu-devel] [PATCH 2/6] Remove monitor.c dependency on C
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-ppc] [Qemu-devel] [PATCH 2/6] Remove monitor.c dependency on CONFIG_I8259 |
Date: |
Mon, 30 Mar 2015 09:49:19 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) |
David Gibson <address@hidden> writes:
> The hmp commands "irq" and "pic" are a bit of a mess. They're implemented
> on a number of targets, but not all. On sparc32 and LM32 they do target
> specific things, but on the remainder (i386, ppc and mips) they call into
> the i8259 PIC code.
Where "info pic" does absolutely nothing unless we're using "isa-i8259".
In particular, it does nothing when we're using "kvm-i8259" instead.
Fun!
> But really, what these commands do shouldn't be dependent on the target
> arch, but on the specific machine that's in use. On ppc, for example,
> the "prep" machine usually does have an ISA bridge with an i8259, but
> most of the other machine types have never had an i8259 at all. Similarly
> the sparc specific target would stop working if we ever had a sparc32
> machine that wasn't sun4m.
>
> This patch cleans things up by implementing these hmp commands on all
> targets via a MachineClass callback. If the callback is NULL, for now
> we fallback to target specific defaults that match the existing behaviour.
> The hope is we can remove those later with target specific cleanups.
>
> Signed-off-by: David Gibson <address@hidden>
> ---
> hw/intc/i8259.c | 4 ++--
> include/hw/boards.h | 2 ++
> include/hw/i386/pc.h | 4 ++--
> monitor.c | 57
> ++++++++++++++++++++++++++++++++++++++--------------
> 4 files changed, 48 insertions(+), 19 deletions(-)
>
> diff --git a/hw/intc/i8259.c b/hw/intc/i8259.c
> index 0f5c025..43e90b9 100644
> --- a/hw/intc/i8259.c
> +++ b/hw/intc/i8259.c
> @@ -429,7 +429,7 @@ static void pic_realize(DeviceState *dev, Error **errp)
> pc->parent_realize(dev, errp);
> }
>
> -void hmp_info_pic(Monitor *mon, const QDict *qdict)
> +void i8259_hmp_info_pic(Monitor *mon, const QDict *qdict)
> {
> int i;
> PICCommonState *s;
> @@ -447,7 +447,7 @@ void hmp_info_pic(Monitor *mon, const QDict *qdict)
> }
> }
>
> -void hmp_info_irq(Monitor *mon, const QDict *qdict)
> +void i8259_hmp_info_irq(Monitor *mon, const QDict *qdict)
> {
> #ifndef DEBUG_IRQ_COUNT
> monitor_printf(mon, "irq statistic code not compiled.\n");
> diff --git a/include/hw/boards.h b/include/hw/boards.h
> index 3ddc449..214a778 100644
> --- a/include/hw/boards.h
> +++ b/include/hw/boards.h
> @@ -111,6 +111,8 @@ struct MachineClass {
>
> HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
> DeviceState *dev);
> + void (*hmp_info_irq)(Monitor *mon, const QDict *qdict);
> + void (*hmp_info_pic)(Monitor *mon, const QDict *qdict);
> };
>
> /**
Here you're defining the MachineClass callback.
The callback is designed for HMP. This will make code implementing it
depend on the monitor. You could do a QMP-style callback instead, and
get a dependency on QAPI or QObject instead.
But I'm fine with it as is.
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index 08ab67d..0f376c6 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -121,8 +121,8 @@ qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq);
> qemu_irq *kvm_i8259_init(ISABus *bus);
> int pic_read_irq(DeviceState *d);
> int pic_get_output(DeviceState *d);
> -void hmp_info_pic(Monitor *mon, const QDict *qdict);
> -void hmp_info_irq(Monitor *mon, const QDict *qdict);
> +void i8259_hmp_info_pic(Monitor *mon, const QDict *qdict);
> +void i8259_hmp_info_irq(Monitor *mon, const QDict *qdict);
>
> /* Global System Interrupts */
>
> diff --git a/monitor.c b/monitor.c
> index c86a89e..ca226a9 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -1064,6 +1064,48 @@ static void hmp_info_history(Monitor *mon, const QDict
> *qdict)
> }
> }
>
> +static void hmp_info_pic(Monitor *mon, const QDict *qdict)
> +{
> + MachineClass *mc = MACHINE_GET_CLASS(current_machine);
> +
> + if (mc->hmp_info_pic) {
> + (mc->hmp_info_pic)(mon, qdict);
Here you're using the MachineClass callback.
However, you're not setting it anywhere, so the callback is dead code.
Interfacing to the machine-specific parts with a MachineClass callback
sounds sensible enough, but not without at least one user. Please
either add one, or drop the dead code for now.
> + } else {
> + /* FIXME: Backwards compat fallbacks. These can go away once
> + * we've finished converting to natively using MachineClass,
> + * rather thatn QEMUMachine */
> +#if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
> + sun4m_hmp_info_pic(mon, qdict);
> +#elif defined(TARGET_LM32)
> + lm32_hmp_info_pic(mon, qdict);
> +#elif defined(TARGET_i386) || defined(TARGET_PPC) || defined(TARGET_MIPS)
> + i8259_hmp_info_pic(mon, qdict);
> +#endif
> + }
> +}
> +
> +static void hmp_info_irq(Monitor *mon, const QDict *qdict)
> +{
> + /* FIXME: The ifdefs can go away once the sun4m and LM32 machines
> + * are converted to use machine classes natively */
> + MachineClass *mc = MACHINE_GET_CLASS(current_machine);
> +
> + if (mc->hmp_info_irq) {
> + (mc->hmp_info_irq)(mon, qdict);
> + } else {
> + /* FIXME: Backwards compat fallbacks. These can go away once
> + * we've finished converting to natively using MachineClass,
> + * rather thatn QEMUMachine */
> +#if defined(TARGET_SPARC) && !defined(TARGET_SPARC64)
> + sun4m_hmp_info_irq(mon, qdict);
> +#elif defined(TARGET_LM32)
> + lm32_hmp_info_irq(mon, qdict);
> +#elif defined(TARGET_i386) || defined(TARGET_PPC) || defined(TARGET_MIPS)
> + i8259_hmp_info_irq(mon, qdict);
> +#endif
> + }
> +}
> +
> static void hmp_info_cpustats(Monitor *mon, const QDict *qdict)
> {
> CPUState *cpu;
> @@ -2661,35 +2703,20 @@ static mon_cmd_t info_cmds[] = {
> .help = "show the command line history",
> .mhandler.cmd = hmp_info_history,
> },
> -#if defined(TARGET_I386) || defined(TARGET_PPC) || defined(TARGET_MIPS) || \
> - defined(TARGET_LM32) || (defined(TARGET_SPARC) &&
> !defined(TARGET_SPARC64))
> {
> .name = "irq",
> .args_type = "",
> .params = "",
> .help = "show the interrupts statistics (if available)",
> -#ifdef TARGET_SPARC
> - .mhandler.cmd = sun4m_hmp_info_irq,
> -#elif defined(TARGET_LM32)
> - .mhandler.cmd = lm32_hmp_info_irq,
> -#else
> .mhandler.cmd = hmp_info_irq,
> -#endif
> },
> {
> .name = "pic",
> .args_type = "",
> .params = "",
> .help = "show i8259 (PIC) state",
> -#ifdef TARGET_SPARC
> - .mhandler.cmd = sun4m_hmp_info_pic,
> -#elif defined(TARGET_LM32)
> - .mhandler.cmd = lm32_hmp_info_pic,
> -#else
> .mhandler.cmd = hmp_info_pic,
> -#endif
> },
> -#endif
> {
> .name = "pci",
> .args_type = "",
Re: [Qemu-ppc] [Qemu-devel] [PATCH 2/6] Remove monitor.c dependency on CONFIG_I8259, Andreas Färber, 2015/03/30
Re: [Qemu-ppc] [Qemu-devel] [PATCH 2/6] Remove monitor.c dependency on CONFIG_I8259, Peter Maydell, 2015/03/31
[Qemu-ppc] [PATCH 1/6] Split serial-isa into its own config option, David Gibson, 2015/03/05
[Qemu-ppc] [PATCH 4/6] target-ppc: Convert PReP to machine class, David Gibson, 2015/03/05