| # SPDX-License-Identifier: GPL-2.0 |
| # Copyright (c) 2022 Mediatek Inc. |
| |
| #!/usr/bin/env python3 |
| |
| ################################################################################################################### |
| # # |
| # This program is used for dump different files/Symbols/config between MTK kernel tree and Google Kernel tree # |
| # # |
| ################################################################################################################### |
| |
| import datetime |
| import difflib |
| import os |
| import re |
| import shutil |
| import string |
| import sys |
| import subprocess |
| |
| from collections import OrderedDict |
| from optparse import OptionParser |
| from pprint import pprint |
| |
| date_path = datetime.date.today() |
| config_wlist = [] |
| symbol_wlist = [] |
| file_wlist = [] |
| g_config_pass = True |
| g_symbol_pass = True |
| g_file_pass = True |
| options = None |
| wiki = "https://wiki.mediatek.inc/display/KernelStandardization/GKI+checker" |
| checker_version = "v2.0" |
| default_google_sha = "4345c3db8492caa9b2" |
| |
| def create_compare_file(target, input_file, output_file_name): |
| if target == "Config": |
| # print "create "+ input_file +" config list" |
| # get config from vmlinux |
| content = subprocess.check_output(options.config_tool + " "+input_file, shell=True) |
| with open(output_file_name, "wb") as f: |
| f.write(content) |
| elif target == "Symbol": |
| # print "create " + input_file + " symbol list" |
| # get System.map from vmlinux |
| cmd = options.tool_chain + "llvm-nm -n --print-size " + input_file + " | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( \.L\)' > " + output_file_name |
| #print(cmd) |
| os.system(cmd) |
| |
| def write_dict_file(dict_cont, with_size, filename): |
| with open(options.checker_out + filename, "w") as f: |
| if with_size: |
| for x, c_list in dict_cont.items(): |
| str_cont = x + " " + "".join(item for item in c_list) |
| f.write(str_cont +'\n') |
| else: |
| for x in dict_cont.keys(): |
| f.write(x +'\n') |
| |
| def write_list_file(list_cont, filename): |
| with open(options.checker_out + filename, "w") as f: |
| for x in list_cont: |
| f.write(x +'\n') |
| |
| def compare_config(g_config_file, m_config_file): |
| global g_config_pass |
| nonset_config_info = re.compile("^(-|\+)# (CONFIG_\w*) is not set$") |
| set_config_info = re.compile("^(-|\+)(CONFIG_\w*)=(.*)$") |
| mt_info = re.compile("MT\d+|MTK|MEDIATEK") |
| |
| cmd = "diff --strip-trailing-cr -EbwB --unified=0 " + g_config_file + " " + m_config_file |
| output = os.popen(cmd) |
| diff_cont = output.read() |
| output.close() |
| g_config = {} |
| m_config = {} |
| for line in diff_cont.splitlines(): |
| if line[0:3] in ("+++", "---", "@@ "): |
| continue |
| if line[0] in ("+", "-") and len(line) == 1: |
| continue |
| if line[0:2] in ("+#", "-#") and len(line) == 2: |
| continue |
| |
| nset_info = nonset_config_info.search(line) |
| set_info = set_config_info.search(line) |
| if nset_info: |
| if nset_info.group(2) in config_wlist: |
| continue |
| if nset_info.group(1)=="-": |
| g_config[nset_info.group(2)] = "n" |
| # print(nset_info.group(1), "nset:", nset_info.group(2)) |
| elif nset_info.group(1)=="+" and nset_info.group(2) in g_config: |
| if g_config[nset_info.group(2)] != "m" and g_config[nset_info.group(2)] != "y": |
| g_config.pop(nset_info.group(2)) |
| else: |
| m_config[nset_info.group(2)] = "n" |
| # print("Worning!!", nset_info.group(1), "nset:", nset_info.group(2)) |
| if set_info: |
| if set_info.group(2) in config_wlist: |
| continue |
| if set_info.group(1)=="-": |
| g_config[set_info.group(2)] = set_info.group(3) |
| # print(set_info.group(1), "set:", set_info.group(2), ", value:", set_info.group(3)) |
| elif set_info.group(1)=="+": |
| if set_info.group(3)=="m" and set_info.group(2) in g_config: |
| if g_config[set_info.group(2)] != "y": |
| g_config.pop(set_info.group(2)) |
| else: |
| m_config[set_info.group(2)] = set_info.group(3) |
| # print("Worning!!", set_info.group(1), "set:", set_info.group(2), ", value:", set_info.group(3)) |
| elif set_info.group(3)=="y" and set_info.group(2) in g_config: |
| if g_config[set_info.group(2)] != "n" and g_config[set_info.group(2)] != "m": |
| g_config.pop(set_info.group(2)) |
| else: |
| m_config[set_info.group(2)] = set_info.group(3) |
| # print("Worning!!", set_info.group(1), "set:", set_info.group(2), ", value:", set_info.group(3)) |
| elif not mt_info.search(set_info.group(2)) and set_info.group(3) != "m": |
| m_config[set_info.group(2)] = set_info.group(3) |
| # print("Worning!!", set_info.group(1), "set:", set_info.group(2), ", value:", set_info.group(3)) |
| if g_config: |
| print("Error: Addition Google config\n{ ", end="") |
| g_config_pass = False |
| # pprint(g_config) |
| for x in g_config.keys(): |
| print(x, end=", ") |
| print("}") |
| write_dict_file(g_config, True, "config/gki_cfg.txt") |
| if m_config: |
| print("Error: Redundant MTK config\n{ ", end="") |
| g_config_pass = False |
| # pprint(m_config) |
| for x in m_config.keys(): |
| print(x, end=", ") |
| print("}") |
| write_dict_file(m_config, True, "config/mtk_cfg.txt") |
| |
| def get_gki_denyfile(): |
| key_str = "out_krn/kernel-5.15" |
| # remove old denyfiles.txt |
| cmd = "rm -f " + options.checker_out + "file/tmp/gki_denyfiles.txt" |
| #print(cmd) |
| os.system(cmd) |
| # get redount strings in file path ex. out_abi/android12-5.10/common and replace "/" as "\/" cause sed |
| cmd = options.tool_chain + "llvm-dwarfdump --debug-info "+ options.google_vmlinux + " | grep -m 1 \"DW_AT_comp_dir\" | awk 'BEGIN {FS=\"\\\"\"} {print $2}'" |
| print(cmd) |
| output = os.popen(cmd) |
| restr1 = output.read().splitlines()[0] |
| restr2 = restr1 |
| if key_str in restr1: |
| restr2 = restr1.replace("out_krn/kernel-5.15", "common") |
| restr1 = restr1.replace("/","\/") |
| restr2 = restr2.replace("/","\/") |
| #print(restr1) |
| #print(restr2) |
| output.close() |
| # get denyfile |
| cmd = options.tool_chain + "llvm-dwarfdump --debug-info "+ options.google_vmlinux \ |
| + " | grep \"DW_AT_decl_file\" | awk 'BEGIN {FS=\"\\\"\"} {print $2}' | sed 's/" \ |
| + restr1 + "\///'"+" | sed 's/"+ restr2 + "\///' | sort | uniq > " \ |
| + options.checker_out + "file/tmp/gki_denyfiles.txt" |
| #print(cmd) |
| os.system(cmd) |
| |
| ''' |
| # TODO report info, current not use |
| def verify_violation(diff_cont): |
| ret = False |
| start_synx_info = re.compile('^\+(#if IS_ENABLED\(|#ifdef |#if defined\()(\w*)\)?$') |
| single_line_star = re.compile('^-\t*(else|if *\( *.*\)|else if *\( *.*\)) *$') |
| multi_line_star = re.compile('^\+\t*\}? *(else|if *\( *.*\)|else if *\( *.*\)) *\{.*$') |
| close_star = re.compile('^\+\t*\} *(else *|else if *\(.*\) *)?\{?$') |
| config_trace = False |
| # special_case = False |
| for line in diff_cont.splitlines(): |
| # bypass unnecessary line info |
| if line[0:3] in ("+++", "---", "@@ "): |
| print("b:"+line) |
| continue |
| elif line[0] in ("-", "+", " ") and len(line) == 1: |
| print("b:"+line) |
| continue |
| elif line[0:4] == "diff": |
| print("b:"+line) |
| continue |
| elif line[0:5] == "index": |
| print("b:"+line) |
| continue |
| |
| start_synx = start_synx_info.search(line) |
| if start_synx: |
| # print(start_synx.group(2)) |
| config_trace = True |
| print("c:"+line) |
| continue |
| elif line == "+#else" or line == "+#endif": |
| config_trace = False |
| print("c:"+line) |
| continue |
| |
| if config_trace: |
| if line[0] != "+": |
| print("v:"+line) |
| ret = True |
| # break |
| else: |
| print("c:"+line) |
| else: |
| # if single_line_star.search(line): |
| # # print("n:", line) |
| # special_case = True |
| # elif line[0] != " ": |
| if line[0] != " ": |
| # if special_case: |
| # if multi_line_star.search(line): |
| # print("n:", line) |
| # continue |
| # elif close_star.search(line): |
| # print("n:", line) |
| # special_case = False |
| # continue |
| print("v:"+line) |
| ret = True |
| # break |
| return ret |
| ''' |
| |
| def get_sha(vmlinux): |
| sha_default = True |
| sha = default_google_sha |
| sha_re = re.compile('^Linux version.*-g(\w*)?(-\w*|) .*$') |
| # Get Goolge commit sha from google vmlinux |
| g_content = subprocess.check_output(options.tool_chain+"llvm-strings "+(vmlinux)+" | grep \"Linux version\"", shell=True).decode("utf-8") |
| for ctx in g_content.split("\n"): |
| #print(ctx) |
| sha_info = sha_re.search(ctx) |
| if sha_info: |
| sha_default = False |
| sha = sha_info.group(1) |
| print("Google SHA:" + sha) |
| break |
| # Get MTK commit tag from git commit message |
| try: |
| tag_re = re.compile('^.* ACK: Merge (.*)( \w*|-\w*) into .*$') |
| content = subprocess.check_output("git log --grep=" + sha + " | grep \"ACK: Merge\"", shell=True).decode("utf-8") |
| for ctx in content.split("\n"): |
| tag_info = tag_re.search(ctx) |
| if tag_info: |
| tag = tag_info.group(1) |
| try: |
| subprocess.check_output("git remote remove ack", shell=True).decode("utf-8") |
| except subprocess.CalledProcessError as warn: |
| print("No Need to remote remove ack!") |
| #print(warn) |
| try: |
| subprocess.check_output("git remote add ack --no-tags --mirror=fetch https://gerrit.mediatek.inc/kernel/common && git fetch ack " + tag, shell=True).decode("utf-8") |
| except subprocess.CalledProcessError as warn: |
| print("No Need to fetch ack info!") |
| #print(warn) |
| break |
| except subprocess.CalledProcessError as warn: |
| print("Not MP stage") |
| #print(warn) |
| |
| if sha_default: |
| print("Warning: Can't get ACK_SHA!, Use default SHA:" + sha) |
| return sha |
| |
| def filecompare(fileName): |
| # DO NOT change the input file order, or the verify() will be wrong |
| # return true when file context are different |
| # googlefile = google_path + fileName |
| # mtkfile = mtk_path + fileName |
| # cmd = "diff --strip-trailing-cr -EbwBu " + googlefile + " " + mtkfile |
| cmd = "git diff --ignore-all-space --ignore-blank-lines " + options.ACK_SHA + " -- " + fileName |
| output = os.popen(cmd) |
| diff_cont = output.read() |
| output.close() |
| # if diff_cont and verify_violation(diff_cont): |
| if diff_cont: |
| print("\nError: You should Not modify " + fileName) |
| gcmd = "git show " + options.ACK_SHA + ":" + fileName |
| mcmd = "git show HEAD:" + fileName |
| goutput = os.popen(gcmd) |
| gdiff_cont = goutput.read() |
| google_file = open(options.checker_out + "file/google/" + fileName.replace("/","_"),"w") |
| google_file.write(gdiff_cont) |
| google_file.close() |
| |
| moutput = os.popen(mcmd) |
| mdiff_cont = moutput.read() |
| mtk_file = open(options.checker_out + "file/mtk/" + fileName.replace("/","_"),"w") |
| mtk_file.write(mdiff_cont) |
| mtk_file.close() |
| return True |
| else: |
| return False |
| |
| def dump_diff_file(): |
| global g_file_pass |
| options.ACK_SHA = get_sha(options.google_vmlinux) |
| gki54_file = open(options.checker_out + "file/tmp/gki_denyfiles.txt","r") |
| summry_file = open(options.checker_out + "file/summary.log","w") |
| print("Checking", end="") |
| for idx, line in enumerate(gki54_file): |
| if idx%100 == 99: |
| print(".", end="", flush=True) |
| file_name = line.strip() |
| if file_name in file_wlist: |
| continue |
| if filecompare(file_name): |
| g_file_pass = False |
| summry_file.write(file_name+'\n') |
| print("") |
| gki54_file.close() |
| summry_file.close() |
| |
| def is_hex_str(s): |
| return set(s).issubset(string.hexdigits) |
| |
| def count_dec_char(input_str): # return # of [0-9] char |
| return sum(c.isdigit() for c in input_str) |
| |
| def contain_offset(input_str_list): # TODO |
| ret = [] |
| for idx, item in enumerate(input_str_list): |
| if item.isdigit(): |
| ret.append(idx) |
| return ret |
| |
| def clean_str(redundant_str): |
| if len(redundant_str.split('.')) > 1 and redundant_str.split('.')[-1].isdigit(): |
| str_obfs = '.'.join(item for item in redundant_str.split('.')[:-1]) |
| return str_obfs, redundant_str.split('.')[-1] |
| elif len(redundant_str.split('_'))>1: |
| sp_list = redundant_str.split('_') |
| if len(sp_list[-1]) == 16 and is_hex_str(sp_list[-1]): # contain hex |
| str_obfs = '_'.join(item for item in sp_list[:-1]) |
| return str_obfs, sp_list[-1] |
| else: |
| rd_value_list = [] |
| if count_dec_char(sp_list[-1])>=2: # dec number on the tail of symbol |
| rd_value_list.append(sp_list[-1]) |
| sp_list[-1] = re.sub(r'\d+', '', sp_list[-1]) |
| co = contain_offset(sp_list[:-1]) |
| for idx in co: # dec number in the middle of symbol |
| rd_value_list.append(sp_list[idx]) |
| sp_list[idx] = "" |
| str_obfs = '_'.join(item for item in sp_list) |
| rd_value = '_'.join(item for item in rd_value_list) |
| return str_obfs, rd_value |
| return redundant_str, "" |
| |
| def parsing_System_map(file_name): |
| symbols = [] |
| unsize_symbols = [] |
| with open(file_name, "r") as f: |
| for line in f.readlines(): |
| sb = line.split() |
| sb[3] , rd_value = clean_str(sb[3]) |
| tmp = sb[3] + " " + str(int(sb[1], 16)) |
| if sb[3] not in symbol_wlist: |
| symbols.append(tmp) |
| unsize_symbols.append(sb[3]) |
| return unsize_symbols, symbols |
| |
| def compare_symbols(g_symbols, m_symbols, with_size): |
| sym_size_info = re.compile("^(-|\+)(\w*) ?(\d*)?$") |
| diff = difflib.unified_diff(g_symbols, m_symbols, n=0) |
| sdiff = sorted(diff, reverse=True) |
| g_symbol = {} |
| m_symbol = {} |
| for line in sdiff: |
| if line[0:3] in ("+++", "---", "@@ ") or len(line) == 0: |
| continue |
| if line.find("__Cortex") > -1: |
| continue |
| info = sym_size_info.search(line) |
| if info: |
| size = '0' |
| symb = info.group(2) |
| if with_size: |
| size = info.group(3) |
| if info.group(1) == "-": |
| if symb in g_symbol: |
| g_symbol[symb].append(size) |
| else: |
| g_symbol[symb] = [size] |
| if info.group(1) == "+": |
| if symb in g_symbol: |
| if size in g_symbol[symb]: |
| if len(g_symbol[symb]) == 1: |
| g_symbol.pop(symb) |
| else: |
| g_symbol[symb].remove(size) |
| else: |
| if symb in m_symbol: |
| m_symbol[symb].append(size) |
| else: |
| m_symbol[symb] = [size] |
| else: |
| if symb in m_symbol: |
| m_symbol[symb].append(size) |
| else: |
| m_symbol[symb] = [size] |
| return g_symbol, m_symbol |
| |
| def compare_System_map(g_sysmap, m_sysmap): |
| global g_symbol_pass |
| g_ns_symbols, g_symbols = parsing_System_map(g_sysmap) |
| m_ns_symbols, m_symbols = parsing_System_map(m_sysmap) |
| os.makedirs(options.checker_out+"symbol/google/", exist_ok=True) |
| os.makedirs(options.checker_out+"symbol/mtk/", exist_ok=True) |
| g_symbols = sorted(list(set(g_symbols))) |
| m_symbols = sorted(list(set(m_symbols))) |
| g_ns_symbols = sorted(list(set(g_ns_symbols))) |
| m_ns_symbols = sorted(list(set(m_ns_symbols))) |
| #write_list_file(g_symbols, "symbol/google/symbols.txt") |
| #write_list_file(m_symbols, "symbol/mtk/symbols.txt") |
| #write_list_file(g_ns_symbols, "symbol/google/ns_symbols.txt") |
| #write_list_file(m_ns_symbols, "symbol/mtk/ns_symbols.txt") |
| # Compare two System.map symbols |
| #print("Compare symbols") |
| g_s_unsort_report, m_s_unsort_report = compare_symbols(g_symbols, m_symbols, True) |
| g_s_report = OrderedDict(sorted(g_s_unsort_report.items())) |
| m_s_report = OrderedDict(sorted(m_s_unsort_report.items())) |
| if g_s_report: |
| print("Error: Symbol size different\n{ ", end="") |
| g_symbol_pass = False |
| for x in g_s_report.keys(): |
| print(x, end=", ") |
| print("}") |
| write_dict_file(g_s_report, True, "symbol/gki_size_diff.txt") |
| if m_s_report: |
| g_symbol_pass = False |
| # pprint(m_s_report) |
| write_dict_file(m_s_report, True, "symbol/mtk_size_diff.txt") |
| |
| # print("Remove symbols with different size but same name ") |
| g_ns_unsort_report, m_ns_unsort_report = compare_symbols(g_ns_symbols, m_ns_symbols, False) |
| g_ns_report = OrderedDict(sorted(g_ns_unsort_report.items())) |
| m_ns_report = OrderedDict(sorted(m_ns_unsort_report.items())) |
| if g_ns_report: |
| print("Error: Addition Google Symbols:\n{ ", end="") |
| g_symbol_pass = False |
| for x in g_ns_report.keys(): |
| print(x, end=", ") |
| print("}") |
| write_dict_file(g_ns_report, True, "symbol/gki_panic.txt") |
| if m_ns_report: |
| print("Error: Redundant MTK Symbols:\n{ ", end="") |
| g_symbol_pass = False |
| for x in m_ns_report.keys(): |
| print(x, end=", ") |
| print("}") |
| write_dict_file(m_ns_report, True, "symbol/mtk_panic.txt") |
| |
| def remove_tmp(opt_type): |
| try: |
| shutil.rmtree(options.checker_out + opt_type + "tmp/") |
| except OSError as e: |
| print("Error: %s - %s." % (e.filename, e.strerror)) |
| |
| def checker_verify(): |
| if g_config_pass and g_symbol_pass and g_file_pass: |
| print("Good Job!") |
| return 0 |
| if not g_config_pass: |
| print("Error: Config check failed!") |
| if not g_symbol_pass: |
| print("Error: Symbol check failed!") |
| if not g_file_pass: |
| print("Error: File check failed!") |
| print("For more detail, please check wiki:"+ wiki) |
| return -1 |
| |
| def read_white_list(filename): |
| cfg=[] |
| sbl=[] |
| fil=[] |
| with open(filename, "r") as f: |
| for line in f.readlines(): |
| line = line.replace('\r', '') |
| line = line.replace('\n', '') |
| sb = line.split(" ") |
| if sb[0] == "f": |
| fil.append(sb[1]) |
| elif sb[0] == "c": |
| cfg.append(sb[1]) |
| elif sb[0] == "s": |
| sbl.append(sb[1]) |
| return cfg, sbl, fil |
| |
| def update_white_list(filename): |
| cfg=[] |
| sbl=[] |
| fil=[] |
| curr_path = os.path.dirname(os.path.abspath(__file__)) |
| cmd = "rm -f " + options.white_list |
| print(cmd) |
| os.system(cmd) |
| if os.path.exists(options.checker_out + "file/summary.log"): |
| os.remove(options.checker_out + "file/summary.log") |
| if os.path.exists(options.checker_out + "symbol/gki_size_diff.txt"): |
| os.remove(options.checker_out + "symbol/gki_size_diff.txt") |
| if os.path.exists(options.checker_out + "symbol/gki_panic.txt"): |
| os.remove(options.checker_out + "symbol/gki_panic.txt") |
| if os.path.exists(options.checker_out + "symbol/mtk_panic.txt"): |
| os.remove(options.checker_out + "symbol/mtk_panic.txt") |
| if os.path.exists(options.checker_out + "config/mtk_cfg.txt"): |
| os.remove(options.checker_out + "config/mtk_cfg.txt") |
| print("Update File white list") |
| get_gki_denyfile() |
| os.chdir(options.kernel_path) |
| dump_diff_file() |
| os.chdir(curr_path) |
| with open(options.checker_out + "file/summary.log","r") as f: |
| for line in f.readlines(): |
| fil.append(line) |
| print("Update Symbol white list") |
| create_compare_file("Symbol", options.google_vmlinux, options.checker_out + "symbol/tmp/g_System.map") |
| create_compare_file("Symbol", options.mtk_vmlinux, options.checker_out + "symbol/tmp/m_System.map") |
| compare_System_map(options.checker_out + "symbol/tmp/g_System.map", options.checker_out + "symbol/tmp/m_System.map") |
| if os.path.exists(options.checker_out + "symbol/gki_size_diff.txt"): |
| with open(options.checker_out + "symbol/gki_size_diff.txt","r") as f: |
| for line in f.readlines(): |
| sbl.append(line.split()[0]) |
| if os.path.exists(options.checker_out + "symbol/mtk_size_diff.txt"): |
| with open(options.checker_out + "symbol/mtk_size_diff.txt","r") as f: |
| for line in f.readlines(): |
| sbl.append(line.split()[0]) |
| if os.path.exists(options.checker_out + "symbol/gki_panic.txt"): |
| with open(options.checker_out + "symbol/gki_panic.txt","r") as f: |
| for line in f.readlines(): |
| sbl.append(line.split()[0]) |
| if os.path.exists(options.checker_out + "symbol/mtk_panic.txt"): |
| with open(options.checker_out + "symbol/mtk_panic.txt","r") as f: |
| for line in f.readlines(): |
| sbl.append(line.split()[0]) |
| print("Update Config white list") |
| create_compare_file("Config", options.google_vmlinux, options.checker_out + "config/tmp/google_kconfig") |
| create_compare_file("Config", options.mtk_vmlinux, options.checker_out + "config/tmp/mtk_kconfig") |
| compare_config(options.checker_out + "config/tmp/google_kconfig", options.checker_out + "config/tmp/mtk_kconfig") |
| if os.path.exists(options.checker_out + "config/gki_cfg.txt"): |
| with open(options.checker_out + "config/gki_cfg.txt","r") as f: |
| for line in f.readlines(): |
| cfg.append(line.split()[0]) |
| if os.path.exists(options.checker_out + "config/mtk_cfg.txt"): |
| with open(options.checker_out + "config/mtk_cfg.txt","r") as f: |
| for line in f.readlines(): |
| if line.split()[0] not in cfg: |
| cfg.append(line.split()[0]) |
| with open("tmp.txt", "w") as w: |
| for c in cfg: |
| w.write("c " + c + '\n') |
| for f in fil: |
| w.write("f " + f) |
| for s in sbl: |
| w.write("s " + s + '\n') |
| |
| os.system("sort -u tmp.txt > " + filename) |
| os.system("rm tmp.txt") |
| |
| def getClangVersion(croot): |
| with open (croot+"/kernel-5.15/build.config.constants") as f: |
| for line in f.readlines(): |
| if 'CLANG_VERSION' in line: |
| return line.split('=')[1] |
| return '*********' #fixme |
| |
| def getExecuteOptions(self, args=[]): |
| parser = OptionParser() |
| croot = "" |
| if os.getenv('TOP') == None: |
| croot=os.path.dirname(os.path.abspath(__file__))+"/../.." |
| else: |
| croot=os.getenv('TOP') |
| |
| parser.add_option("-O", "--out", nargs=1, dest="checker_out", default=os.path.dirname(os.path.abspath(__file__))+"/checker_out/", |
| help="Checker output folder") |
| parser.add_option("-k", "--kpath", nargs=1, dest="kernel_path", default=croot+"/kernel-5.15/", |
| help="Kernel path") |
| parser.add_option("-t", "--tcpath", nargs=1, dest="tool_chain", default=croot+"/kernel/prebuilts-master/clang/host/linux-x86/clang-"+getClangVersion(croot).strip()+"/bin/", |
| help="Extract tool chain") |
| parser.add_option("-c", "--ct", nargs=1, dest="config_tool", default=croot+"/kernel-5.15/scripts/extract-ikconfig", |
| help="Config extract script") |
| parser.add_option("-g", "--gv", nargs=1, dest="google_vmlinux", default=croot+"/vendor/aosp_gki/kernel-5.15/aarch64/vmlinux-userdebug", |
| help="Google vmlinux location") |
| parser.add_option("-m", "--mv", nargs=1, dest="mtk_vmlinux", default=croot+"/out_krn/target/product/mgk_64_k515/obj/KERNEL_OBJ/kernel-5.15/vmlinux", |
| help="MTK vmlinux location") |
| parser.add_option("-a", "--ack", nargs=1, dest="ACK_SHA", default="", |
| help="SHA align Google ack") |
| parser.add_option("-w", "--white", nargs=1, dest="white_list", default=os.path.dirname(os.path.abspath(__file__))+"/gki_checker_white_list.txt", |
| help="white list location") |
| parser.add_option("-o", "--opt", nargs=1, dest="opt", default="all", |
| help="check option: 'config', 'file', 'symbol' or all(default)\n'update' for update white list.") |
| (options, args) = parser.parse_args() |
| return options |
| |
| #main function |
| if __name__ == "__main__": |
| start_time = datetime.datetime.now() |
| curr_path = os.path.dirname(os.path.abspath(__file__)) |
| options = getExecuteOptions(sys.argv[1:]) |
| options.checker_out = os.path.abspath(options.checker_out)+'/' |
| #options.ACK_SHA = get_sha(options.google_vmlinux) |
| |
| if options.opt == "update": |
| os.makedirs(options.checker_out+"file/google/", exist_ok=True) |
| os.makedirs(options.checker_out+"file/mtk/", exist_ok=True) |
| os.makedirs(options.checker_out+"file/tmp/", exist_ok=True) |
| os.makedirs(options.checker_out+"symbol/tmp/", exist_ok=True) |
| os.makedirs(options.checker_out+"config/tmp/", exist_ok=True) |
| update_white_list(options.white_list) |
| remove_tmp("symbol/") |
| remove_tmp("file/") |
| remove_tmp("config/") |
| else: |
| config_wlist ,symbol_wlist, file_wlist = read_white_list(options.white_list) |
| |
| if options.opt == "file": |
| os.makedirs(options.checker_out+"file/google/", exist_ok=True) |
| os.makedirs(options.checker_out+"file/mtk/", exist_ok=True) |
| os.makedirs(options.checker_out+"file/tmp/", exist_ok=True) |
| print("Check file") |
| get_gki_denyfile() |
| os.chdir(options.kernel_path) |
| dump_diff_file() |
| os.chdir(curr_path) |
| remove_tmp("file/") |
| elif options.opt == "config": |
| os.makedirs(options.checker_out+"config/tmp/", exist_ok=True) |
| print("Check Config") |
| create_compare_file("Config", options.google_vmlinux, options.checker_out + "config/tmp/google_kconfig") |
| create_compare_file("Config", options.mtk_vmlinux, options.checker_out + "config/tmp/mtk_kconfig") |
| compare_config(options.checker_out + "config/tmp/google_kconfig", options.checker_out + "config/tmp/mtk_kconfig") |
| remove_tmp("config/") |
| elif options.opt == "symbol": |
| os.makedirs(options.checker_out+"symbol/tmp/", exist_ok=True) |
| print("Check Symbol") |
| create_compare_file("Symbol", options.google_vmlinux, options.checker_out + "symbol/tmp/g_System.map") |
| create_compare_file("Symbol", options.mtk_vmlinux, options.checker_out + "symbol/tmp/m_System.map") |
| compare_System_map(options.checker_out + "symbol/tmp/g_System.map", options.checker_out + "symbol/tmp/m_System.map") |
| remove_tmp("symbol/") |
| elif options.opt == "all": |
| os.makedirs(options.checker_out+"file/google/", exist_ok=True) |
| os.makedirs(options.checker_out+"file/mtk/", exist_ok=True) |
| os.makedirs(options.checker_out+"file/tmp/", exist_ok=True) |
| os.makedirs(options.checker_out+"symbol/tmp/", exist_ok=True) |
| os.makedirs(options.checker_out+"config/tmp/", exist_ok=True) |
| print("Check file") |
| get_gki_denyfile() |
| os.chdir(options.kernel_path) |
| dump_diff_file() |
| os.chdir(curr_path) |
| print("Check Symbol") |
| create_compare_file("Symbol", options.google_vmlinux, options.checker_out + "symbol/tmp/g_System.map") |
| create_compare_file("Symbol", options.mtk_vmlinux, options.checker_out + "symbol/tmp/m_System.map") |
| compare_System_map(options.checker_out + "symbol/tmp/g_System.map", options.checker_out + "symbol/tmp/m_System.map") |
| print("Check Config") |
| create_compare_file("Config", options.google_vmlinux, options.checker_out + "config/tmp/google_kconfig") |
| create_compare_file("Config", options.mtk_vmlinux, options.checker_out + "config/tmp/mtk_kconfig") |
| compare_config(options.checker_out + "config/tmp/google_kconfig", options.checker_out + "config/tmp/mtk_kconfig") |
| remove_tmp("symbol/") |
| remove_tmp("file/") |
| remove_tmp("config/") |
| |
| end_time = datetime.datetime.now() |
| elapsedTime = end_time - start_time |
| mins, secs = divmod(elapsedTime.total_seconds(), 60) |
| print("Total time elapsed: "+str(int(mins))+" mins, "+str(int(secs))+" secs") |
| |
| if options.opt != "update" and checker_verify(): |
| sys.exit("Failed") |
| else: |
| sys.exit(0) |