>-----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

Reply via email to