----- "Mika Westerberg" <ext-mika.1.westerberg@xxxxxxxxx> wrote: > There is no reason for having custom IRQ dumping function on ARM > and having such causes maintenance burden when the kernel IRQ > structures change. Right -- I see that the current custom version already fails as of 2.6.36. > > So convert ARM to use generic_dump_irq() and remove all the now > unused ARM specific IRQ dumping code. > > Signed-off-by: Mika Westerberg <ext-mika.1.westerberg@xxxxxxxxx> > Cc: jan.karlsson@xxxxxxxxxxxxxxxx > Cc: thomas.fange@xxxxxxxxxxxxxxxx > --- > This patch applies on top of my 2 previous patches (the ones you > already queued). That cleans things up nicely -- queued for the next release. Thanks, Dave > arm.c | 326 > +---------------------------------------------------------------- > 1 files changed, 3 insertions(+), 323 deletions(-) > > diff --git a/arm.c b/arm.c > index 751fe00..4e6ab3d 100644 > --- a/arm.c > +++ b/arm.c > @@ -52,8 +52,6 @@ static ulong arm_get_task_pgd(ulong); > static void arm_cmd_mach(void); > static void arm_display_machine_stats(void); > static int arm_get_smp_cpus(void); > -static void print_irq_member(char *, ulong, char *); > -static void arm_dump_irq(int); > static void arm_init_machspec(void); > > static struct line_number_hook arm_line_number_hooks[]; > @@ -237,22 +235,15 @@ arm_init(int when) > machdep->line_number_hooks = arm_line_number_hooks; > machdep->value_to_symbol = generic_machdep_value_to_symbol; > machdep->init_kernel_pgd = NULL; > - > - if (symbol_exists("irq_desc")) > - machdep->dump_irq = arm_dump_irq; > + machdep->dump_irq = generic_dump_irq; > > arm_init_machspec(); > break; > > case POST_GDB: > - if (symbol_exists("irq_desc")) { > + if (symbol_exists("irq_desc")) > ARRAY_LENGTH_INIT(machdep->nr_irqs, irq_desc, > "irq_desc", NULL, 0); > - if (MEMBER_EXISTS("irq_desc", "name")) > - MEMBER_OFFSET_INIT(irq_desc_t_name, "irq_desc", > - "name"); > - } > - > /* > * Registers for idle threads are saved in > * thread_info.cpu_context. > @@ -343,10 +334,7 @@ arm_dump_machdep_table(ulong arg) > fprintf(fp, " uvtop: arm_uvtop()\n"); > fprintf(fp, " kvtop: arm_kvtop()\n"); > fprintf(fp, " get_task_pgd: arm_get_task_pgd()\n"); > - if (symbol_exists("irq_desc")) > - fprintf(fp, " dump_irq: arm_dump_irq()\n"); > - else > - fprintf(fp, " dump_irq: NULL\n"); > + fprintf(fp, " dump_irq: generic_dump_irq()\n"); > fprintf(fp, " get_stack_frame: arm_get_stack_frame()\n"); > fprintf(fp, " get_stackbase: generic_get_stackbase()\n"); > fprintf(fp, " get_stacktop: generic_get_stacktop()\n"); > @@ -1409,314 +1397,6 @@ arm_get_smp_cpus(void) > return get_cpus_online(); > } > > -static void > -print_irq_member(char *irq, ulong val, char *ind) > -{ > - char buf[BUFSIZE]; > - ulong val2; > - > - fprintf(fp, "%17s: %8lx ", irq, val); > - if (val) { > - if (is_kernel_text(val)) > - fprintf(fp, "<%s>", value_to_symstr(val, buf, 0)); > - else if (readmem(val, KVADDR, &val2, > - sizeof(ulong), ind, RETURN_ON_ERROR|QUIET) && > - is_kernel_text(val2)) > - fprintf(fp, "<%s>", value_to_symstr(val2, buf, 0)); > - } > - fprintf(fp, "\n"); > -} > - > -/* > - * Do the work for cmd_irq(). > - */ > -static void > -arm_dump_irq(int irq) > -{ > - struct datatype_member datatype_member, *dm; > - ulong irq_desc_addr; > - ulong irq_desc_ptr; > - long len; > - char buf[BUFSIZE]; > - int type, status, depth, others; > - ulong handler, action, value; > - ulong tmp1; > - > - dm = &datatype_member; > - > - if (!VALID_STRUCT(irq_desc_t)) > - error(FATAL, "cannot determine size of irq_desc\n"); > - len = SIZE(irq_desc_t); > - > - if (symbol_exists("irq_desc")) > - irq_desc_addr = symbol_value("irq_desc") + (len * irq); > - else if (symbol_exists("_irq_desc")) > - irq_desc_addr = symbol_value("_irq_desc") + (len * irq); > - else if (symbol_exists("irq_desc_ptrs")) { > - get_symbol_data("irq_desc_ptrs", sizeof(void *), &irq_desc_ptr); > - irq_desc_ptr += (irq * sizeof(void *)); > - readmem(irq_desc_ptr, KVADDR, &irq_desc_addr, > - sizeof(void *), "irq_desc_ptrs entry", > - FAULT_ON_ERROR); > - if (!irq_desc_addr) { > - fprintf(fp, " IRQ: %d (unused)\n\n", irq); > - return; > - } > - } else { > - irq_desc_addr = 0; > - error(FATAL, > - "neither irq_desc, _irq_desc, nor irq_desc_ptrs " > - "symbols exist\n"); > - } > - > - readmem(irq_desc_addr + OFFSET(irq_desc_t_status), KVADDR, > &status, > - sizeof(int), "irq_desc entry", FAULT_ON_ERROR); > - if (VALID_MEMBER(irq_desc_t_handler)) > - readmem(irq_desc_addr + OFFSET(irq_desc_t_handler), KVADDR, > - &handler, sizeof(long), "irq_desc entry", > - FAULT_ON_ERROR); > - else if (VALID_MEMBER(irq_desc_t_chip)) > - readmem(irq_desc_addr + OFFSET(irq_desc_t_chip), KVADDR, > - &handler, sizeof(long), "irq_desc entry", > - FAULT_ON_ERROR); > - readmem(irq_desc_addr + OFFSET(irq_desc_t_action), KVADDR, > &action, > - sizeof(long), "irq_desc entry", FAULT_ON_ERROR); > - readmem(irq_desc_addr + OFFSET(irq_desc_t_depth), KVADDR, > &depth, > - sizeof(int), "irq_desc entry", FAULT_ON_ERROR); > - > - if (!action && (handler == (ulong)pc->curcmd_private)) > - return; > - > - fprintf(fp, " IRQ: %d\n", irq); > - fprintf(fp, "ADDRESS: %08lx\n", irq_desc_addr); > - > - if (VALID_MEMBER(irq_desc_t_name)) { > - readmem(irq_desc_addr+OFFSET(irq_desc_t_name), > - KVADDR, &tmp1, sizeof(void *), > - "irq_desc name", FAULT_ON_ERROR); > - if (tmp1) { > - fprintf(fp, " NAME: %lx", tmp1); > - BZERO(buf, BUFSIZE); > - if (read_string(tmp1, buf, BUFSIZE-1)) > - fprintf(fp, " \"%s\"", buf); > - fprintf(fp, "\n"); > - } > - } > - > - type = status & IRQ_TYPE_SENSE_MASK; > - fprintf(fp, " TYPE: %x %s", type, type ? "(" : ""); > - others = 0; > - > - if ((type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) > - fprintf(fp, "%sEDGE_BOTH", others++ ? "|" : ""); > - else { > - if (type & IRQ_TYPE_EDGE_RISING) > - fprintf(fp, "%sEDGE_RISING", others++ ? "|" : ""); > - if (type & IRQ_TYPE_EDGE_FALLING) > - fprintf(fp, "%sEDGE_FALLING", others++ ? "|" : ""); > - } > - if (type & IRQ_TYPE_LEVEL_HIGH) > - fprintf(fp, "%sLEVEL_HIGH", others++ ? "|" : ""); > - if (type & IRQ_TYPE_LEVEL_LOW) > - fprintf(fp, "%sLEVEL_LOW", others++ ? "|" : ""); > - fprintf(fp, "%s\n", type ? ")" : ""); > - > - fprintf(fp, " PROBE: %s\n", status & IRQ_TYPE_PROBE ? "true" : > "false"); > - > - fprintf(fp, " STATUS: %x %s", status, status ? "(" : ""); > - others = 0; > - if (status & IRQ_INPROGRESS) { > - fprintf(fp, "IRQ_INPROGRESS"); > - others++; > - } > - if (status & IRQ_DISABLED) > - fprintf(fp, "%sIRQ_DISABLED", others++ ? "|" : ""); > - if (status & IRQ_PENDING) > - fprintf(fp, "%sIRQ_PENDING", others++ ? "|" : ""); > - if (status & IRQ_REPLAY) > - fprintf(fp, "%sIRQ_REPLAY", others++ ? "|" : ""); > - if (status & IRQ_AUTODETECT) > - fprintf(fp, "%sIRQ_AUTODETECT", others++ ? "|" : > ""); > - if (status & IRQ_WAITING) > - fprintf(fp, "%sIRQ_WAITING", others++ ? "|" : ""); > - if (status & IRQ_LEVEL) > - fprintf(fp, "%sIRQ_LEVEL", others++ ? "|" : ""); > - if (status & IRQ_MASKED) > - fprintf(fp, "%sIRQ_MASKED", others++ ? "|" : ""); > - > - if (status & IRQ_PER_CPU) > - fprintf(fp, "%sIRQ_PER_CPU", others++ ? "|" : ""); > - if (status & IRQ_NOPROBE) > - fprintf(fp, "%sIRQ_NOPROBE", others++ ? "|" : ""); > - if (status & IRQ_NOREQUEST) > - fprintf(fp, "%sIRQ_NOREQUEST", others++ ? "|" : ""); > - if (status & IRQ_NOAUTOEN) > - fprintf(fp, "%sIRQ_NOAUTOEN", others++ ? "|" : ""); > - if (status & IRQ_WAKEUP) > - fprintf(fp, "%sIRQ_WAKEUP", others++ ? "|" : ""); > - if (status & IRQ_MOVE_PENDING) > - fprintf(fp, "%sIRQ_MOVE_PENDING", others++ ? "|" : > ""); > - if (status & IRQ_NO_BALANCING) > - fprintf(fp, "%sIRQ_NO_BALANCING", others++ ? "|" : > ""); > - if (status & IRQ_SPURIOUS_DISABLED) > - fprintf(fp, "%sIRQ_SPURIOUS_DISABLED", others++ ? "|" > : ""); > - if (status & IRQ_MOVE_PCNTXT) > - fprintf(fp, "%sIRQ_MOVE_PCNTXT", others++ ? "|" : > ""); > - if (status & IRQ_AFFINITY_SET) > - fprintf(fp, "%sIRQ_AFFINITY_SET", others++ ? "|" : > ""); > - > - > - fprintf(fp, "%s\n", status ? ")" : ""); > - > - fprintf(fp, "HANDLER: %8lx ", handler); > - if (value_symbol(handler)) { > - pad_line(fp, VADDR_PRLEN == 8 ? VADDR_PRLEN+2 : VADDR_PRLEN-6, ' > '); > - fprintf(fp, "<%s>", value_symbol(handler)); > - } > - fprintf(fp, "\n"); > - > -#define CHECK_HANDLER_OPT_MEMBER_PRT(x) \ > - if (VALID_MEMBER(hw_interrupt_type_ ## x)) { \ > - readmem(handler+OFFSET(hw_interrupt_type_ ## x), KVADDR, \ > - &tmp1, sizeof(void *), "hw_interrupt_type " #x, \ > - FAULT_ON_ERROR); \ > - print_irq_member(#x, tmp1, #x " indirection"); \ > - } else if (VALID_MEMBER(irq_chip_ ## x)) { \ > - readmem(handler+OFFSET(irq_chip_ ## x),KVADDR, &tmp1, \ > - sizeof(void *), "irq_chip " #x, FAULT_ON_ERROR); \ > - print_irq_member(#x, tmp1, #x " indirection"); \ > - } > - > -#define CHECK_HANDLER_OPT_MEMBER(x) \ > - if (VALID_MEMBER(hw_interrupt_type_ ## x)) \ > - readmem(handler+OFFSET(hw_interrupt_type_ ## x), KVADDR, \ > - &tmp1, sizeof(void *), "hw_interrupt_type " #x, \ > - FAULT_ON_ERROR); \ > - else if (VALID_MEMBER(irq_chip_ ## x)) \ > - readmem(handler+OFFSET(irq_chip_ ## x),KVADDR, &tmp1, \ > - sizeof(void *), "irq_chip " #x, FAULT_ON_ERROR); \ > - > -#define CHECK_HANDLER_MEMBER_PRT(x,s1,s2) \ > - if (VALID_MEMBER(x)) { \ > - readmem(handler+OFFSET(x), KVADDR, &tmp1, sizeof(void *),\ > - s1, FAULT_ON_ERROR); \ > - print_irq_member(s2, tmp1, s2 " indirection"); \ > - } > - > - if (handler) { > - CHECK_HANDLER_OPT_MEMBER(typename); > - > - fprintf(fp, " typename: %lx ", tmp1); > - BZERO(buf, BUFSIZE); > - if (read_string(tmp1, buf, BUFSIZE-1)) > - fprintf(fp, "\"%s\"", buf); > - fprintf(fp, "\n"); > - > - CHECK_HANDLER_OPT_MEMBER(startup); > - > - print_irq_member("startup", tmp1, "startup indirection"); > - > - CHECK_HANDLER_OPT_MEMBER(shutdown); > - > - print_irq_member("shutdown", tmp1, "shutdown indirection"); > - > - CHECK_HANDLER_MEMBER_PRT(hw_interrupt_type_handle, > - "hw_interrupt_type handle", > - "handle"); > - > - CHECK_HANDLER_OPT_MEMBER(enable); > - > - print_irq_member("enable", tmp1, "enable indirection"); > - > - CHECK_HANDLER_OPT_MEMBER(disable); > - > - print_irq_member("disable", tmp1, "disable indirection"); > - > - CHECK_HANDLER_OPT_MEMBER(ack); > - > - print_irq_member("ack", tmp1, "ack indirection"); > - > - CHECK_HANDLER_MEMBER_PRT(irq_chip_mask, "irq_chip mask","mask"); > - > - CHECK_HANDLER_MEMBER_PRT(irq_chip_mask_ack, "irq_chip mask_ack", > - "mask_ack"); > - > - CHECK_HANDLER_MEMBER_PRT(irq_chip_unmask, "irq_chip unmask", > - "unmask"); > - > - CHECK_HANDLER_MEMBER_PRT(irq_chip_eoi,"irq_chip eoi","eoi"); > - > - CHECK_HANDLER_OPT_MEMBER_PRT(startup); > - > - CHECK_HANDLER_OPT_MEMBER_PRT(set_affinity); > - > - CHECK_HANDLER_MEMBER_PRT(irq_chip_retrigger, > - "irq_chip retrigger", "retrigger"); > - CHECK_HANDLER_MEMBER_PRT(irq_chip_set_type, > - "irq_chip set_type", "set_type"); > - CHECK_HANDLER_MEMBER_PRT(irq_chip_set_wake, > - "irq_chip set_wake", "set_wake"); > - } > - > -do_linked_action: > - > - fprintf(fp, " ACTION: "); > - if (value_symbol(action)) { > - fprintf(fp, "%lx ", action); > - pad_line(fp, VADDR_PRLEN == 8 ? > - VADDR_PRLEN+2 : VADDR_PRLEN - 6, ' '); > - fprintf(fp, "<%s>\n", value_symbol(action)); > - } else if (action) { > - fprintf(fp, "%8lx\n", action); > - } else { > - fprintf(fp, "(none)\n"); > - } > - > - if (action) { > - readmem(action+OFFSET(irqaction_handler), KVADDR, > - &tmp1, sizeof(void *), > - "irqaction handler", FAULT_ON_ERROR); > - > - print_irq_member("handler", tmp1, "handler indirection"); > - > - readmem(action+OFFSET(irqaction_flags), KVADDR, > - &value, sizeof(void *), > - "irqaction flags", FAULT_ON_ERROR); > - fprintf(fp, " flags: %8lx\n", value); > - > - if (VALID_MEMBER(irqaction_mask)) { > - readmem(action+OFFSET(irqaction_mask), KVADDR, > - &tmp1, sizeof(void *), > - "irqaction mask", FAULT_ON_ERROR); > - fprintf(fp, " mask: %8lx\n", tmp1); > - } > - > - readmem(action+OFFSET(irqaction_name), KVADDR, > - &tmp1, sizeof(void *), > - "irqaction name", FAULT_ON_ERROR); > - fprintf(fp, " name: %8lx ", tmp1); > - BZERO(buf, BUFSIZE); > - if (read_string(tmp1, buf, BUFSIZE-1)) > - fprintf(fp, "\"%s\"", buf); > - fprintf(fp, "\n"); > - > - readmem(action+OFFSET(irqaction_dev_id), KVADDR, > - &tmp1, sizeof(void *), > - "irqaction dev_id", FAULT_ON_ERROR); > - fprintf(fp, " dev_id: %8lx\n", tmp1); > - > - readmem(action+OFFSET(irqaction_next), KVADDR, > - &action, sizeof(void *), > - "irqaction dev_id", FAULT_ON_ERROR); > - fprintf(fp, " next: %8lx\n", action); > - } > - > - if (action) > - goto do_linked_action; > - > - fprintf(fp, " DEPTH: %d\n\n", depth); > -} > - > /* > * Initialize ARM specific stuff. > */ > -- > 1.7.3.2 > > -- > Crash-utility mailing list > Crash-utility@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/crash-utility -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility