Commit 4a0fb71e67df4774d79eb788f0d1bd7a78801e6d

Authored by bellard
1 parent 274da6b2

irq statistics code (initial patch by Jocelyn Mayer)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@840 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 3 changed files with 34 additions and 4 deletions
hw/i8259.c
@@ -27,6 +27,7 @@ @@ -27,6 +27,7 @@
27 //#define DEBUG_PIC 27 //#define DEBUG_PIC
28 28
29 //#define DEBUG_IRQ_LATENCY 29 //#define DEBUG_IRQ_LATENCY
  30 +//#define DEBUG_IRQ_COUNT
30 31
31 typedef struct PicState { 32 typedef struct PicState {
32 uint8_t last_irr; /* edge detection */ 33 uint8_t last_irr; /* edge detection */
@@ -50,6 +51,13 @@ typedef struct PicState { @@ -50,6 +51,13 @@ typedef struct PicState {
50 /* 0 is master pic, 1 is slave pic */ 51 /* 0 is master pic, 1 is slave pic */
51 static PicState pics[2]; 52 static PicState pics[2];
52 53
  54 +#if defined(DEBUG_PIC) || defined (DEBUG_IRQ_COUNT)
  55 +static int irq_level[16];
  56 +#endif
  57 +#ifdef DEBUG_IRQ_COUNT
  58 +static uint64_t irq_count[16];
  59 +#endif
  60 +
53 /* set irq level. If an edge is detected, then the IRR is set to 1 */ 61 /* set irq level. If an edge is detected, then the IRR is set to 1 */
54 static inline void pic_set_irq1(PicState *s, int irq, int level) 62 static inline void pic_set_irq1(PicState *s, int irq, int level)
55 { 63 {
@@ -147,16 +155,19 @@ static void pic_update_irq(void) @@ -147,16 +155,19 @@ static void pic_update_irq(void)
147 #ifdef DEBUG_IRQ_LATENCY 155 #ifdef DEBUG_IRQ_LATENCY
148 int64_t irq_time[16]; 156 int64_t irq_time[16];
149 #endif 157 #endif
150 -#if defined(DEBUG_PIC)  
151 -int irq_level[16];  
152 -#endif  
153 158
154 void pic_set_irq(int irq, int level) 159 void pic_set_irq(int irq, int level)
155 { 160 {
156 -#if defined(DEBUG_PIC) 161 +#if defined(DEBUG_PIC) || defined(DEBUG_IRQ_COUNT)
157 if (level != irq_level[irq]) { 162 if (level != irq_level[irq]) {
  163 +#if defined(DEBUG_PIC)
158 printf("pic_set_irq: irq=%d level=%d\n", irq, level); 164 printf("pic_set_irq: irq=%d level=%d\n", irq, level);
  165 +#endif
159 irq_level[irq] = level; 166 irq_level[irq] = level;
  167 +#ifdef DEBUG_IRQ_COUNT
  168 + if (level == 1)
  169 + irq_count[irq]++;
  170 +#endif
160 } 171 }
161 #endif 172 #endif
162 #ifdef DEBUG_IRQ_LATENCY 173 #ifdef DEBUG_IRQ_LATENCY
@@ -463,6 +474,22 @@ void pic_info(void) @@ -463,6 +474,22 @@ void pic_info(void)
463 } 474 }
464 } 475 }
465 476
  477 +void irq_info(void)
  478 +{
  479 +#ifndef DEBUG_IRQ_COUNT
  480 + term_printf("irq statistic code not compiled.\n");
  481 +#else
  482 + int i;
  483 + int64_t count;
  484 +
  485 + term_printf("IRQ statistics:\n");
  486 + for (i = 0; i < 16; i++) {
  487 + count = irq_count[i];
  488 + if (count > 0)
  489 + term_printf("%2d: %lld\n", i, count);
  490 + }
  491 +#endif
  492 +}
466 493
467 void pic_init(void) 494 void pic_init(void)
468 { 495 {
monitor.c
@@ -523,6 +523,8 @@ static term_cmd_t info_cmds[] = { @@ -523,6 +523,8 @@ static term_cmd_t info_cmds[] = {
523 "", "show the cpu registers" }, 523 "", "show the cpu registers" },
524 { "history", "", do_info_history, 524 { "history", "", do_info_history,
525 "", "show the command line history", }, 525 "", "show the command line history", },
  526 + { "irq", "", irq_info,
  527 + "", "show the interrupts statistics (if available)", },
526 { "pic", "", pic_info, 528 { "pic", "", pic_info,
527 "", "show i8259 (PIC) state", }, 529 "", "show i8259 (PIC) state", },
528 { "pci", "", pci_info, 530 { "pci", "", pci_info,
@@ -544,6 +544,7 @@ void pic_set_irq(int irq, int level); @@ -544,6 +544,7 @@ void pic_set_irq(int irq, int level);
544 void pic_init(void); 544 void pic_init(void);
545 uint32_t pic_intack_read(CPUState *env); 545 uint32_t pic_intack_read(CPUState *env);
546 void pic_info(void); 546 void pic_info(void);
  547 +void irq_info(void);
547 548
548 /* i8254.c */ 549 /* i8254.c */
549 550