>-----Original Message-----
>From: Menon, Nishanth
>Sent: Thursday, May 13, 2010 10:49 AM
>To: Ramos Falcon, Ernesto
>Cc: [email protected]; Ameya Palande; Contreras Felipe (Nokia-
>D/Helsinki)
>Subject: Re: [PATCHv2] DSPBRIDGE: Include missing info in MMU Fault
>debugging trace
>
>Ramos Falcon, Ernesto had written, on 05/13/2010 10:40 AM, the following:
>> Resending this patch rebased to the last changes included in dspbridge.
>> ---
>>
>> Some execution info is missing at the beginning of the
>> trace buffer printout. This fix is to include this information
>> according to the buffer contents description and
>> also couple of cosmetic changes to make the traces more
>> readable.
>>
>> Signed-off-by: Ernesto Ramos <[email protected]>
>> ---
>> drivers/dsp/bridge/core/io_sm.c | 44 +++++++++++++++++++++++++++++++--
>-----
>> 1 files changed, 36 insertions(+), 8 deletions(-)
>>
>> diff --git a/drivers/dsp/bridge/core/io_sm.c
>b/drivers/dsp/bridge/core/io_sm.c
>> index d6c1a98..d11bd9f 100644
>> --- a/drivers/dsp/bridge/core/io_sm.c
>> +++ b/drivers/dsp/bridge/core/io_sm.c
>> @@ -1949,9 +1949,9 @@ dsp_status print_dsp_trace_buffer(struct
>bridge_dev_context *hbridge_context)
>> if (DSP_FAILED(status))
>> goto func_end;
>> /* Pack and do newline conversion */
>> - pr_info("%s: DSP Trace Buffer Begin:\n"
>> + pr_info("DSP Trace Buffer Begin:\n"
>> "=======================\n%s\n",
>> - __func__, psz_buf);
>> + psz_buf);
>>
>>
>> /* convert to offset */
>> @@ -2058,6 +2058,7 @@ dsp_status dump_dsp_stack(struct bridge_dev_context
>*bridge_context)
>> u32 size;
>> } mmu_fault_dbg_info;
>> u32 *buffer;
>> + u32 *buffer_beg;
>> u32 *buffer_end;
>> u32 exc_type;
>> u32 i;
>> @@ -2067,6 +2068,7 @@ dsp_status dump_dsp_stack(struct bridge_dev_context
>*bridge_context)
>> const char *dsp_regs[] = {"EFR", "IERR", "ITSR", "NTSR",
>> "IRP", "NRP", "AMR", "SSR",
>> "ILC", "RILC", "IER", "CSR"};
>> + const char *exec_ctxt[] = {"Task", "SWI", "HWI", "Unknown"};
>> struct bridge_drv_interface *intf_fxns;
>> struct dev_object *dev_object = bridge_context->hdev_obj;
>>
>> @@ -2136,6 +2138,7 @@ dsp_status dump_dsp_stack(struct bridge_dev_context
>*bridge_context)
>> total_size = MAX_MMU_DBGBUFF;
>>
>> buffer = kzalloc(total_size, GFP_ATOMIC);
>> + buffer_beg = buffer;
>> buffer_end = buffer + total_size / 4;
>>
>> if (!buffer) {
>> @@ -2155,7 +2158,7 @@ dsp_status dump_dsp_stack(struct bridge_dev_context
>*bridge_context)
>> goto func_end;
>> }
>>
>> - pr_err("Aproximate Crash Position:\n");
>> + pr_err("\nAproximate Crash Position:\n");
>> pr_err("--------------------------\n");
>>
>> exc_type = buffer[3];
>> @@ -2171,7 +2174,27 @@ dsp_status dump_dsp_stack(struct
>bridge_dev_context *bridge_context)
>> else
>> pr_err("0x%-8x [Unable to match to a symbol.]\n", i);
>>
>> - pr_err("Execution Info:\n");
>> + buffer += 4;
>> +
>> + pr_err("\nExecution Info:\n");
>> + pr_err("---------------\n");
>> +
>> + if (*buffer < ARRAY_SIZE(exec_ctxt)) {
>> + pr_err("Execution context \t%s\n",
>> + exec_ctxt[*buffer++]);
>> + } else {
>> + pr_err("Execution context corrupt\n");
>> + kfree(buffer_beg);
>> + return -EFAULT;
>> + }
>> + pr_err("Task Handle\t\t0x%x\n", *buffer++);
>> + pr_err("Stack Pointer\t\t0x%x\n", *buffer++);
>> + pr_err("Stack Top\t\t0x%x\n", *buffer++);
>> + pr_err("Stack Bottom\t\t0x%x\n", *buffer++);
>> + pr_err("Stack Size\t\t0x%x\n", *buffer++);
>> + pr_err("Stack Size In Use\t0x%x\n", *buffer++);
>> +
>How about casting buffer to a structure and using it?
>the use of buffer++ etc is a nightmare as can be seen here..
>
I don't see the need to use a structure for this set of data if anyway I need
to use buffer++ for the rest of the buffer data. Furthermore, if I declare a
structure I need to initialize it using buffer as a reference.
I don't think is such a nightmare.
>> + pr_err("\nCPU Registers\n");
>> pr_err("---------------\n");
>btw, linux allows you to use string in a single pr_err.. e.g.
>pr_err("\n CPU Registers\n"
> "----------------\n");
>
>it is a bit easier on the system without going thru two function call
>overhead
>
OK. I'll change that.
>>
>> for (i = 0; i < 32; i++) {
>> @@ -2205,16 +2228,21 @@ dsp_status dump_dsp_stack(struct
>bridge_dev_context *bridge_context)
>> if (i == 4 || i == 6 || i == 8)
>> pr_err("B%d 0x%-8x [Function Argument %d]\n",
>> i, *buffer++, i-2);
>> - else if (i == 15)
>> + else if (i == 14)
>> pr_err("B14 0x%-8x [Data Page Pointer]\n",
>> *buffer++);
>> else
>> pr_err("B%d 0x%x\n", i, *buffer++);
>> }
>>
>> + pr_err("\n");
>> +
>> for (i = 0; i < ARRAY_SIZE(dsp_regs); i++)
>> pr_err("%s 0x%x\n", dsp_regs[i], *buffer++);
>>
>> + pr_err("\nStack:\n");
>> + pr_err("------\n");
>> +
>> for (i = 0; buffer < buffer_end; i++, buffer++) {
>> if ((*buffer > 0x01000000) && (node_find_addr(node_mgr,
>> *buffer , 0x600, &offset_output, name) ==
>> @@ -2225,7 +2253,7 @@ dsp_status dump_dsp_stack(struct bridge_dev_context
>*bridge_context)
>> else
>> pr_err("[%d] 0x%x\n", i, *buffer);
>> }
>> - kfree(buffer - total_size / 4);
>> + kfree(buffer_beg);
>> }
>> func_end:
>> return status;
>> @@ -2290,8 +2318,8 @@ void dump_dl_modules(struct bridge_dev_context
>*bridge_context)
>> pr_debug("%s: dll_module_header 0x%x %d\n", __func__,
>module_dsp_addr,
>> module_size);
>>
>> - pr_err("%s: \nDynamically Loaded Modules:\n"
>> - "---------------------------\n", __func__);
>> + pr_err("\nDynamically Loaded Modules:\n"
>> + "---------------------------\n");
>>
>> /* For each dll_module structure in the list... */
>> while (module_size) {
>
>
>--
>Regards,
>Nishanth Menon
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html