diff --git a/linux-ramdump-parser-v2/parsers/module_wlan.py b/linux-ramdump-parser-v2/parsers/module_wlan.py new file mode 100755 index 0000000000000000000000000000000000000000..a595d1a1134ec34e5cbb00e97f6229484a9fabf2 --- /dev/null +++ b/linux-ramdump-parser-v2/parsers/module_wlan.py @@ -0,0 +1,630 @@ +# Copyright (c) 2016 The Linux Foundation. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 and +# only version 2 as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +import parser_util +from parser_util import register_parser, RamParser +from print_out import print_out_str + + +@register_parser( + '--print-wlan', + 'Print WLAN debugging information(if enabled)', + optional=True) +class ModuleWlan(RamParser): + """ This class defines when WLAN module is loaded """ + def __init__(self, *args): + super(ModuleWlan, self).__init__(*args) + + self.dir_char = '' + self.dir_char_out = '' + self.opt_dbg = False + + self.wlan_path = '' + self.wlan_module_addr = 0 + self.wlan_text_addr = 0 + self.wlan_data_addr = 0 + self.wlan_bss_addr = 0 + + def convert_dir_for_arg(self, ori): + """ + Convert full path as an argument of function + """ + if self.opt_dbg is True: + print_out_str('** convert_dir_for_arg() **') + + if self.dir_char == '': + if parser_util.get_system_type() == 'Linux': + self.dir_char = '/' + self.dir_char_out = '/' + else: + self.dir_char = '\\' + self.dir_char_out = '\\\\' + dst = '' + for c in ori: + if c == self.dir_char: + dst = dst + self.dir_char_out + else: + dst = dst + c + + if self.opt_dbg is True: + print_out_str('ori - [{}]'.format(ori)) + print_out_str('dst - [{}]'.format(dst)) + + return dst + + def load_wlan_ko(self): + """ Load wlan.ko to GDB """ + + if self.opt_dbg is True: + print_out_str('** load_wlan_ko() **') + + if self.wlan_text_addr == 0: + print_out_str('self.wlan_text_addr is zero') + return False + + cmd = 'add-symbol-file ' + cmd = cmd + self.convert_dir_for_arg(self.wlan_path) + cmd = cmd + ' {} -s .data {} -s .bss {}'.format( + self.wlan_text_addr, self.wlan_data_addr, + self.wlan_bss_addr) + + return self.ramdump.gdbmi._run_for_first(cmd) + + def get_sections_of_wlan(self): + """ + Get wlan.ko's sectino addresses + """ + if self.opt_dbg is True: + print_out_str('** get_sections_of_wlan() **') + + # Step-A) Find wlan.ko + modules_addr = self.ramdump.address_of('modules') + next_module_addr = self.ramdump.read_structure_field( + modules_addr, 'struct list_head', 'next') + name_offset = self.ramdump.field_offset('struct module', 'name') + module_addr = 0 + idx = 0 + + while modules_addr != next_module_addr: + module_addr = self.ramdump.container_of( + next_module_addr, 'struct module', 'list') + module_name_addr = module_addr + name_offset + module_name_str = self.ramdump.read_cstring( + module_name_addr, 32, True) + + if module_name_str == 'wlan': + self.wlan_module_addr = module_addr + break + + if self.opt_dbg is True: + print_out_str( + '[{}]th - next_module[{}], module[{}], name[{}]'.format( + hex(idx), hex(next_module_addr), + hex(module_addr), module_name_str)) + + # move the list entry to the next + next_module_addr = self.ramdump.read_structure_field( + modules_addr, 'struct list_head', 'next') + idx = idx + 1 + + if self.wlan_module_addr == 0: + print_out_str('[Caution] Fail to find wlan.ko') + return False + + # Step-B) get sections in wlan.ko + sect_attrs_addr = self.ramdump.read_structure_field( + module_addr, 'struct module', 'sect_attrs') + nsections = self.ramdump.read_structure_field( + sect_attrs_addr, + 'struct module_sect_attrs', + 'nsections') + attrs_offset = self.ramdump.field_offset( + 'struct module_sect_attrs', 'attrs') + attrs_addr = sect_attrs_addr + attrs_offset + module_sect_attr_size = self.ramdump.sizeof('struct module_sect_attr') + + if self.opt_dbg is True: + print_out_str('module_addr : {}'.format(hex(module_addr))) + print_out_str('sect_attrs_addr : {}'.format(hex(sect_attrs_addr))) + print_out_str('nsections : {}'.format(hex(nsections))) + print_out_str('attrs_offset : {}'.format(hex(attrs_offset))) + if attrs_addr is not None: + print_out_str('attrs_addr : {}'.format(hex(attrs_addr))) + else: + print_out_str('attrs_addr : {}'.format(attrs_addr)) + + section_name_offset = self.ramdump.field_offset( + 'struct module_sect_attr', 'name') + idx = 0 + while idx < nsections: + section_attr_address = attrs_addr + idx * module_sect_attr_size + section_name_addr = self.ramdump.read_pointer( + section_attr_address + section_name_offset) + section_name_str = self.ramdump.read_cstring( + section_name_addr, 32, True) + section_address = self.ramdump.read_structure_field( + section_attr_address, + 'struct module_sect_attr', 'address') + + if self.opt_dbg is True: + print_out_str('section[{}]th - name[{}], attr[{}]'.format( + hex(idx), section_name_str, hex(section_address))) + + if section_name_str == '.text': + self.wlan_text_addr = section_address + if section_name_str == '.data': + self.wlan_data_addr = section_address + if section_name_str == '.bss': + self.wlan_bss_addr = section_address + idx = idx + 0x1 + + print_out_str('wlan_text_addr : {}'.format(hex(self.wlan_text_addr))) + print_out_str('wlan_data_addr : {}'.format(hex(self.wlan_data_addr))) + print_out_str('wlan_bss_addr : {}'.format(hex(self.wlan_bss_addr))) + + return True + + def run(self): + """ + Main + """ + + if self.ramdump.arm64 is None: + print_out_str('[Caution] this script supports on ARM64') + return False + + if self.ramdump.wlan == "INTEGRATED": + print_out_str('self.wlan doen\'t exist, skip') + else: + print_out_str('self.wlan exist {}'.format(self.ramdump.wlan)) + self.wlan_path = self.ramdump.wlan + + if self.get_sections_of_wlan() is False: + print_out_str('wlan.ko is not loaded.') + return False + else: + print_out_str('** Find WLAN Module **') + self.load_wlan_ko() + + self.get_wmi_command_log_buffer() + self.get_host_wmi_command_tx_cmp_buf() + self.get_host_wmi_event_buf() + self.get_host_wmi_rx_event_buf() + self.get_host_extract_log() + + return True + + ################################### + # Parse internal variables + def get_wmi_command_log_buffer(self): + """ + Parse 'struct wmi_command_debug' + """ + + if self.opt_dbg is True: + print_out_str('*** get_wmi_command_log_buffer() ***') + + element_size = self.ramdump.sizeof('struct wmi_command_debug') + if (element_size is None): + print_out_str('[Caution] symbols of host driver do not exist') + return False + + out_file = self.ramdump.open_file("wmi_command_log_buffer.txt") + + wmi_total_size = self.ramdump.sizeof('wmi_command_log_buffer') + num_elements = wmi_total_size / element_size + + if self.opt_dbg is True: + print_out_str('** wlan_host_wmi_command_log_buffer **') + print_out_str('*************************************') + print_out_str('wmi_total_size({})'.format(hex(wmi_total_size))) + print_out_str('element_size({})'.format(hex(element_size))) + print_out_str('num_elements({})'.format(hex(num_elements))) + print_out_str('*************************************') + + # info of the data structure + command_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'command') + data0_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'data[0]') + data1_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'data[1]') + data2_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'data[2]') + data3_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'data[3]') + time_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'time') + + if self.opt_dbg is True: + print_out_str('command_offset({})'.format(command_offset)) + print_out_str('data0_offset({})'.format(data0_offset)) + print_out_str('data1_offset({})'.format(data1_offset)) + print_out_str('data2_offset({})'.format(data2_offset)) + print_out_str('data3_offset({})'.format(data3_offset)) + print_out_str('time_offset({})'.format(time_offset)) + print_out_str('*************************************') + + buffer_start_address = self.ramdump.address_of( + 'wmi_command_log_buffer') + wmi_command_buf_idx = self.ramdump.read_u32( + self.ramdump.address_of( + 'g_wmi_command_buf_idx')) + + cnt = 0 + idx = wmi_command_buf_idx + while cnt < num_elements: + if idx == num_elements: + idx = 0 + + buffer_address = buffer_start_address + idx * element_size + command = self.ramdump.read_u32(buffer_address) + data0 = self.ramdump.read_u32(buffer_address + data0_offset) + data1 = self.ramdump.read_u32(buffer_address + data1_offset) + data2 = self.ramdump.read_u32(buffer_address + data2_offset) + data3 = self.ramdump.read_u32(buffer_address + data3_offset) + time = self.ramdump.read_u64(buffer_address + time_offset) + + idx = idx + 1 + cnt = cnt + 1 + + out_buf = '{0} us'.format(float(time/100000.0)) + out_buf = out_buf + ' : command({})'.format(hex(command)) + out_buf = out_buf + ', data[{}'.format(hex(data0)) + out_buf = out_buf + ', {}'.format(hex(data1)) + out_buf = out_buf + ', {}'.format(hex(data2)) + out_buf = out_buf + ', {}]'.format(hex(data3)) + if self.opt_dbg is True: + print_out_str(out_buf) + out_file.write(out_buf + '\n') + out_file.close() + + return True + + def get_host_wmi_command_tx_cmp_buf(self): + """ + Parse 'struct wmi_command_debug wmi_command_tx_cmp_log_buffer' + """ + if self.opt_dbg is True: + print_out_str('*** get_host_wmi_command_tx_cmp_buf() ***') + + element_size = self.ramdump.sizeof('struct wmi_command_debug') + if (element_size is None): + print_out_str('[Caution] symbols of host driver do not exist') + return False + + out_file = self.ramdump.open_file("wmi_command_tx_cmp_buf.txt") + + wmi_total_size = self.ramdump.sizeof('wmi_command_tx_cmp_log_buffer') + num_elements = wmi_total_size / element_size + + if self.opt_dbg is True: + print_out_str('** wlan_host_wmi_command_tx_cmp_buf **') + print_out_str('*************************************') + print_out_str('wmi_total_size({})'.format(hex(wmi_total_size))) + print_out_str('element_size({})'.format(hex(element_size))) + print_out_str('num_elements({})'.format(hex(num_elements))) + print_out_str('*************************************') + + # info of the data structure + command_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'command') + data0_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'data[0]') + data1_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'data[1]') + data2_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'data[2]') + data3_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'data[3]') + time_offset = self.ramdump.field_offset( + 'struct wmi_command_debug', 'time') + + if self.opt_dbg is True: + print_out_str("command_offset({})".format(command_offset)) + print_out_str("data0_offset({})".format(data0_offset)) + print_out_str("data1_offset({})".format(data1_offset)) + print_out_str("data2_offset({})".format(data2_offset)) + print_out_str("data3_offset({})".format(data3_offset)) + print_out_str("time_offset({})".format(time_offset)) + print_out_str('*************************************') + + log_buffer_address = self.ramdump.address_of( + 'wmi_command_tx_cmp_log_buffer') + wmi_command_buf_idx = self.ramdump.read_u32( + self.ramdump.address_of( + 'g_wmi_command_tx_cmp_buf_idx')) + + cnt = 0 + idx = wmi_command_buf_idx + while cnt < num_elements: + if idx == num_elements: + idx = 0 + + buffer_address = log_buffer_address + idx * element_size + command = self.ramdump.read_u32(buffer_address) + data0 = self.ramdump.read_u32(buffer_address + data0_offset) + data1 = self.ramdump.read_u32(buffer_address + data1_offset) + data2 = self.ramdump.read_u32(buffer_address + data2_offset) + data3 = self.ramdump.read_u32(buffer_address + data3_offset) + time = self.ramdump.read_u64(buffer_address + time_offset) + + idx = idx + 1 + cnt = cnt + 1 + + out_buf = '{0} us'.format(float(time/100000.0)) + out_buf = out_buf + ' : command({})'.format(hex(command)) + out_buf = out_buf + ', data[{}'.format(hex(data0)) + out_buf = out_buf + ', {}'.format(hex(data1)) + out_buf = out_buf + ', {}'.format(hex(data2)) + out_buf = out_buf + ', {}]'.format(hex(data3)) + if self.opt_dbg is True: + print_out_str(out_buf) + out_file.write(out_buf + '\n') + + out_file.close() + return True + + def get_host_wmi_event_buf(self): + """ + Parse 'struct wmi_event_debug wmi_event_log_buffer[]' + """ + + if self.opt_dbg is True: + print_out_str('*** get_host_wmi_event_buf() ***') + + element_size = self.ramdump.sizeof('struct wmi_event_debug') + if (element_size is None): + print_out_str('[Caution] symbols of host driver do not exist') + return False + + out_file = self.ramdump.open_file("wmi_event_log_buffer.txt") + + wmi_total_size = self.ramdump.sizeof('wmi_event_log_buffer') + num_elements = wmi_total_size / element_size + + if self.opt_dbg is True: + print_out_str('[Debug] wmi_total_size({})'.format( + hex(wmi_total_size))) + print_out_str('[Debug] element_size({})'.format(hex(element_size))) + print_out_str('[Debug] num_elements({})'.format(hex(num_elements))) + + # info of the data structure + event_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'event') + data0_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'data[0]') + data1_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'data[1]') + data2_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'data[2]') + data3_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'data[3]') + time_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'time') + + if self.opt_dbg is True: + print_out_str("[Debug] event_offset({})".format(event_offset)) + print_out_str("[Debug] data0_offset({})".format(data0_offset)) + print_out_str("[Debug] data1_offset({})".format(data1_offset)) + print_out_str("[Debug] data2_offset({})".format(data2_offset)) + print_out_str("[Debug] data3_offset({})".format(data3_offset)) + print_out_str("[Debug] time_offset({})".format(time_offset)) + + wmi_log_address = self.ramdump.address_of('wmi_event_log_buffer') + wmi_event_buf_idx = self.ramdump.read_u32( + self.ramdump.address_of('g_wmi_event_buf_idx')) + + cnt = 0 + idx = wmi_event_buf_idx + while cnt < num_elements: + if idx == num_elements: + idx = 0 + + buffer_address = wmi_log_address + idx * element_size + event = self.ramdump.read_u32(buffer_address) + data0 = self.ramdump.read_u32(buffer_address + data0_offset) + data1 = self.ramdump.read_u32(buffer_address + data1_offset) + data2 = self.ramdump.read_u32(buffer_address + data2_offset) + data3 = self.ramdump.read_u32(buffer_address + data3_offset) + time = self.ramdump.read_u64(buffer_address + time_offset) + + idx = idx + 1 + cnt = cnt + 1 + + out_buf = '{0} us'.format(float(time/100000.0)) + out_buf = out_buf + ' : event({})'.format(hex(event)) + out_buf = out_buf + ', data[{}'.format(hex(data0)) + out_buf = out_buf + ', {}'.format(hex(data1)) + out_buf = out_buf + ', {}'.format(hex(data2)) + out_buf = out_buf + ', {}]'.format(hex(data3)) + if self.opt_dbg is True: + print_out_str(out_buf) + out_file.write(out_buf + '\n') + + out_file.close() + return True + + def get_host_wmi_rx_event_buf(self): + """ + Parse 'struct wmi_event_debug wmi_rx_event_log_buffer' + """ + + if self.opt_dbg is True: + print_out_str('*** get_host_wmi_rx_event_buf() ***') + + wmi_elem_size = self.ramdump.sizeof('struct wmi_event_debug') + if (wmi_elem_size is None): + print_out_str('[Caution] symbols of host driver do not exist') + return False + wmi_total_size = self.ramdump.sizeof('wmi_rx_event_log_buffer') + num_elements = wmi_total_size / wmi_elem_size + + out_file = self.ramdump.open_file("wmi_rx_event_log_buffer.txt") + + # info of the data structure + event_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'event') + data0_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'data[0]') + data1_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'data[1]') + data2_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'data[2]') + data3_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'data[3]') + time_offset = self.ramdump.field_offset( + 'struct wmi_event_debug', 'time') + + wmi_event_address = self.ramdump.address_of('wmi_rx_event_log_buffer') + wmi_event_buf_idx = self.ramdump.read_u32( + self.ramdump.address_of( + 'g_wmi_rx_event_buf_idx')) + + if self.opt_dbg is True: + print_out_str('[Debug] wmi_total_size({})'.format(wmi_total_size)) + print_out_str('[Debug] wmi_elem_size({})'.format(wmi_elem_size)) + print_out_str('[Debug] num_elements({})'.format(num_elements)) + print_out_str('[Debug] event_offset({})'.format(event_offset)) + print_out_str('[Debug] data0_offset({})'.format(data0_offset)) + print_out_str('[Debug] data1_offset({})'.format(data1_offset)) + print_out_str('[Debug] data2_offset({})'.format(data2_offset)) + print_out_str('[Debug] data3_offset({})'.format(data3_offset)) + print_out_str('[Debug] time_offset({})'.format(time_offset)) + + cnt = 0 + idx = wmi_event_buf_idx + while cnt < num_elements: + if idx == num_elements: + idx = 0 + + buffer_address = wmi_event_address + idx * wmi_elem_size + event = self.ramdump.read_u32(buffer_address) + data0 = self.ramdump.read_u32(buffer_address + data0_offset) + data1 = self.ramdump.read_u32(buffer_address + data1_offset) + data2 = self.ramdump.read_u32(buffer_address + data2_offset) + data3 = self.ramdump.read_u32(buffer_address + data3_offset) + time = self.ramdump.read_u64(buffer_address + time_offset) + + out_buf = '{0} us'.format(float(time/100000.0)) + out_buf = out_buf + ' : event({})'.format(hex(event)) + out_buf = out_buf + ', data[{}'.format(hex(data0)) + out_buf = out_buf + ', {}'.format(hex(data1)) + out_buf = out_buf + ', {}'.format(hex(data2)) + out_buf = out_buf + ', {}]'.format(hex(data3)) + if self.opt_dbg is True: + print_out_str(out_buf) + out_file.write(out_buf + '\n') + + idx = idx + 1 + cnt = cnt + 1 + + out_file.close() + return True + + def get_host_extract_log(self): + """ + refer functions in wlan_logging_sock_svc.c + """ + + if self.opt_dbg is True: + print_out_str('*** wlan_host_extract_log() ***') + + out_file = self.ramdump.open_file("gwlan_logging.txt") + + # get number of struct wlan_logging + num_buf = self.ramdump.read_s32( + self.ramdump.address_of('gwlan_logging') + + self.ramdump.field_offset( + 'struct wlan_logging', 'num_buf')) + if self.opt_dbg is True: + print_out_str('num_buf : {}'.format(num_buf)) + + # gwlan_logging + element_size = self.ramdump.sizeof('struct log_msg') + if element_size % 32: + elem_aligned_size = element_size + (element_size % 32) + if self.opt_dbg is True: + print_out_str('element_size({})'.format(hex(element_size))) + print_out_str('element_align_size({})'.format( + hex(elem_aligned_size))) + else: + elem_aligned_size = element_size + if self.opt_dbg is True: + print_out_str('element_size({})'.format(hex(element_size))) + print_out_str('element_align_size({})'.format( + hex(elem_aligned_size))) + + filled_length_offset = self.ramdump.field_offset( + 'struct log_msg', + 'filled_length') + logbuf_offset = self.ramdump.field_offset( + 'struct log_msg', 'logbuf') + logbuf_size = element_size - logbuf_offset + gplog_msg_address = self.ramdump.read_pointer('gplog_msg') + + if self.opt_dbg is True: + print_out_str('filled_length_offset : {}'.format( + hex(filled_length_offset))) + print_out_str('logbuf_size : {}'.format(hex(logbuf_size))) + print_out_str('gplog_msg_address : {}'.format( + hex(gplog_msg_address))) + + cnt = 0 + while cnt < num_buf: + buffer_address = gplog_msg_address + cnt * elem_aligned_size + + filled_length = self.ramdump.read_u32( + buffer_address + filled_length_offset) + + v_address = buffer_address + logbuf_offset + 4 + p_address = self.ramdump.virt_to_phys(v_address) + if self.opt_dbg is True: + print_out_str('** gplog_msg[{}] : {}, {}, VA{}-PA{} **'.format( + cnt, + hex(buffer_address), + hex(filled_length), + hex(v_address), + hex(p_address))) + + out_file.write('** gplog_msg[{}] : {}, {}, VA{}-PA{} **\n'.format( + cnt, + hex(buffer_address), + hex(filled_length), + hex(v_address), + hex(p_address))) + + if filled_length != 0: + left_bytes = filled_length + logbuf_str = "" + while left_bytes > 0: + p_address = self.ramdump.virt_to_phys(v_address) + logbuf_out = self.ramdump.read_physical(p_address, 4) + logbuf_str = logbuf_str + logbuf_out + + v_address = v_address + 4 + left_bytes = left_bytes - 4 + + if self.opt_dbg is True: + print_out_str(logbuf_str) + out_file.write(logbuf_str) + out_file.write('\n') + + # We may be able to delete first [] + # like [VosMCThread] or [kworker/0:0] + cnt = cnt + 1 + + out_file.close() + return True + + def parse(self): + self.run() + return True diff --git a/linux-ramdump-parser-v2/ramdump.py b/linux-ramdump-parser-v2/ramdump.py index 5089bde99310b1ac9a8d809d5b0a1c68dd1f0c16..f10685b4158e68650dd8000b62a6d0062599cf0c 100755 --- a/linux-ramdump-parser-v2/ramdump.py +++ b/linux-ramdump-parser-v2/ramdump.py @@ -552,6 +552,7 @@ class RamDump(): options.phys_offset)) self.phys_offset = options.phys_offset + self.wlan = options.wlan self.lookup_table = [] self.config = [] self.config_dict = {} diff --git a/linux-ramdump-parser-v2/ramparse.py b/linux-ramdump-parser-v2/ramparse.py index 7ed8cdd9df5c6ff978634f307e41bb2d860d8255..78c77cd3052cc426317e803ac9cffb36f021a4cd 100755 --- a/linux-ramdump-parser-v2/ramparse.py +++ b/linux-ramdump-parser-v2/ramparse.py @@ -146,11 +146,12 @@ if __name__ == '__main__': action='append', default=[]) parser.add_option('', '--ipc-skip', dest='ipc_skip', action='store_true', help='Skip IPC Logging when parsing everything', - default=False) + default=False) parser.add_option('', '--ipc-debug', dest='ipc_debug', action='store_true', help='Debug Mode for IPC Logging', default=False) parser.add_option('', '--eval', help='Evaluate some python code directly, or from stdin if "-" is passed. The "dump" variable will be available, as it is with the --shell option.') # noqa + parser.add_option('', '--wlan', dest='wlan', help='wlan.ko path') for p in parser_util.get_parsers(): parser.add_option(p.shortopt or '', @@ -237,6 +238,14 @@ if __name__ == '__main__': 'Ram file {0} does not exist. Exiting...'.format(a[0])) sys.exit(1) + if options.wlan is None: + options.wlan = "INTEGRATED" + else: + if not os.path.exists(options.wlan): + print_out_str('{} does not exist.'.format(options.wlan)) + print_out_str('Cannot proceed without wlan.ko Exiting') + sys.exit(1) + gdb_path = options.gdb nm_path = options.nm objdump_path = options.objdump