Patchwork [21/22] monitor: Restrict pic/irq_info to supporting targets

login
register
mail settings
Submitter Jan Kiszka
Date Sept. 28, 2011, 11:01 a.m.
Message ID <bc32803ee9d9033b838dfbf470edd5c4e8b8706a.1317207666.git.jan.kiszka@siemens.com>
Download mbox | patch
Permalink /patch/116774/
State New
Headers show

Comments

Jan Kiszka - Sept. 28, 2011, 11:01 a.m.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 hw/an5206.c             |   10 ----------
 hw/arm_pic.c            |   11 -----------
 hw/cris_pic_cpu.c       |    6 ------
 hw/etraxfs.h            |    1 +
 hw/lm32_pic.c           |    4 ++--
 hw/lm32_pic.h           |    3 +++
 hw/microblaze_pic_cpu.c |    6 ------
 hw/s390-virtio.c        |   11 -----------
 hw/shix.c               |   11 -----------
 hw/slavio_intctl.c      |   14 ++++++++++----
 hw/sun4m.c              |   16 ++--------------
 hw/sun4m.h              |    6 ++++--
 hw/sun4u.c              |    8 --------
 hw/xtensa_pic.c         |   10 ----------
 monitor.c               |   21 +++++++++++++++++++++
 15 files changed, 43 insertions(+), 95 deletions(-)
