There is no reason for having custom IRQ dumping function on ARM and having such causes maintenance burden when the kernel IRQ structures change. 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). 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