FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Crash Utility

 
 
LinkBack Thread Tools
 
Old 12-15-2010, 01:32 PM
Dave Anderson
 
Default ARM: use generic_dump_irq() instead of a custom one

----- "Mika Westerberg" <ext-mika.1.westerberg@nokia.com> 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@nokia.com>
> Cc: jan.karlsson@sonyericsson.com
> Cc: thomas.fange@sonyericsson.com
> ---
> 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()
");
> fprintf(fp, " kvtop: arm_kvtop()
");
> fprintf(fp, " get_task_pgd: arm_get_task_pgd()
");
> - if (symbol_exists("irq_desc"))
> - fprintf(fp, " dump_irq: arm_dump_irq()
");
> - else
> - fprintf(fp, " dump_irq: NULL
");
> + fprintf(fp, " dump_irq: generic_dump_irq()
");
> fprintf(fp, " get_stack_frame: arm_get_stack_frame()
");
> fprintf(fp, " get_stackbase: generic_get_stackbase()
");
> fprintf(fp, " get_stacktop: generic_get_stacktop()
");
> @@ -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, "
");
> -}
> -
> -/*
> - * 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
");
> - 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)

", irq);
> - return;
> - }
> - } else {
> - irq_desc_addr = 0;
> - error(FATAL,
> - "neither irq_desc, _irq_desc, nor irq_desc_ptrs "
> - "symbols exist
");
> - }
> -
> - 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
", irq);
> - fprintf(fp, "ADDRESS: %08lx
", 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, "
");
> - }
> - }
> -
> - 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
", type ? ")" : "");
> -
> - fprintf(fp, " PROBE: %s
", 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
", 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, "
");
> -
> -#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, "
");
> -
> - 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>
", value_symbol(action));
> - } else if (action) {
> - fprintf(fp, "%8lx
", action);
> - } else {
> - fprintf(fp, "(none)
");
> - }
> -
> - 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
", value);
> -
> - if (VALID_MEMBER(irqaction_mask)) {
> - readmem(action+OFFSET(irqaction_mask), KVADDR,
> - &tmp1, sizeof(void *),
> - "irqaction mask", FAULT_ON_ERROR);
> - fprintf(fp, " mask: %8lx
", 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, "
");
> -
> - readmem(action+OFFSET(irqaction_dev_id), KVADDR,
> - &tmp1, sizeof(void *),
> - "irqaction dev_id", FAULT_ON_ERROR);
> - fprintf(fp, " dev_id: %8lx
", tmp1);
> -
> - readmem(action+OFFSET(irqaction_next), KVADDR,
> - &action, sizeof(void *),
> - "irqaction dev_id", FAULT_ON_ERROR);
> - fprintf(fp, " next: %8lx
", action);
> - }
> -
> - if (action)
> - goto do_linked_action;
> -
> - fprintf(fp, " DEPTH: %d

", depth);
> -}
> -
> /*
> * Initialize ARM specific stuff.
> */
> --
> 1.7.3.2
>
> --
> Crash-utility mailing list
> Crash-utility@redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility

--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
 
Old 12-20-2010, 11:37 AM
Lei Wen
 
Default ARM: use generic_dump_irq() instead of a custom one

Hi,

I am trying kdump on ARM. But there is one things that very confuse me...

The parameter "elfcorehdr" should pass to the second kernel by the first one,
but I cannot find anywhere that I could figure out what this offset
value I should give
to elfcorehdr...

Can anyone help me?

Thanks,
Lei

--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
 
Old 12-20-2010, 12:36 PM
Lei Wen
 
Default ARM: use generic_dump_irq() instead of a custom one

I see...

Thanks,
Lei

On Mon, Dec 20, 2010 at 10:13 PM, Mika Westerberg
<mika.westerberg@iki.fi> wrote:
> On Mon, Dec 20, 2010 at 09:37:51PM +0900, Lei Wen wrote:
>>
>> I am trying kdump on ARM. But there is one things that very confuse me...
>>
>> The parameter "elfcorehdr" should pass to the second kernel by the first one,
>> but I cannot find anywhere that I could figure out what this offset
>> value I should give
>> to elfcorehdr...
>
> It is set automatically by kexec-tools (once you load the crashkernel
> via '-p' command line option).
>
> See code in kexec/arch/arm/crashdump-arm.c:
>
> int load_crashdump_segments(struct kexec_info *info, char *mod_cmdline)
> {
> * * * *...
> * * * */*
> * * * * * We allocate ELF core header from the end of the memory area reserved
> * * * * * for the crashkernel. We align the header to SECTION_SIZE (which is
> * * * * * 1MB) so that available memory passed in kernel command line will be
> * * * * * aligned to 1MB. This is because kernel create_mapping() wants memory
> * * * * * regions to be aligned to SECTION_SIZE.
> * * * * */
> * * * *elfcorehdr = add_buffer_phys_virt(info, buf, bufsz, bufsz, 1 << 20,
> * * * * * * * * * * * * * * * * * * * * *crash_reserved_mem.start,
> * * * * * * * * * * * * * * * * * * * * *crash_reserved_mem.end, -1, 0);
>
> * * * *dbgprintf("elfcorehdr: %#lx
", elfcorehdr);
> * * * *cmdline_add_elfcorehdr(mod_cmdline, elfcorehdr);
> * * * *...
>
> Regards,
> MW
>
> --
> Crash-utility mailing list
> Crash-utility@redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
>

--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
 
Old 12-20-2010, 12:45 PM
Dave Anderson
 
Default ARM: use generic_dump_irq() instead of a custom one

----- Original Message -----
> Hi,
>
> I am trying kdump on ARM. But there is one things that very confuse me...
>
> The parameter "elfcorehdr" should pass to the second kernel by the first one,
> but I cannot find anywhere that I could figure out what this offset value I
> should give to elfcorehdr...
>
> Can anyone help me?
>
> Thanks,
> Lei

Somebody may be able to help you here, but for kexec/kdump questions, your
best bet is the kexec list:

http://lists.infradead.org/mailman/listinfo/kexec

Dave

--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility
 

Thread Tools




All times are GMT. The time now is 06:31 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org