Blue Swirl - Sept. 28, 2011, 6:19 p.m.
On Wed, Sep 28, 2011 at 11:01 AM, Jan Kiszka <jan.kiszka@siemens.com> wrote:
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
> ---
>  hw/an5206.c             |   10 ----------
>  hw/arm_pic.c            |   11 -----------
>  hw/cris_pic_cpu.c       |    6 ------
>  hw/etraxfs.h            |    1 +
>  hw/lm32_pic.c           |    4 ++--
>  hw/lm32_pic.h           |    3 +++
>  hw/microblaze_pic_cpu.c |    6 ------
>  hw/s390-virtio.c        |   11 -----------
>  hw/shix.c               |   11 -----------
>  hw/slavio_intctl.c      |   14 ++++++++++----
>  hw/sun4m.c              |   16 ++--------------
>  hw/sun4m.h              |    6 ++++--
>  hw/sun4u.c              |    8 --------
>  hw/xtensa_pic.c         |   10 ----------
>  monitor.c               |   21 +++++++++++++++++++++
>  15 files changed, 43 insertions(+), 95 deletions(-)
>
> diff --git a/hw/an5206.c b/hw/an5206.c
> index 481ae60..3fe1f00 100644
> --- a/hw/an5206.c
> +++ b/hw/an5206.c
> @@ -7,7 +7,6 @@
>  */
>
>  #include "hw.h"
> -#include "pc.h"
>  #include "mcf.h"
>  #include "boards.h"
>  #include "loader.h"
> @@ -18,15 +17,6 @@
>  #define AN5206_MBAR_ADDR 0x10000000
>  #define AN5206_RAMBAR_ADDR 0x20000000
>
> -/* Stub functions for hardware that doesn't exist.  */
> -void pic_info(Monitor *mon)
> -{
> -}
> -
> -void irq_info(Monitor *mon)
> -{
> -}
> -
>  /* Board init.  */
>
>  static void an5206_init(ram_addr_t ram_size,
> diff --git a/hw/arm_pic.c b/hw/arm_pic.c
> index 985148a..4e63845 100644
> --- a/hw/arm_pic.c
> +++ b/hw/arm_pic.c
> @@ -8,19 +8,8 @@
>  */
>
>  #include "hw.h"
> -#include "pc.h"
>  #include "arm-misc.h"
>
> -/* Stub functions for hardware that doesn't exist.  */
> -void pic_info(Monitor *mon)
> -{
> -}
> -
> -void irq_info(Monitor *mon)
> -{
> -}
> -
> -
>  /* Input 0 is IRQ and input 1 is FIQ.  */
>  static void arm_pic_cpu_handler(void *opaque, int irq, int level)
>  {
> diff --git a/hw/cris_pic_cpu.c b/hw/cris_pic_cpu.c
> index 7f1e4ab..06ae484 100644
> --- a/hw/cris_pic_cpu.c
> +++ b/hw/cris_pic_cpu.c
> @@ -24,16 +24,10 @@
>
>  #include "sysbus.h"
>  #include "hw.h"
> -#include "pc.h"
>  #include "etraxfs.h"
>
>  #define D(x)
>
> -void pic_info(Monitor *mon)
> -{}
> -void irq_info(Monitor *mon)
> -{}
> -
>  static void cris_pic_cpu_handler(void *opaque, int irq, int level)
>  {
>     CPUState *env = (CPUState *)opaque;
> diff --git a/hw/etraxfs.h b/hw/etraxfs.h
> index 1554b0b..24e8fd8 100644
> --- a/hw/etraxfs.h
> +++ b/hw/etraxfs.h
> @@ -22,6 +22,7 @@
>  * THE SOFTWARE.
>  */
>
> +#include "net.h"
>  #include "etraxfs_dma.h"
>
>  qemu_irq *cris_pic_init_cpu(CPUState *env);
> diff --git a/hw/lm32_pic.c b/hw/lm32_pic.c
> index 02941a7..8dd0050 100644
> --- a/hw/lm32_pic.c
> +++ b/hw/lm32_pic.c
> @@ -39,7 +39,7 @@ struct LM32PicState {
>  typedef struct LM32PicState LM32PicState;
>
>  static LM32PicState *pic;
> -void pic_info(Monitor *mon)
> +void lm32_do_pic_info(Monitor *mon)
>  {
>     if (pic == NULL) {
>         return;
> @@ -49,7 +49,7 @@ void pic_info(Monitor *mon)
>             pic->im, pic->ip, pic->irq_state);
>  }
>
> -void irq_info(Monitor *mon)
> +void lm32_irq_info(Monitor *mon)
>  {
>     int i;
>     uint32_t count;
> diff --git a/hw/lm32_pic.h b/hw/lm32_pic.h
> index e6479b8..14456f3 100644
> --- a/hw/lm32_pic.h
> +++ b/hw/lm32_pic.h
> @@ -8,4 +8,7 @@ uint32_t lm32_pic_get_im(DeviceState *d);
>  void lm32_pic_set_ip(DeviceState *d, uint32_t ip);
>  void lm32_pic_set_im(DeviceState *d, uint32_t im);
>
> +void lm32_do_pic_info(Monitor *mon);
> +void lm32_irq_info(Monitor *mon);
> +
>  #endif /* QEMU_HW_LM32_PIC_H */
> diff --git a/hw/microblaze_pic_cpu.c b/hw/microblaze_pic_cpu.c
> index 9ad48b4..8b5623c 100644
> --- a/hw/microblaze_pic_cpu.c
> +++ b/hw/microblaze_pic_cpu.c
> @@ -23,16 +23,10 @@
>  */
>
>  #include "hw.h"
> -#include "pc.h"
>  #include "microblaze_pic_cpu.h"
>
>  #define D(x)
>
> -void pic_info(Monitor *mon)
> -{}
> -void irq_info(Monitor *mon)
> -{}
> -
>  static void microblaze_pic_cpu_handler(void *opaque, int irq, int level)
>  {
>     CPUState *env = (CPUState *)opaque;
> diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c
> index acbf026..778cffe 100644
> --- a/hw/s390-virtio.c
> +++ b/hw/s390-virtio.c
> @@ -62,17 +62,6 @@
>  static VirtIOS390Bus *s390_bus;
>  static CPUState **ipi_states;
>
> -void irq_info(Monitor *mon);
> -void pic_info(Monitor *mon);
> -
> -void irq_info(Monitor *mon)
> -{
> -}
> -
> -void pic_info(Monitor *mon)
> -{
> -}
> -
>  CPUState *s390_cpu_addr2state(uint16_t cpu_addr)
>  {
>     if (cpu_addr >= smp_cpus) {
> diff --git a/hw/shix.c b/hw/shix.c
> index 638bf16..dbf4764 100644
> --- a/hw/shix.c
> +++ b/hw/shix.c
> @@ -28,7 +28,6 @@
>    More information in target-sh4/README.sh4
>  */
>  #include "hw.h"
> -#include "pc.h"
>  #include "sh.h"
>  #include "sysemu.h"
>  #include "boards.h"
> @@ -37,16 +36,6 @@
>  #define BIOS_FILENAME "shix_bios.bin"
>  #define BIOS_ADDRESS 0xA0000000
>
> -void irq_info(Monitor *mon)
> -{
> -    /* XXXXX */
> -}
> -
> -void pic_info(Monitor *mon)
> -{
> -    /* XXXXX */
> -}
> -
>  static void shix_init(ram_addr_t ram_size,
>                const char *boot_device,
>               const char *kernel_filename, const char *kernel_cmdline,
> diff --git a/hw/slavio_intctl.c b/hw/slavio_intctl.c
> index 329c251..2d1dc12 100644
> --- a/hw/slavio_intctl.c
> +++ b/hw/slavio_intctl.c
> @@ -204,13 +204,16 @@ static CPUWriteMemoryFunc * const slavio_intctlm_mem_write[3] = {
>     slavio_intctlm_mem_writel,
>  };
>
> -void slavio_pic_info(Monitor *mon, DeviceState *dev)
> +void slavio_pic_info(Monitor *mon)
>  {
>     SysBusDevice *sd;
>     SLAVIO_INTCTLState *s;
>     int i;
>
> -    sd = sysbus_from_qdev(dev);
> +    if (!slavio_intctl) {
> +        return;
> +    }
> +    sd = sysbus_from_qdev(slavio_intctl);
>     s = FROM_SYSBUS(SLAVIO_INTCTLState, sd);
>     for (i = 0; i < MAX_CPUS; i++) {
>         monitor_printf(mon, "per-cpu %d: pending 0x%08x\n", i,
> @@ -220,7 +223,7 @@ void slavio_pic_info(Monitor *mon, DeviceState *dev)
>                    s->intregm_pending, s->intregm_disabled);
>  }
>
> -void slavio_irq_info(Monitor *mon, DeviceState *dev)
> +void slavio_irq_info(Monitor *mon)
>  {
>  #ifndef DEBUG_IRQ_COUNT
>     monitor_printf(mon, "irq statistic code not compiled.\n");
> @@ -230,7 +233,10 @@ void slavio_irq_info(Monitor *mon, DeviceState *dev)
>     int i;
>     int64_t count;
>
> -    sd = sysbus_from_qdev(dev);
> +    if (!slavio_intctl) {
> +        return;
> +    }
> +    sd = sysbus_from_qdev(slavio_intctl);
>     s = FROM_SYSBUS(SLAVIO_INTCTLState, sd);
>     monitor_printf(mon, "IRQ statistics:\n");
>     for (i = 0; i < 32; i++) {
> diff --git a/hw/sun4m.c b/hw/sun4m.c
> index dcaed38..589b505 100644
> --- a/hw/sun4m.c
> +++ b/hw/sun4m.c
> @@ -135,6 +135,8 @@ struct sun4c_hwdef {
>     uint8_t nvram_machine_id;
>  };
>
> +DeviceState *slavio_intctl;

Instead of adding new global variables, could you add a registration
mechanism instead to pass the DeviceState used by the handler?

Or maybe I should revive this patch set:
http://lists.nongnu.org/archive/html/qemu-devel/2009-09/msg00459.html

> +
>  int DMA_get_channel_mode (int nchan)
>  {
>     return 0;
> @@ -214,20 +216,6 @@ static void nvram_init(M48t59State *nvram, uint8_t *macaddr,
>         m48t59_write(nvram, i, image[i]);
>  }
>
> -static DeviceState *slavio_intctl;
> -
> -void pic_info(Monitor *mon)
> -{
> -    if (slavio_intctl)
> -        slavio_pic_info(mon, slavio_intctl);
> -}
> -
> -void irq_info(Monitor *mon)
> -{
> -    if (slavio_intctl)
> -        slavio_irq_info(mon, slavio_intctl);
> -}
> -
>  void cpu_check_irqs(CPUState *env)
>  {
>     if (env->pil_in && (env->interrupt_index == 0 ||
> diff --git a/hw/sun4m.h b/hw/sun4m.h
> index ce97ee5..39a73aa 100644
> --- a/hw/sun4m.h
> +++ b/hw/sun4m.h
> @@ -3,6 +3,8 @@
>
>  #include "qemu-common.h"
>
> +extern DeviceState *slavio_intctl;
> +
>  /* Devices used by sparc32 system.  */
>
>  /* iommu.c */
> @@ -23,8 +25,8 @@ static inline void sparc_iommu_memory_write(void *opaque,
>  }
>
>  /* slavio_intctl.c */
> -void slavio_pic_info(Monitor *mon, DeviceState *dev);
> -void slavio_irq_info(Monitor *mon, DeviceState *dev);
> +void slavio_pic_info(Monitor *mon);
> +void slavio_irq_info(Monitor *mon);
>
>  /* sun4c_intctl.c */
>  void sun4c_pic_info(Monitor *mon, void *opaque);
> diff --git a/hw/sun4u.c b/hw/sun4u.c
> index fbef350..568819d 100644
> --- a/hw/sun4u.c
> +++ b/hw/sun4u.c
> @@ -242,14 +242,6 @@ static unsigned long sun4u_load_kernel(const char *kernel_filename,
>     return kernel_size;
>  }
>
> -void pic_info(Monitor *mon)
> -{
> -}
> -
> -void irq_info(Monitor *mon)
> -{
> -}
> -
>  void cpu_check_irqs(CPUState *env)
>  {
>     uint32_t pil = env->pil_in |
> diff --git a/hw/xtensa_pic.c b/hw/xtensa_pic.c
> index 3033ae2..9357684 100644
> --- a/hw/xtensa_pic.c
> +++ b/hw/xtensa_pic.c
> @@ -26,19 +26,9 @@
>  */
>
>  #include "hw.h"
> -#include "pc.h"
>  #include "qemu-log.h"
>  #include "qemu-timer.h"
>
> -/* Stub functions for hardware that doesn't exist.  */
> -void pic_info(Monitor *mon)
> -{
> -}
> -
> -void irq_info(Monitor *mon)
> -{
> -}
> -
>  void xtensa_advance_ccount(CPUState *env, uint32_t d)
>  {
>     uint32_t old_ccount = env->sregs[CCOUNT];
> diff --git a/monitor.c b/monitor.c
> index 8ec2c5e..418161c 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -64,6 +64,12 @@
>  #include "trace/control.h"
>  #include "ui/qemu-spice.h"
>
> +/* for pic/irq_info */
> +#if defined(TARGET_SPARC)
> +#include "hw/sun4m.h"
> +#endif
> +#include "hw/lm32_pic.h"
> +
>  //#define DEBUG
>  //#define DEBUG_COMPLETION
>
> @@ -2937,20 +2943,35 @@ static const mon_cmd_t info_cmds[] = {
>         .help       = "show the command line history",
>         .mhandler.info = do_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.info = slavio_irq_info,
> +#elif defined(TARGET_LM32)
> +        .mhandler.info = lm32_irq_info,
> +#else
>         .mhandler.info = irq_info,
> +#endif
>     },
>     {
>         .name       = "pic",
>         .args_type  = "",
>         .params     = "",
>         .help       = "show i8259 (PIC) state",
> +#ifdef TARGET_SPARC
> +        .mhandler.info = slavio_pic_info,
> +#elif defined(TARGET_LM32)
> +        .mhandler.info = lm32_do_pic_info,
> +#else
>         .mhandler.info = pic_info,
> +#endif
>     },
> +#endif
>     {
>         .name       = "pci",
>         .args_type  = "",
> --
> 1.7.3.4
>
>
Jan Kiszka - Sept. 28, 2011, 9:26 p.m.
On 2011-09-28 20:19, Blue Swirl wrote:
> On Wed, Sep 28, 2011 at 11:01 AM, Jan Kiszka<jan.kiszka@siemens.com>  wrote:
>> Signed-off-by: Jan Kiszka<jan.kiszka@siemens.com>
>> ---
>>   hw/an5206.c             |   10 ----------
>>   hw/arm_pic.c            |   11 -----------
>>   hw/cris_pic_cpu.c       |    6 ------
>>   hw/etraxfs.h            |    1 +
>>   hw/lm32_pic.c           |    4 ++--
>>   hw/lm32_pic.h           |    3 +++
>>   hw/microblaze_pic_cpu.c |    6 ------
>>   hw/s390-virtio.c        |   11 -----------
>>   hw/shix.c               |   11 -----------
>>   hw/slavio_intctl.c      |   14 ++++++++++----
>>   hw/sun4m.c              |   16 ++--------------
>>   hw/sun4m.h              |    6 ++++--
>>   hw/sun4u.c              |    8 --------
>>   hw/xtensa_pic.c         |   10 ----------
>>   monitor.c               |   21 +++++++++++++++++++++
>>   15 files changed, 43 insertions(+), 95 deletions(-)
>>
>> diff --git a/hw/an5206.c b/hw/an5206.c
>> index 481ae60..3fe1f00 100644
>> --- a/hw/an5206.c
>> +++ b/hw/an5206.c
>> @@ -7,7 +7,6 @@
>>   */
>>
>>   #include "hw.h"
>> -#include "pc.h"
>>   #include "mcf.h"
>>   #include "boards.h"
>>   #include "loader.h"
>> @@ -18,15 +17,6 @@
>>   #define AN5206_MBAR_ADDR 0x10000000
>>   #define AN5206_RAMBAR_ADDR 0x20000000
>>
>> -/* Stub functions for hardware that doesn't exist.  */
>> -void pic_info(Monitor *mon)
>> -{
>> -}
>> -
>> -void irq_info(Monitor *mon)
>> -{
>> -}
>> -
>>   /* Board init.  */
>>
>>   static void an5206_init(ram_addr_t ram_size,
>> diff --git a/hw/arm_pic.c b/hw/arm_pic.c
>> index 985148a..4e63845 100644
>> --- a/hw/arm_pic.c
>> +++ b/hw/arm_pic.c
>> @@ -8,19 +8,8 @@
>>   */
>>
>>   #include "hw.h"
>> -#include "pc.h"
>>   #include "arm-misc.h"
>>
>> -/* Stub functions for hardware that doesn't exist.  */
>> -void pic_info(Monitor *mon)
>> -{
>> -}
>> -
>> -void irq_info(Monitor *mon)
>> -{
>> -}
>> -
>> -
>>   /* Input 0 is IRQ and input 1 is FIQ.  */
>>   static void arm_pic_cpu_handler(void *opaque, int irq, int level)
>>   {
>> diff --git a/hw/cris_pic_cpu.c b/hw/cris_pic_cpu.c
>> index 7f1e4ab..06ae484 100644
>> --- a/hw/cris_pic_cpu.c
>> +++ b/hw/cris_pic_cpu.c
>> @@ -24,16 +24,10 @@
>>
>>   #include "sysbus.h"
>>   #include "hw.h"
>> -#include "pc.h"
>>   #include "etraxfs.h"
>>
>>   #define D(x)
>>
>> -void pic_info(Monitor *mon)
>> -{}
>> -void irq_info(Monitor *mon)
>> -{}
>> -
>>   static void cris_pic_cpu_handler(void *opaque, int irq, int level)
>>   {
>>      CPUState *env = (CPUState *)opaque;
>> diff --git a/hw/etraxfs.h b/hw/etraxfs.h
>> index 1554b0b..24e8fd8 100644
>> --- a/hw/etraxfs.h
>> +++ b/hw/etraxfs.h
>> @@ -22,6 +22,7 @@
>>   * THE SOFTWARE.
>>   */
>>
>> +#include "net.h"
>>   #include "etraxfs_dma.h"
>>
>>   qemu_irq *cris_pic_init_cpu(CPUState *env);
>> diff --git a/hw/lm32_pic.c b/hw/lm32_pic.c
>> index 02941a7..8dd0050 100644
>> --- a/hw/lm32_pic.c
>> +++ b/hw/lm32_pic.c
>> @@ -39,7 +39,7 @@ struct LM32PicState {
>>   typedef struct LM32PicState LM32PicState;
>>
>>   static LM32PicState *pic;
>> -void pic_info(Monitor *mon)
>> +void lm32_do_pic_info(Monitor *mon)
>>   {
>>      if (pic == NULL) {
>>          return;
>> @@ -49,7 +49,7 @@ void pic_info(Monitor *mon)
>>              pic->im, pic->ip, pic->irq_state);
>>   }
>>
>> -void irq_info(Monitor *mon)
>> +void lm32_irq_info(Monitor *mon)
>>   {
>>      int i;
>>      uint32_t count;
>> diff --git a/hw/lm32_pic.h b/hw/lm32_pic.h
>> index e6479b8..14456f3 100644
>> --- a/hw/lm32_pic.h
>> +++ b/hw/lm32_pic.h
>> @@ -8,4 +8,7 @@ uint32_t lm32_pic_get_im(DeviceState *d);
>>   void lm32_pic_set_ip(DeviceState *d, uint32_t ip);
>>   void lm32_pic_set_im(DeviceState *d, uint32_t im);
>>
>> +void lm32_do_pic_info(Monitor *mon);
>> +void lm32_irq_info(Monitor *mon);
>> +
>>   #endif /* QEMU_HW_LM32_PIC_H */
>> diff --git a/hw/microblaze_pic_cpu.c b/hw/microblaze_pic_cpu.c
>> index 9ad48b4..8b5623c 100644
>> --- a/hw/microblaze_pic_cpu.c
>> +++ b/hw/microblaze_pic_cpu.c
>> @@ -23,16 +23,10 @@
>>   */
>>
>>   #include "hw.h"
>> -#include "pc.h"
>>   #include "microblaze_pic_cpu.h"
>>
>>   #define D(x)
>>
>> -void pic_info(Monitor *mon)
>> -{}
>> -void irq_info(Monitor *mon)
>> -{}
>> -
>>   static void microblaze_pic_cpu_handler(void *opaque, int irq, int level)
>>   {
>>      CPUState *env = (CPUState *)opaque;
>> diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c
>> index acbf026..778cffe 100644
>> --- a/hw/s390-virtio.c
>> +++ b/hw/s390-virtio.c
>> @@ -62,17 +62,6 @@
>>   static VirtIOS390Bus *s390_bus;
>>   static CPUState **ipi_states;
>>
>> -void irq_info(Monitor *mon);
>> -void pic_info(Monitor *mon);
>> -
>> -void irq_info(Monitor *mon)
>> -{
>> -}
>> -
>> -void pic_info(Monitor *mon)
>> -{
>> -}
>> -
>>   CPUState *s390_cpu_addr2state(uint16_t cpu_addr)
>>   {
>>      if (cpu_addr>= smp_cpus) {
>> diff --git a/hw/shix.c b/hw/shix.c
>> index 638bf16..dbf4764 100644
>> --- a/hw/shix.c
>> +++ b/hw/shix.c
>> @@ -28,7 +28,6 @@
>>     More information in target-sh4/README.sh4
>>   */
>>   #include "hw.h"
>> -#include "pc.h"
>>   #include "sh.h"
>>   #include "sysemu.h"
>>   #include "boards.h"
>> @@ -37,16 +36,6 @@
>>   #define BIOS_FILENAME "shix_bios.bin"
>>   #define BIOS_ADDRESS 0xA0000000
>>
>> -void irq_info(Monitor *mon)
>> -{
>> -    /* XXXXX */
>> -}
>> -
>> -void pic_info(Monitor *mon)
>> -{
>> -    /* XXXXX */
>> -}
>> -
>>   static void shix_init(ram_addr_t ram_size,
>>                 const char *boot_device,
>>                const char *kernel_filename, const char *kernel_cmdline,
>> diff --git a/hw/slavio_intctl.c b/hw/slavio_intctl.c
>> index 329c251..2d1dc12 100644
>> --- a/hw/slavio_intctl.c
>> +++ b/hw/slavio_intctl.c
>> @@ -204,13 +204,16 @@ static CPUWriteMemoryFunc * const slavio_intctlm_mem_write[3] = {
>>      slavio_intctlm_mem_writel,
>>   };
>>
>> -void slavio_pic_info(Monitor *mon, DeviceState *dev)
>> +void slavio_pic_info(Monitor *mon)
>>   {
>>      SysBusDevice *sd;
>>      SLAVIO_INTCTLState *s;
>>      int i;
>>
>> -    sd = sysbus_from_qdev(dev);
>> +    if (!slavio_intctl) {
>> +        return;
>> +    }
>> +    sd = sysbus_from_qdev(slavio_intctl);
>>      s = FROM_SYSBUS(SLAVIO_INTCTLState, sd);
>>      for (i = 0; i<  MAX_CPUS; i++) {
>>          monitor_printf(mon, "per-cpu %d: pending 0x%08x\n", i,
>> @@ -220,7 +223,7 @@ void slavio_pic_info(Monitor *mon, DeviceState *dev)
>>                     s->intregm_pending, s->intregm_disabled);
>>   }
>>
>> -void slavio_irq_info(Monitor *mon, DeviceState *dev)
>> +void slavio_irq_info(Monitor *mon)
>>   {
>>   #ifndef DEBUG_IRQ_COUNT
>>      monitor_printf(mon, "irq statistic code not compiled.\n");
>> @@ -230,7 +233,10 @@ void slavio_irq_info(Monitor *mon, DeviceState *dev)
>>      int i;
>>      int64_t count;
>>
>> -    sd = sysbus_from_qdev(dev);
>> +    if (!slavio_intctl) {
>> +        return;
>> +    }
>> +    sd = sysbus_from_qdev(slavio_intctl);
>>      s = FROM_SYSBUS(SLAVIO_INTCTLState, sd);
>>      monitor_printf(mon, "IRQ statistics:\n");
>>      for (i = 0; i<  32; i++) {
>> diff --git a/hw/sun4m.c b/hw/sun4m.c
>> index dcaed38..589b505 100644
>> --- a/hw/sun4m.c
>> +++ b/hw/sun4m.c
>> @@ -135,6 +135,8 @@ struct sun4c_hwdef {
>>      uint8_t nvram_machine_id;
>>   };
>>
>> +DeviceState *slavio_intctl;
>
> Instead of adding new global variables, could you add a registration
> mechanism instead to pass the DeviceState used by the handler?

Actually, I don't want to over-design this rather useless legacy monitor 
command, rather completely remove it once device_show is merged. This 
patch is just an intermediate step to enable moving i8259 to hwlib.

Jan
Blue Swirl - Sept. 29, 2011, 7:29 p.m.
On Wed, Sep 28, 2011 at 9:26 PM, Jan Kiszka <jan.kiszka@web.de> wrote:
> On 2011-09-28 20:19, Blue Swirl wrote:
>>
>> On Wed, Sep 28, 2011 at 11:01 AM, Jan Kiszka<jan.kiszka@siemens.com>
>>  wrote:
>>>
>>> Signed-off-by: Jan Kiszka<jan.kiszka@siemens.com>
>>> ---
>>>  hw/an5206.c             |   10 ----------
>>>  hw/arm_pic.c            |   11 -----------
>>>  hw/cris_pic_cpu.c       |    6 ------
>>>  hw/etraxfs.h            |    1 +
>>>  hw/lm32_pic.c           |    4 ++--
>>>  hw/lm32_pic.h           |    3 +++
>>>  hw/microblaze_pic_cpu.c |    6 ------
>>>  hw/s390-virtio.c        |   11 -----------
>>>  hw/shix.c               |   11 -----------
>>>  hw/slavio_intctl.c      |   14 ++++++++++----
>>>  hw/sun4m.c              |   16 ++--------------
>>>  hw/sun4m.h              |    6 ++++--
>>>  hw/sun4u.c              |    8 --------
>>>  hw/xtensa_pic.c         |   10 ----------
>>>  monitor.c               |   21 +++++++++++++++++++++
>>>  15 files changed, 43 insertions(+), 95 deletions(-)
>>>
>>> diff --git a/hw/an5206.c b/hw/an5206.c
>>> index 481ae60..3fe1f00 100644
>>> --- a/hw/an5206.c
>>> +++ b/hw/an5206.c
>>> @@ -7,7 +7,6 @@
>>>  */
>>>
>>>  #include "hw.h"
>>> -#include "pc.h"
>>>  #include "mcf.h"
>>>  #include "boards.h"
>>>  #include "loader.h"
>>> @@ -18,15 +17,6 @@
>>>  #define AN5206_MBAR_ADDR 0x10000000
>>>  #define AN5206_RAMBAR_ADDR 0x20000000
>>>
>>> -/* Stub functions for hardware that doesn't exist.  */
>>> -void pic_info(Monitor *mon)
>>> -{
>>> -}
>>> -
>>> -void irq_info(Monitor *mon)
>>> -{
>>> -}
>>> -
>>>  /* Board init.  */
>>>
>>>  static void an5206_init(ram_addr_t ram_size,
>>> diff --git a/hw/arm_pic.c b/hw/arm_pic.c
>>> index 985148a..4e63845 100644
>>> --- a/hw/arm_pic.c
>>> +++ b/hw/arm_pic.c
>>> @@ -8,19 +8,8 @@
>>>  */
>>>
>>>  #include "hw.h"
>>> -#include "pc.h"
>>>  #include "arm-misc.h"
>>>
>>> -/* Stub functions for hardware that doesn't exist.  */
>>> -void pic_info(Monitor *mon)
>>> -{
>>> -}
>>> -
>>> -void irq_info(Monitor *mon)
>>> -{
>>> -}
>>> -
>>> -
>>>  /* Input 0 is IRQ and input 1 is FIQ.  */
>>>  static void arm_pic_cpu_handler(void *opaque, int irq, int level)
>>>  {
>>> diff --git a/hw/cris_pic_cpu.c b/hw/cris_pic_cpu.c
>>> index 7f1e4ab..06ae484 100644
>>> --- a/hw/cris_pic_cpu.c
>>> +++ b/hw/cris_pic_cpu.c
>>> @@ -24,16 +24,10 @@
>>>
>>>  #include "sysbus.h"
>>>  #include "hw.h"
>>> -#include "pc.h"
>>>  #include "etraxfs.h"
>>>
>>>  #define D(x)
>>>
>>> -void pic_info(Monitor *mon)
>>> -{}
>>> -void irq_info(Monitor *mon)
>>> -{}
>>> -
>>>  static void cris_pic_cpu_handler(void *opaque, int irq, int level)
>>>  {
>>>     CPUState *env = (CPUState *)opaque;
>>> diff --git a/hw/etraxfs.h b/hw/etraxfs.h
>>> index 1554b0b..24e8fd8 100644
>>> --- a/hw/etraxfs.h
>>> +++ b/hw/etraxfs.h
>>> @@ -22,6 +22,7 @@
>>>  * THE SOFTWARE.
>>>  */
>>>
>>> +#include "net.h"
>>>  #include "etraxfs_dma.h"
>>>
>>>  qemu_irq *cris_pic_init_cpu(CPUState *env);
>>> diff --git a/hw/lm32_pic.c b/hw/lm32_pic.c
>>> index 02941a7..8dd0050 100644
>>> --- a/hw/lm32_pic.c
>>> +++ b/hw/lm32_pic.c
>>> @@ -39,7 +39,7 @@ struct LM32PicState {
>>>  typedef struct LM32PicState LM32PicState;
>>>
>>>  static LM32PicState *pic;
>>> -void pic_info(Monitor *mon)
>>> +void lm32_do_pic_info(Monitor *mon)
>>>  {
>>>     if (pic == NULL) {
>>>         return;
>>> @@ -49,7 +49,7 @@ void pic_info(Monitor *mon)
>>>             pic->im, pic->ip, pic->irq_state);
>>>  }
>>>
>>> -void irq_info(Monitor *mon)
>>> +void lm32_irq_info(Monitor *mon)
>>>  {
>>>     int i;
>>>     uint32_t count;
>>> diff --git a/hw/lm32_pic.h b/hw/lm32_pic.h
>>> index e6479b8..14456f3 100644
>>> --- a/hw/lm32_pic.h
>>> +++ b/hw/lm32_pic.h
>>> @@ -8,4 +8,7 @@ uint32_t lm32_pic_get_im(DeviceState *d);
>>>  void lm32_pic_set_ip(DeviceState *d, uint32_t ip);
>>>  void lm32_pic_set_im(DeviceState *d, uint32_t im);
>>>
>>> +void lm32_do_pic_info(Monitor *mon);
>>> +void lm32_irq_info(Monitor *mon);
>>> +
>>>  #endif /* QEMU_HW_LM32_PIC_H */
>>> diff --git a/hw/microblaze_pic_cpu.c b/hw/microblaze_pic_cpu.c
>>> index 9ad48b4..8b5623c 100644
>>> --- a/hw/microblaze_pic_cpu.c
>>> +++ b/hw/microblaze_pic_cpu.c
>>> @@ -23,16 +23,10 @@
>>>  */
>>>
>>>  #include "hw.h"
>>> -#include "pc.h"
>>>  #include "microblaze_pic_cpu.h"
>>>
>>>  #define D(x)
>>>
>>> -void pic_info(Monitor *mon)
>>> -{}
>>> -void irq_info(Monitor *mon)
>>> -{}
>>> -
>>>  static void microblaze_pic_cpu_handler(void *opaque, int irq, int level)
>>>  {
>>>     CPUState *env = (CPUState *)opaque;
>>> diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c
>>> index acbf026..778cffe 100644
>>> --- a/hw/s390-virtio.c
>>> +++ b/hw/s390-virtio.c
>>> @@ -62,17 +62,6 @@
>>>  static VirtIOS390Bus *s390_bus;
>>>  static CPUState **ipi_states;
>>>
>>> -void irq_info(Monitor *mon);
>>> -void pic_info(Monitor *mon);
>>> -
>>> -void irq_info(Monitor *mon)
>>> -{
>>> -}
>>> -
>>> -void pic_info(Monitor *mon)
>>> -{
>>> -}
>>> -
>>>  CPUState *s390_cpu_addr2state(uint16_t cpu_addr)
>>>  {
>>>     if (cpu_addr>= smp_cpus) {
>>> diff --git a/hw/shix.c b/hw/shix.c
>>> index 638bf16..dbf4764 100644
>>> --- a/hw/shix.c
>>> +++ b/hw/shix.c
>>> @@ -28,7 +28,6 @@
>>>    More information in target-sh4/README.sh4
>>>  */
>>>  #include "hw.h"
>>> -#include "pc.h"
>>>  #include "sh.h"
>>>  #include "sysemu.h"
>>>  #include "boards.h"
>>> @@ -37,16 +36,6 @@
>>>  #define BIOS_FILENAME "shix_bios.bin"
>>>  #define BIOS_ADDRESS 0xA0000000
>>>
>>> -void irq_info(Monitor *mon)
>>> -{
>>> -    /* XXXXX */
>>> -}
>>> -
>>> -void pic_info(Monitor *mon)
>>> -{
>>> -    /* XXXXX */
>>> -}
>>> -
>>>  static void shix_init(ram_addr_t ram_size,
>>>                const char *boot_device,
>>>               const char *kernel_filename, const char *kernel_cmdline,
>>> diff --git a/hw/slavio_intctl.c b/hw/slavio_intctl.c
>>> index 329c251..2d1dc12 100644
>>> --- a/hw/slavio_intctl.c
>>> +++ b/hw/slavio_intctl.c
>>> @@ -204,13 +204,16 @@ static CPUWriteMemoryFunc * const
>>> slavio_intctlm_mem_write[3] = {
>>>     slavio_intctlm_mem_writel,
>>>  };
>>>
>>> -void slavio_pic_info(Monitor *mon, DeviceState *dev)
>>> +void slavio_pic_info(Monitor *mon)
>>>  {
>>>     SysBusDevice *sd;
>>>     SLAVIO_INTCTLState *s;
>>>     int i;
>>>
>>> -    sd = sysbus_from_qdev(dev);
>>> +    if (!slavio_intctl) {
>>> +        return;
>>> +    }
>>> +    sd = sysbus_from_qdev(slavio_intctl);
>>>     s = FROM_SYSBUS(SLAVIO_INTCTLState, sd);
>>>     for (i = 0; i<  MAX_CPUS; i++) {
>>>         monitor_printf(mon, "per-cpu %d: pending 0x%08x\n", i,
>>> @@ -220,7 +223,7 @@ void slavio_pic_info(Monitor *mon, DeviceState *dev)
>>>                    s->intregm_pending, s->intregm_disabled);
>>>  }
>>>
>>> -void slavio_irq_info(Monitor *mon, DeviceState *dev)
>>> +void slavio_irq_info(Monitor *mon)
>>>  {
>>>  #ifndef DEBUG_IRQ_COUNT
>>>     monitor_printf(mon, "irq statistic code not compiled.\n");
>>> @@ -230,7 +233,10 @@ void slavio_irq_info(Monitor *mon, DeviceState *dev)
>>>     int i;
>>>     int64_t count;
>>>
>>> -    sd = sysbus_from_qdev(dev);
>>> +    if (!slavio_intctl) {
>>> +        return;
>>> +    }
>>> +    sd = sysbus_from_qdev(slavio_intctl);
>>>     s = FROM_SYSBUS(SLAVIO_INTCTLState, sd);
>>>     monitor_printf(mon, "IRQ statistics:\n");
>>>     for (i = 0; i<  32; i++) {
>>> diff --git a/hw/sun4m.c b/hw/sun4m.c
>>> index dcaed38..589b505 100644
>>> --- a/hw/sun4m.c
>>> +++ b/hw/sun4m.c
>>> @@ -135,6 +135,8 @@ struct sun4c_hwdef {
>>>     uint8_t nvram_machine_id;
>>>  };
>>>
>>> +DeviceState *slavio_intctl;
>>
>> Instead of adding new global variables, could you add a registration
>> mechanism instead to pass the DeviceState used by the handler?
>
> Actually, I don't want to over-design this rather useless legacy monitor
> command, rather completely remove it once device_show is merged. This patch
> is just an intermediate step to enable moving i8259 to hwlib.

Fine, but then don't introduce the global variable but leave it static
at sun4m.c.

Patch

diff --git a/hw/an5206.c b/hw/an5206.c
index 481ae60..3fe1f00 100644
--- a/hw/an5206.c
+++ b/hw/an5206.c
@@ -7,7 +7,6 @@ 
  */
 
 #include "hw.h"
-#include "pc.h"
 #include "mcf.h"
 #include "boards.h"
 #include "loader.h"
@@ -18,15 +17,6 @@ 
 #define AN5206_MBAR_ADDR 0x10000000
 #define AN5206_RAMBAR_ADDR 0x20000000
 
-/* Stub functions for hardware that doesn't exist.  */
-void pic_info(Monitor *mon)
-{
-}
-
-void irq_info(Monitor *mon)
-{
-}
-
 /* Board init.  */
 
 static void an5206_init(ram_addr_t ram_size,
diff --git a/hw/arm_pic.c b/hw/arm_pic.c
index 985148a..4e63845 100644
--- a/hw/arm_pic.c
+++ b/hw/arm_pic.c
@@ -8,19 +8,8 @@ 
  */
 
 #include "hw.h"
-#include "pc.h"
 #include "arm-misc.h"
 
-/* Stub functions for hardware that doesn't exist.  */
-void pic_info(Monitor *mon)
-{
-}
-
-void irq_info(Monitor *mon)
-{
-}
-
-
 /* Input 0 is IRQ and input 1 is FIQ.  */
 static void arm_pic_cpu_handler(void *opaque, int irq, int level)
 {
diff --git a/hw/cris_pic_cpu.c b/hw/cris_pic_cpu.c
index 7f1e4ab..06ae484 100644
--- a/hw/cris_pic_cpu.c
+++ b/hw/cris_pic_cpu.c
@@ -24,16 +24,10 @@ 
 
 #include "sysbus.h"
 #include "hw.h"
-#include "pc.h"
 #include "etraxfs.h"
 
 #define D(x)
 
-void pic_info(Monitor *mon)
-{}
-void irq_info(Monitor *mon)
-{}
-
 static void cris_pic_cpu_handler(void *opaque, int irq, int level)
 {
     CPUState *env = (CPUState *)opaque;
diff --git a/hw/etraxfs.h b/hw/etraxfs.h
index 1554b0b..24e8fd8 100644
--- a/hw/etraxfs.h
+++ b/hw/etraxfs.h
@@ -22,6 +22,7 @@ 
  * THE SOFTWARE.
  */
 
+#include "net.h"
 #include "etraxfs_dma.h"
 
 qemu_irq *cris_pic_init_cpu(CPUState *env);
diff --git a/hw/lm32_pic.c b/hw/lm32_pic.c
index 02941a7..8dd0050 100644
--- a/hw/lm32_pic.c
+++ b/hw/lm32_pic.c
@@ -39,7 +39,7 @@  struct LM32PicState {
 typedef struct LM32PicState LM32PicState;
 
 static LM32PicState *pic;
-void pic_info(Monitor *mon)
+void lm32_do_pic_info(Monitor *mon)
 {
     if (pic == NULL) {
         return;
@@ -49,7 +49,7 @@  void pic_info(Monitor *mon)
             pic->im, pic->ip, pic->irq_state);
 }
 
-void irq_info(Monitor *mon)
+void lm32_irq_info(Monitor *mon)
 {
     int i;
     uint32_t count;
diff --git a/hw/lm32_pic.h b/hw/lm32_pic.h
index e6479b8..14456f3 100644
--- a/hw/lm32_pic.h
+++ b/hw/lm32_pic.h
@@ -8,4 +8,7 @@  uint32_t lm32_pic_get_im(DeviceState *d);
 void lm32_pic_set_ip(DeviceState *d, uint32_t ip);
 void lm32_pic_set_im(DeviceState *d, uint32_t im);
 
+void lm32_do_pic_info(Monitor *mon);
+void lm32_irq_info(Monitor *mon);
+
 #endif /* QEMU_HW_LM32_PIC_H */
diff --git a/hw/microblaze_pic_cpu.c b/hw/microblaze_pic_cpu.c
index 9ad48b4..8b5623c 100644
--- a/hw/microblaze_pic_cpu.c
+++ b/hw/microblaze_pic_cpu.c
@@ -23,16 +23,10 @@ 
  */
 
 #include "hw.h"
-#include "pc.h"
 #include "microblaze_pic_cpu.h"
 
 #define D(x)
 
-void pic_info(Monitor *mon)
-{}
-void irq_info(Monitor *mon)
-{}
-
 static void microblaze_pic_cpu_handler(void *opaque, int irq, int level)
 {
     CPUState *env = (CPUState *)opaque;
diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c
index acbf026..778cffe 100644
--- a/hw/s390-virtio.c
+++ b/hw/s390-virtio.c
@@ -62,17 +62,6 @@ 
 static VirtIOS390Bus *s390_bus;
 static CPUState **ipi_states;
 
-void irq_info(Monitor *mon);
-void pic_info(Monitor *mon);
-
-void irq_info(Monitor *mon)
-{
-}
-
-void pic_info(Monitor *mon)
-{
-}
-
 CPUState *s390_cpu_addr2state(uint16_t cpu_addr)
 {
     if (cpu_addr >= smp_cpus) {
diff --git a/hw/shix.c b/hw/shix.c
index 638bf16..dbf4764 100644
--- a/hw/shix.c
+++ b/hw/shix.c
@@ -28,7 +28,6 @@ 
    More information in target-sh4/README.sh4
 */
 #include "hw.h"
-#include "pc.h"
 #include "sh.h"
 #include "sysemu.h"
 #include "boards.h"
@@ -37,16 +36,6 @@ 
 #define BIOS_FILENAME "shix_bios.bin"
 #define BIOS_ADDRESS 0xA0000000
 
-void irq_info(Monitor *mon)
-{
-    /* XXXXX */
-}
-
-void pic_info(Monitor *mon)
-{
-    /* XXXXX */
-}
-
 static void shix_init(ram_addr_t ram_size,
                const char *boot_device,
 	       const char *kernel_filename, const char *kernel_cmdline,
diff --git a/hw/slavio_intctl.c b/hw/slavio_intctl.c
index 329c251..2d1dc12 100644
--- a/hw/slavio_intctl.c
+++ b/hw/slavio_intctl.c
@@ -204,13 +204,16 @@  static CPUWriteMemoryFunc * const slavio_intctlm_mem_write[3] = {
     slavio_intctlm_mem_writel,
 };
 
-void slavio_pic_info(Monitor *mon, DeviceState *dev)
+void slavio_pic_info(Monitor *mon)
 {
     SysBusDevice *sd;
     SLAVIO_INTCTLState *s;
     int i;
 
-    sd = sysbus_from_qdev(dev);
+    if (!slavio_intctl) {
+        return;
+    }
+    sd = sysbus_from_qdev(slavio_intctl);
     s = FROM_SYSBUS(SLAVIO_INTCTLState, sd);
     for (i = 0; i < MAX_CPUS; i++) {
         monitor_printf(mon, "per-cpu %d: pending 0x%08x\n", i,
@@ -220,7 +223,7 @@  void slavio_pic_info(Monitor *mon, DeviceState *dev)
                    s->intregm_pending, s->intregm_disabled);
 }
 
-void slavio_irq_info(Monitor *mon, DeviceState *dev)
+void slavio_irq_info(Monitor *mon)
 {
 #ifndef DEBUG_IRQ_COUNT
     monitor_printf(mon, "irq statistic code not compiled.\n");
@@ -230,7 +233,10 @@  void slavio_irq_info(Monitor *mon, DeviceState *dev)
     int i;
     int64_t count;
 
-    sd = sysbus_from_qdev(dev);
+    if (!slavio_intctl) {
+        return;
+    }
+    sd = sysbus_from_qdev(slavio_intctl);
     s = FROM_SYSBUS(SLAVIO_INTCTLState, sd);
     monitor_printf(mon, "IRQ statistics:\n");
     for (i = 0; i < 32; i++) {
diff --git a/hw/sun4m.c b/hw/sun4m.c
index dcaed38..589b505 100644
--- a/hw/sun4m.c
+++ b/hw/sun4m.c
@@ -135,6 +135,8 @@  struct sun4c_hwdef {
     uint8_t nvram_machine_id;
 };
 
+DeviceState *slavio_intctl;
+
 int DMA_get_channel_mode (int nchan)
 {
     return 0;
@@ -214,20 +216,6 @@  static void nvram_init(M48t59State *nvram, uint8_t *macaddr,
         m48t59_write(nvram, i, image[i]);
 }
 
-static DeviceState *slavio_intctl;
-
-void pic_info(Monitor *mon)
-{
-    if (slavio_intctl)
-        slavio_pic_info(mon, slavio_intctl);
-}
-
-void irq_info(Monitor *mon)
-{
-    if (slavio_intctl)
-        slavio_irq_info(mon, slavio_intctl);
-}
-
 void cpu_check_irqs(CPUState *env)
 {
     if (env->pil_in && (env->interrupt_index == 0 ||
diff --git a/hw/sun4m.h b/hw/sun4m.h
index ce97ee5..39a73aa 100644
--- a/hw/sun4m.h
+++ b/hw/sun4m.h
@@ -3,6 +3,8 @@ 
 
 #include "qemu-common.h"
 
+extern DeviceState *slavio_intctl;
+
 /* Devices used by sparc32 system.  */
 
 /* iommu.c */
@@ -23,8 +25,8 @@  static inline void sparc_iommu_memory_write(void *opaque,
 }
 
 /* slavio_intctl.c */
-void slavio_pic_info(Monitor *mon, DeviceState *dev);
-void slavio_irq_info(Monitor *mon, DeviceState *dev);
+void slavio_pic_info(Monitor *mon);
+void slavio_irq_info(Monitor *mon);
 
 /* sun4c_intctl.c */
 void sun4c_pic_info(Monitor *mon, void *opaque);
diff --git a/hw/sun4u.c b/hw/sun4u.c
index fbef350..568819d 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -242,14 +242,6 @@  static unsigned long sun4u_load_kernel(const char *kernel_filename,
     return kernel_size;
 }
 
-void pic_info(Monitor *mon)
-{
-}
-
-void irq_info(Monitor *mon)
-{
-}
-
 void cpu_check_irqs(CPUState *env)
 {
     uint32_t pil = env->pil_in |
diff --git a/hw/xtensa_pic.c b/hw/xtensa_pic.c
index 3033ae2..9357684 100644
--- a/hw/xtensa_pic.c
+++ b/hw/xtensa_pic.c
@@ -26,19 +26,9 @@ 
  */
 
 #include "hw.h"
-#include "pc.h"
 #include "qemu-log.h"
 #include "qemu-timer.h"
 
-/* Stub functions for hardware that doesn't exist.  */
-void pic_info(Monitor *mon)
-{
-}
-
-void irq_info(Monitor *mon)
-{
-}
-
 void xtensa_advance_ccount(CPUState *env, uint32_t d)
 {
     uint32_t old_ccount = env->sregs[CCOUNT];
diff --git a/monitor.c b/monitor.c
index 8ec2c5e..418161c 100644
--- a/monitor.c
+++ b/monitor.c
@@ -64,6 +64,12 @@ 
 #include "trace/control.h"
 #include "ui/qemu-spice.h"
 
+/* for pic/irq_info */
+#if defined(TARGET_SPARC)
+#include "hw/sun4m.h"
+#endif
+#include "hw/lm32_pic.h"
+
 //#define DEBUG
 //#define DEBUG_COMPLETION
 
@@ -2937,20 +2943,35 @@  static const mon_cmd_t info_cmds[] = {
         .help       = "show the command line history",
         .mhandler.info = do_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.info = slavio_irq_info,
+#elif defined(TARGET_LM32)
+        .mhandler.info = lm32_irq_info,
+#else
         .mhandler.info = irq_info,
+#endif
     },
     {
         .name       = "pic",
         .args_type  = "",
         .params     = "",
         .help       = "show i8259 (PIC) state",
+#ifdef TARGET_SPARC
+        .mhandler.info = slavio_pic_info,
+#elif defined(TARGET_LM32)
+        .mhandler.info = lm32_do_pic_info,
+#else
         .mhandler.info = pic_info,
+#endif
     },
+#endif
     {
         .name       = "pci",
         .args_type  = "",