Hi Dave

 

I found an ARM64 problem for bt when a function belongs to a module.

 

Printout before fix given below:

#16 [ffffffc0be96f8d0] __this_module at ffffffbffc15a2f8 [wlan]

#17 [ffffffc0be96f9b0] __this_module at ffffffbffc161b18 [wlan]

#18 [ffffffc0be96f9c0] __this_module at ffffffbffc16033c [wlan]

#19 [ffffffc0be96fa10] __this_module at ffffffbffc1630f8 [wlan]

#20 [ffffffc0be96fab0] __this_module at ffffffbffc156ff8 [wlan]

#21 [ffffffc0be96faf0] __this_module at ffffffbffc15aa58 [wlan]

#22 [ffffffc0be96fb20] __this_module at ffffffbffc15bfc8 [wlan]

#23 [ffffffc0be96fb60] __this_module at ffffffbffc115fac [wlan]

#24 [ffffffc0be96fb90] tasklet_action at ffffffc000223738

#25 [ffffffc0be96fbb0] __do_softirq at ffffffc000222e94

 

Printout after fix:

#16 [ffffffc0be96f8d0] dhd_bus_rx_frame at ffffffbffc15a2f8 [wlan]

#17 [ffffffc0be96f9b0] dhd_update_flow_prio_map at ffffffbffc161b18 [wlan]

#18 [ffffffc0be96f9c0] dhd_update_flow_prio_map at ffffffbffc16033c [wlan]

#19 [ffffffc0be96fa10] dhd_prot_process_ctrlbuf at ffffffbffc1630f8 [wlan]

#20 [ffffffc0be96fab0] dhd_bus_ringbell at ffffffbffc156ff8 [wlan]

#21 [ffffffc0be96faf0] dhd_bus_console_in at ffffffbffc15aa58 [wlan]

#22 [ffffffc0be96fb20] dhd_bus_dpc at ffffffbffc15bfc8 [wlan]

#23 [ffffffc0be96fb60] dhd_sched_dpc at ffffffbffc115fac [wlan]

#24 [ffffffc0be96fb90] tasklet_action at ffffffc000223738

#25 [ffffffc0be96fbb0] __do_softirq at ffffffc000222e94

 

From arm64.c:

 

static int

arm64_print_stackframe_entry(struct bt_info *bt, int level, struct arm64_stackframe *frame)

{

                           char *name, *name_plus_offset;

                           ulong symbol_offset;

                           struct syment *sp;

                           struct load_module *lm;

                           char buf[BUFSIZE];

 

        name = closest_symbol(frame->pc);

        name_plus_offset = NULL;

 

        if (bt->flags & BT_SYMBOL_OFFSET) {

              /*ADDED*/

              if (module_symbol(frame->pc, NULL, &lm, NULL, 0))

                sp = value_search_module(frame->pc, &symbol_offset);

              else

              /*END ADDED*/

                sp = value_search(frame->pc, &symbol_offset);

 

You probably also want to prevent calling module_symbol a second time later in the function.

 

Jan

 

Jan Karlsson

Senior Software Engineer

System Assurance

 

Sony Mobile Communications

Tel: +46 703 062 174

jan.karlsson@sonymobile.com

 

sonymobile.com

 

Sony logotype_23px height_Email_144dpi