[Feature][Modem]Update MTK MODEM V1.6 baseline version: MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6
MTK modem version: MT2735_IVT_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.tar.gz
RF modem version: NA
Change-Id: I45a4c2752fa9d1a618beacd5d40737fb39ab64fb
diff --git a/mcu/tools/MemoryUtility/MapFileParser.pm b/mcu/tools/MemoryUtility/MapFileParser.pm
new file mode 100644
index 0000000..80fd695
--- /dev/null
+++ b/mcu/tools/MemoryUtility/MapFileParser.pm
@@ -0,0 +1,1089 @@
+#!/usr/bin/perl
+#
+# Copyright Statement:
+# --------------------
+# This software is protected by Copyright and the information contained
+# herein is confidential. The software may not be copied and the information
+# contained herein may not be used or disclosed except with the written
+# permission of MediaTek Inc. (C) 2006
+#
+# BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+# NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+# SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+#
+# BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+# LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+#
+# THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+# WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+# LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+# RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+# THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+#
+#*****************************************************************************
+#*
+#* Filename:
+#* ---------
+#* MapFileParser.pm
+#*
+#* Project:
+#* --------
+#*
+#*
+#* Description:
+#* ------------
+#* This perl module is used to collect information from map file
+#*
+#*
+#* Author:
+#* -------
+#* Carl Kao (mtk08237)
+#*
+#****************************************************************************/
+use strict;
+BEGIN{push(@INC,'../../tools/', './tools/', './tools/MemoryUtility/')};
+use CommonUtility;
+
+package SymbolInfoTable;
+use constant SymbolName => 0;
+use constant Addr => 1;
+use constant ObjName => 2;
+use constant LibName => 3;
+use constant OutputSectionName => 4;
+use constant InputSectionName => 5;
+use constant Size => 6;
+
+package MapFileParser;
+
+my $VERNO = " u0.01";
+ # u0.01 , 2015/01/19, Initial revision for Memory Utility Refinement
+
+my $g_MAPPath;
+
+my %parent_of_symbol; #symbol info in "symbol table"
+my %parent_obj_of_symbol; #symbol info in "symbol table"
+my %parent_lib_of_symbol; #symbol info in "symbol table"
+my %contained_obj; # obj contained in lib
+my %related_lib; # lib related a obj
+my %obj_size; # obj total size
+my %lib_size; # lib total size
+my %region_obj_size;
+my %region_lib_size;
+my %region_contained_obj;
+my %region_obj;
+my %region_contained_lib;
+my @veneers;
+my %obj_pad;
+my %obj_lib_lookup;
+my $obj_pad_count = 0;
+my @pad;
+my %g_discard_symbols; #$inputsection.".".$obj => $nSize;
+
+my %obj_debuginfo;
+my %lib_debuginfo;
+my %OBJ_RO_Size; #{objname} => nSize
+my %LIB_RO_Size; #{libname} => nSize
+my %OBJ_RW_Size;
+my %LIB_RW_Size;
+my %OBJ_ZI_Size;
+my %LIB_ZI_Size;
+
+my %region_OBJ_RO_Size; #{regionname-objname} => nSize
+my %region_OBJ_RW_Size;
+my %region_OBJ_ZI_Size;
+
+my @sections; # input section
+
+my %symbol_info; #{$strSymbolName} => [strSymbolName, strAddress, strObjName, strLibName, strOutputSectionName, strInputSectionName, nInputSectionSize]
+my %symbol_lookup_table; #{$SymbolName.".".$strObjName.".".$strLibName} => [strSymbolName, strAddress, strObjName, strLibName, strOutputSectionName, strInputSectionName, nInputSectionSize]
+my %region_arribution;
+
+my $g_fill; #record ** zero fill ** part
+my %g_fill_info; #record all fill info.
+
+#****************************************************************************
+# oo >>> Finished
+#****************************************************************************
+return 1;
+
+#****************************************************************************
+# subroutine: MAP_die
+# sample code: (message, __FILE__, __LINE__)
+# input: $error_msg, $file, $line_no
+#****************************************************************************
+sub MAP_die
+{
+ my ($error_msg, $file, $line_no) = (@_);
+ &CommonUtil::error_handler($error_msg, $file, $line_no, 'MAP');
+}
+
+#****************************************************************************
+# subroutine: ParseMAP
+# input: MAP Path string
+# output: x
+#****************************************************************************
+sub initGlobalVariable
+{
+ %parent_of_symbol = ();
+ %parent_obj_of_symbol = ();
+ %parent_lib_of_symbol = ();
+ %contained_obj = ();
+ %related_lib = ();
+ %obj_size = ();
+ %lib_size = ();
+ %region_obj_size = ();
+ %region_lib_size = ();
+ %region_contained_obj = ();
+ %region_obj = ();
+ %region_contained_lib = ();
+ @veneers = ();
+ %obj_pad = ();
+ %obj_lib_lookup = ();
+ $obj_pad_count = 0;
+ @pad = ();
+ %obj_debuginfo = ();
+ %lib_debuginfo = ();
+ %OBJ_RO_Size = ();
+ %LIB_RO_Size = ();
+ %OBJ_RW_Size = ();
+ %LIB_RW_Size = ();
+ %OBJ_ZI_Size = ();
+ %LIB_ZI_Size = ();
+ %region_OBJ_RO_Size = ();
+ %region_OBJ_RW_Size = ();
+ %region_OBJ_ZI_Size = ();
+ @sections = ();
+ %g_discard_symbols = ();
+ %symbol_info = ();
+ %symbol_lookup_table = ();
+ %region_arribution = ();
+ $g_fill = undef;
+ %g_fill_info = ();
+}
+
+sub ParseMAP
+{
+ ($g_MAPPath) = @_;
+ initGlobalVariable();
+
+ if(defined $g_MAPPath and -e $g_MAPPath)
+ {
+ open (FILE_HANDLE, "<$g_MAPPath") or &MAP_die("$g_MAPPath: file error!", __FILE__, __LINE__);
+
+ my ($strPreSymbolName, $strPreExeRegion, $strPreInputSection,$strSymbolName) = (undef, undef, undef, undef);
+ my ($flag_end_group, $b_enter_reference_table, $b_enter_discard) = (1, 0, 0);
+
+ #since $strPreInputSection will be set back to undef after _ParseContent(), we need another variable to store it
+ my ($strObjName, $strLibName, $strInputSectionName, $nInputSectionSize, $strMergeName) = ("NOT_FOUND", undef, undef, undef, undef);
+
+ my $prefix = '(?:startup|unlikely)';#prefix of symbol, ex: .text.unlikely.UL1_SEND_MSG_TO_NVRAM
+
+ while (<FILE_HANDLE>)
+ {
+ my $strLine = $_;
+ if(/Discarded input sections/)
+ {
+ $b_enter_discard = 1; next;
+ }
+ elsif(/Memory Configuration/)
+ {
+ $b_enter_discard = 0; next;
+ }
+ elsif(/Memory map/)
+ {
+ $b_enter_discard = 0;
+ $flag_end_group = 0;
+ next;
+ }
+ elsif($b_enter_discard == 1)
+ {
+ $strPreSymbolName = _ParseDiscardInputSection($strLine, $strPreSymbolName);
+ }
+ elsif (/END GROUP/)
+ {
+ $flag_end_group = 0; next;
+ }
+ elsif ($flag_end_group)
+ {
+ next;
+ }
+ elsif (/Symbol\s+File/ or /Cross Reference Table/)
+ { #Symbol File
+ $b_enter_reference_table = 1; next;
+ }
+ elsif($b_enter_reference_table == 0 )
+ {
+ if(/^(\S+)/ and $strLine !~/^OUTPUT\(/)
+ {#ignore: OUTPUT(./build/MT6589_MD2_TDD128HSPA/SKYPA/bin/MT6589_MD2_TDD128HSPA_PCB01_MT6589_S00.elf elf32-littlearm)
+ $strPreExeRegion = $1; next;
+ }
+ elsif(/^\s+(\.\b\w+\b)(\.\b$prefix\b)?(?:\.([^\.\s]+))?(\.\d+)?/)
+ {# .text.AsnDecode_RRC_BSIC => $strPreInputSection = .text; $strSymbolName = AsnDecode_RRC_BSIC
+
+ $strInputSectionName = $1;
+ $strSymbolName = ($4)?$3.$4:$3 if($3 or $4);
+
+ #if symbol name and size are in same line, need to parse symbol size
+ #.rodata.off 0x913f3760 0x1 ./build/MT6297_EVB/NLWCTG_SAP/bin/lib/libatc.a(valatapi.obj)
+ next if ($strLine !~ /0x\w+/);
+ }
+ elsif(/^\s+(\S+)$/)
+ {# .debug_aranges
+ $strInputSectionName = $1; next;
+ }
+ elsif(/^\s+\*\*\s+merge\s+(\S+)$/)
+ {# ** merge strings
+ $strMergeName = $1; next
+ }
+
+ ($strObjName, $strLibName, $strInputSectionName, $nInputSectionSize, $strMergeName,$strSymbolName)
+ = _ParseContent($strLine, $strPreExeRegion, $strObjName, $strLibName, $strInputSectionName, $nInputSectionSize, $strMergeName,$strSymbolName);
+ }
+ else
+ {
+ my $tmp_ref;
+ ($strPreSymbolName,$tmp_ref) = _ParseSymboltable($_, $strPreSymbolName);
+ $parent_of_symbol{$strPreSymbolName}=$tmp_ref;
+ }
+ }
+ close FILE_HANDLE;
+ }
+ else
+ {
+ &MAP_die("MAP Path($g_MAPPath) doesn't exist", __FILE__, __LINE__);
+ }
+}
+
+sub _UpdateSize
+{
+ my ($href, $strKey, $strSize) = @_;
+ if(exists $href->{$strKey})
+ {
+ $href->{$strKey} += hex($strSize);
+ }
+ else
+ {
+ $href->{$strKey} = hex($strSize);
+ }
+}
+
+sub _ParseDiscardInputSection
+{
+ my ($strInput, $strPreLine) = @_;
+ chomp($strInput);
+ if($strInput =~ /^\s+(\S+)\s*$/)
+ {# .debug_aranges
+ # 0x0000000000000000 0x20 ./build/MT6589_MD2_TDD128HSPA/SKYPA/bin/lib/libsys_drv.a(bootarm_gcc.obj)
+ return $1;
+ }
+ elsif(/^\s+(0x\w+)/)
+ {
+ $strInput = $strPreLine . $strInput;
+ }
+ if (($strInput =~ /(\S+)\s+(0x\w+)\s+(0x\w+)\s+.*\\(.*)\((.*)\)/) ||
+ ($strInput =~ /(\S+)\s+(0x\w+)\s+(0x\w+)\s+.*\/(.*)\((.*)\)/))
+ { # C$$code 0x0000000000000000 0x210 ./build/MT6572_DEMO_TDD128HSPA/DEFAULT/bin/lib/libsys_drv.a(bootarm_gcc.obj)
+ my $lib = $4;
+ my $obj = $5;
+ my $nSize = hex($3);
+ my $inputsection = $1;
+ _UpdateDiscardSymbol($inputsection, $nSize, $obj, $lib);
+ }
+ return "";
+}
+
+sub _UpdateDiscardSymbol
+{
+ my ($inputsection, $nSize, $obj, $lib) = @_;
+ $g_discard_symbols{$obj.'$$'.$inputsection} = $nSize;
+}
+
+sub _ParseContent
+{
+ my ($strInput, $strPreExeRegion, $strObjName, $strLibName, $strInputSectionName, $nInputSectionSize, $strMergeName,$strSymbolName) = @_;
+ chomp($strInput);
+
+ ## parse lib, obj, symbol size
+ if (($strInput =~ /\s+(\S+)?\s+(0x\w+)\s+(0x\w+)\s+.*\\(.*)\((.*)\)/) ||
+ ($strInput =~ /\s+(\S+)?\s+(0x\w+)\s+(0x\w+)\s+.*\/(.*)\((.*)\)/))
+ {
+ #**********************************************************
+ # For beloew three cases:
+ # Case1:symbol and addr in same line
+ # .rodata.off 0x913f3760 0x1 ./build/MT6297_EVB/NLWCTG_SAP/bin/lib/libatc.a(valatapi.obj)
+ # Case2: symbol and addr in diff line
+ # .rodata.__FUNCTION__.108590
+ # 0x913f3764 0xb ./build/MT6297_EVB/NLWCTG_SAP/bin/lib/libatc.a(valatceng.obj)
+ # Case3: contain input section
+ # EXTRAM_TXDATA 0x09e26864 0x63c8 ./mtk_rel/MT6297_EVB/NLWCTG_SAP/TARGET/lib//libgas_tdd.a(rlc_main.obj)
+ #**********************************************************
+ my $base = $2;
+ my $size = $3;
+ my $obj = $5;
+ $strLibName = $4;
+ $nInputSectionSize = hex($size);
+ $strObjName = $obj;
+
+ $strInputSectionName = $1 if ($1 and $1 !~ /\./);#case3:update input section.
+
+ $obj_pad{++$obj_pad_count} = $base;
+ $obj_lib_lookup{$base} = [$strObjName,$strLibName];
+ &ParseObjLib($strPreExeRegion, $strInput);
+ push(@sections, $strInputSectionName);
+
+ if($g_fill)
+ {
+ $g_fill_info{$base} = [$g_fill->[0], $g_fill->[1], , $region_arribution{$strPreExeRegion}, $obj, $strLibName];
+ $g_fill = undef;
+ }
+
+ _UpdateRORWZISize($strPreExeRegion, $base, $obj, $strLibName, $size);
+ }
+ elsif ($strInput =~ /(0x\w+)\s+(0x\w+)\s+linker stubs/)
+ {
+ &ParseObjLib($strPreExeRegion, $strInput);
+ _UpdateRORWZISize($strPreExeRegion, $1, "*stub*", undef, $2);
+ }
+ elsif(($strPreExeRegion =~ "EXTSRAM_L1DSP_ZI") and
+ (($strInput =~ /\*fill\*\s+(0x\w+)\s+(0x\w+)/) or ($strInput =~ /\*\*\s+zero\s+fill\s+(0x\w+)\s+(0x\w+)/)))
+ {
+ my $base = $1;
+ my $size = $2;
+ my $obj = "DSP";
+ $strLibName = "DSP";
+ $nInputSectionSize = hex($size);
+ $strObjName = $obj;
+
+ push(@sections, $strInputSectionName);
+
+ _UpdateRORWZISize($strPreExeRegion, $base, $obj, $strLibName, $size);
+ }
+ elsif(($strInput =~ /\*fill\*\s+(0x\w+)\s+(0x\w+)/) or ($strInput =~ /\*\*\s+zero\s+fill\s+(0x\w+)\s+(0x\w+)/))
+ {
+ $obj_pad{++$obj_pad_count} = $1;
+ push(@pad, $obj_pad_count);
+ #record fill info
+ $g_fill = [$1,hex($2)];
+ _UpdateRORWZISize($strPreExeRegion, $1, "*fill*", undef, $2);
+ }
+ elsif($g_fill && $strInput =~ /\s+(0x\w+)\s+(\S+\$\$\S+)\s+/)
+ {
+ #record fill info in hash table.
+ #there are same address for different linker symbols, in case get wrong info, here use address.symbol as the key of hash.
+ $g_fill_info{$1.".".$2} = [$g_fill->[0], $g_fill->[1], $region_arribution{$strPreExeRegion}, $2];
+ $g_fill = undef;
+ }
+
+ ## parse symbol
+ if(!defined $strMergeName)
+ {
+ ($strSymbolName, $strObjName, $strLibName, $strPreExeRegion, $strInputSectionName, $nInputSectionSize)
+ = _ParseSymbolInfo($strInput, $strSymbolName, $strObjName, $strLibName, $strPreExeRegion, $strInputSectionName, $nInputSectionSize);
+ }
+
+ ## parse ** merge
+ if(defined $strMergeName)
+ {
+ if ($strInput =~ /^\s+(0x\w+)\s+(0x\w+)/)
+ {
+ $obj_pad{++$obj_pad_count} = $1;
+ push(@pad, $obj_pad_count);
+ _UpdateRORWZISize($strPreExeRegion, $1, "*$strMergeName*", undef, $2);
+ }
+ $strMergeName =undef;
+ }
+
+ return ($strObjName, $strLibName, $strInputSectionName, $nInputSectionSize, $strMergeName,$strSymbolName);
+}
+
+sub _UpdateRORWZISize
+{
+ my ($strPreExeRegion, $base, $obj, $lib, $size) = @_;
+ $lib = $obj if(!defined $lib);
+ my $key = $strPreExeRegion."-".$obj;
+ my $objkey = $obj."-".$lib;
+
+ if($strPreExeRegion =~ /^\.debug/)
+ {
+ _UpdateSize(\%obj_debuginfo, $obj, $size);
+ _UpdateSize(\%lib_debuginfo, $lib, $size);
+ }
+ elsif(isZI($strPreExeRegion))
+ {
+ return if($base eq "0x0000000000000000");
+ _UpdateSize(\%OBJ_ZI_Size, $obj, $size);
+ _UpdateSize(\%LIB_ZI_Size, $lib, $size);
+ _UpdateSize(\%region_OBJ_ZI_Size, $key, $size);
+ _UpdateSize(\%obj_size, $objkey, $size);
+ $region_arribution{$strPreExeRegion} = "ZI";
+ }
+ elsif(isRW($strPreExeRegion))
+ {
+ return if($base eq "0x0000000000000000");
+ _UpdateSize(\%OBJ_RW_Size, $obj, $size);
+ _UpdateSize(\%LIB_RW_Size, $lib, $size);
+ _UpdateSize(\%region_OBJ_RW_Size, $key, $size);
+ _UpdateSize(\%obj_size, $objkey, $size);
+ $region_arribution{$strPreExeRegion} = "RW";
+ }
+ elsif(isRO($strPreExeRegion))
+ {
+ return if($base eq "0x0000000000000000" and $obj !~ /bootarm/i);
+ _UpdateSize(\%OBJ_RO_Size, $obj, $size);
+ _UpdateSize(\%LIB_RO_Size, $lib, $size);
+ _UpdateSize(\%region_OBJ_RO_Size, $key, $size);
+ _UpdateSize(\%obj_size, $objkey, $size);
+ $region_arribution{$strPreExeRegion} = "RO";
+ }
+ ParseInputSection($strPreExeRegion, $obj, $lib, $size);
+}
+
+sub isZI
+{
+ my ($strRegionName) = @_;
+ my $bRet = ($strRegionName =~ /ZI|\.bss|EXTSRAM_DSP/);
+ return $bRet;
+}
+sub isRW
+{
+ my ($strRegionName) = @_;
+ my $bRet = 0;
+ $bRet = 1 if(!isZI($strRegionName) and $strRegionName =~ /DSPRAM|EXTSRAM|DATA|RW/);
+ return $bRet;
+}
+sub isRO
+{
+ my ($strRegionName) = @_;
+ my $bRet = 0;
+ $bRet = 1 if(!isZI($strRegionName) and !isRW($strRegionName)
+ and ($strRegionName !~/\.ARM\.attributes|\.comment|\.debug|\.stab/));
+ return $bRet;
+}
+
+
+#****************************************************************************
+# subroutine: _ParseSymbolInfo
+# input:
+# output: N/A
+#****************************************************************************
+sub _ParseSymbolInfo
+{
+ my ($strInput, $strSymbolName, $strObjName, $strLibName, $strPreExeRegion, $strInputSectionName, $nInputSectionSize) = @_;
+ my $skip_pattern = "Image\\$\\$|\\$\\$Base|\\$\\$Limit|\\$\\$Length|load address|\ LONG\ ";
+
+ if($strSymbolName and
+ (($strInput =~ /^\s+(?:\S+\s+)?(0x\w+)\s+(0x\w+)\s+.*\\(.*)\((.*)\)/) ||
+ ($strInput =~ /^\s+(?:\S+\s+)?(0x\w+)\s+(0x\w+)\s+.*\/(.*)\((.*)\)/)))
+ { #for below case
+ # 0x911c5d06 0x214 ./mtk_rel/MT6297_EVB/NLWCTG_SAP/TARGET/lib/liburr_fdd.a(slce_configuration_controller.obj)
+ # .bss.fsm_desc 0x23c30ac4 0xec ./build/MT6297_EVB/NLWCTG_SAP/bin/lib/libatc.a(valatud.obj)
+ my $strAddress = $1;
+ my $symbol_lookup_key = $strSymbolName.".".$strObjName.".".$strLibName;
+
+ if($symbol_lookup_table{$symbol_lookup_key})
+ {
+ if($symbol_lookup_table{$symbol_lookup_key}->[1] > $strAddress)
+ {
+ delete $symbol_info{$symbol_lookup_table{$symbol_lookup_key}->[1].".".$strSymbolName};
+ }
+ else
+ {
+ $strAddress = $symbol_lookup_table{$symbol_lookup_key}->[1];
+ }
+
+ $nInputSectionSize += $symbol_lookup_table{$symbol_lookup_key}->[6];
+ }
+
+ $symbol_lookup_table{$symbol_lookup_key} = [$strSymbolName, $strAddress, $strObjName, $strLibName, $strPreExeRegion, $strInputSectionName, $nInputSectionSize];
+ $symbol_info{$strAddress.".".$strSymbolName} = [$strSymbolName, $strAddress, $strObjName, $strLibName, $strPreExeRegion, $strInputSectionName, $nInputSectionSize];
+ $strSymbolName = undef;
+ }
+ elsif($strInput =~ /^\s+(0x\w+)\s+(\w+)$/ and $strInput !~/$skip_pattern/)
+ {
+ # for below case
+ # 0x00024054 p_SLILM
+ my $strAddress = $1;
+ my $SymbolName = $2;
+ my $symbol_lookup_key = $SymbolName.".".$strObjName.".".$strLibName;
+
+ if(!$symbol_lookup_table{$symbol_lookup_key})
+ {# .bss 0x2443e1c0 0x20 ./build/MT6297_EVB/NLWCTG_SAP/bin/lib/libdevdrv.a(drv_mdcirq.obj)
+ # 0x2443e1c0 drv_mdcirq_activate_lisr_lock
+ $nInputSectionSize = hex(0);
+ $symbol_lookup_table{$symbol_lookup_key} = [$SymbolName, $strAddress, $strObjName, $strLibName, $strPreExeRegion, $strInputSectionName, $nInputSectionSize];
+ $symbol_info{$strAddress.".".$SymbolName} = [$SymbolName, $strAddress, $strObjName, $strLibName, $strPreExeRegion, $strInputSectionName, $nInputSectionSize];
+ }
+ }
+
+ return ($strSymbolName, $strObjName, $strLibName, $strPreExeRegion, $strInputSectionName, $nInputSectionSize);
+}
+
+
+#****************************************************************************
+# subroutine: _ParseSymboltable
+# input: ($strInput, $strPreSymbolName)
+# output: N/A
+#****************************************************************************
+sub _ParseSymboltable
+{
+ my ($strInput, $strPreSymbolName) = @_;
+ if ($strInput =~ /(\S+)\s+.*[\/|\\](.*)\((.*)\)/)
+ {
+ $strPreSymbolName = $1;
+ my @lib_obj = [$2,$3];
+ my @obj_lib = [$3,$2];
+ push(@{$parent_of_symbol{$1}}, @lib_obj);
+ push(@{$parent_obj_of_symbol{$1}}, $3);
+ push(@{$parent_lib_of_symbol{$1}}, $2);
+ }
+ elsif ($strInput =~ /\s+.*[\/|\\](.*)\((.*)\)/)
+ {
+ my @lib_obj = [$1,$2];
+ my @obj_lib = [$2,$1];
+ push(@{$parent_of_symbol{$strPreSymbolName}}, @lib_obj);
+ push(@{$parent_obj_of_symbol{$strPreSymbolName}}, $2);
+ push(@{$parent_lib_of_symbol{$strPreSymbolName}}, $1);
+ }
+ return ($strPreSymbolName, $parent_of_symbol{$1} );
+}
+
+#****************************************************************************
+# subroutine: ListAllSections
+# input: N/A
+# output: N/A
+#****************************************************************************
+sub ListAllSections
+{
+ my %count;
+ my @uni_sections = grep { ++$count{ $_ } < 2; } @sections;
+ return \@uni_sections;
+}
+
+#****************************************************************************
+# subroutine: ListAllLoadRegion (not support this function)
+# input: N/A
+# output: N/A
+#****************************************************************************
+sub ListAllLoadRegion
+{
+ return undef;
+}
+
+#****************************************************************************
+# subroutine: ListPadInfo
+# input: N/A
+# output: array reference
+# for map file, array content:[array1,array2,...]
+# array1:[strPadBaseAddress,[strPreObjName,strPreLibName],strPreObjAddress,[strPostObjName,strPostLibName],strPostObjAddress]
+#****************************************************************************
+sub ListPadInfo
+{
+ my @padstring;
+ foreach my $temp(@pad)
+ {
+ my $pad_address = $obj_pad{$temp};
+ my $previous = $obj_pad{$temp - 1};
+ my $post = $obj_pad{$temp + 1};
+ my @pre_obj = $obj_lib_lookup{$previous};
+ my @post_obj = $obj_lib_lookup{$post};
+ # next if(!$pad_address);
+ my @padinfo = [$pad_address,@pre_obj,$previous,@post_obj,$post];
+ push (@padstring, @padinfo);
+ }
+ return \@padstring;
+}
+
+#****************************************************************************
+# subroutine: StoreIntoTempFile
+# input: N/A
+# output: temp files which contain perl data structure
+#****************************************************************************
+use Storable qw/lock_nstore/;
+sub StoreIntoTempFile
+{
+ my ($strPath) = @_;
+ my $file = $strPath."\\MapParser_Temp.dat";
+ my %tempfile;
+ $tempfile{"parent_reference"} = \%parent_of_symbol;
+ $tempfile{"parent_obj_reference"} = \%parent_obj_of_symbol;
+ $tempfile{"parent_lib_reference"} = \%parent_lib_of_symbol;
+ $tempfile{"veneer"} = \@veneers;
+ $tempfile{"obj_in_exeregion"} = \%region_contained_obj;
+ $tempfile{"lib_in_exeregion"} = \%region_contained_lib;
+ $tempfile{"obj_by_lib"} = \%contained_obj;
+ $tempfile{"lib_by_obj"} = \%related_lib;
+
+ lock_nstore \%tempfile, $file;
+}
+
+#****************************************************************************
+# subroutine: ParseObjLib
+# input: Execution Region Name, $strLine
+# output: N/A
+#****************************************************************************
+sub ParseObjLib
+{
+ my ($strPreExeRegion, $strLine) = @_;
+ if (($strPreExeRegion !~ /\.ARM\.attributes/) and ($strPreExeRegion !~ /\.comment/)
+ and ($strPreExeRegion !~ /^\.debug/) and ($strPreExeRegion !~ /^\.stab/))
+ {
+ if ((/(0x\w+)\s+(0x\w+)\s+.*\\(.*)\((.*)\)/) || (/(0x\w+)\s+(0x\w+)\s+.*\/(.*)\((.*)\)/))
+ {
+ my $lib = $3;
+ my $obj = $4;
+ $contained_obj{$lib}{$obj} = 1;
+ $related_lib{$obj}{$lib} = 1;
+ }
+ elsif(/(0x\w+)\s+(0x\w+)\s+linker stubs/)
+ {## C$$code.stub 0x7000a258 0x8 linker stubs
+ push (@veneers, [$strPreExeRegion, $1, hex($2)]);
+ }
+ }
+}
+
+#****************************************************************************
+# subroutine: ParseInputSection
+# input: Execution Region Name, $strLine
+# output: N/A
+#****************************************************************************
+sub ParseInputSection
+{
+ my ($strExeRegionName, $obj, $lib, $size) = @_;
+ return if(!defined $strExeRegionName); ### setting for $strExeRegionName = undef
+
+ $region_contained_obj{$strExeRegionName}{$obj} = 1;
+ $region_contained_lib{$strExeRegionName}{$lib} = 1;
+
+ my $obj_key = $strExeRegionName."-".$obj."-".$lib;
+ my $lib_key = $strExeRegionName."-".$lib;
+ _UpdateSize(\%region_obj_size, $obj_key, $size);
+ _UpdateSize(\%region_lib_size, $obj_key, $size);
+}
+
+sub GetDiscardSymbol
+{
+ my ($discard_href) = @_;
+ %$discard_href = %g_discard_symbols;
+}
+
+#****************************************************************************
+# subroutine: GetSymbolInfo
+# input:
+#
+#****************************************************************************
+sub GetSymbolInfo
+{
+ my ($symbol_key) = @_;
+ my @symbol_info_array = @{$symbol_info{$symbol_key}} if $symbol_info{$symbol_key};
+
+ return @symbol_info_array;
+}
+
+#****************************************************************************
+# subroutine: GetFillInfo
+# input:
+#
+#****************************************************************************
+sub GetFillInfo
+{
+ return \%g_fill_info;
+}
+
+#****************************************************************************
+# subroutine: GetParentOfSymbol
+# input: Execution Region Name, flag (all/lib/obj)
+# output: (Object Name, Library Name) which refers to given symbol (flag = all)
+# Object Name which refers to given symbol (flag = obj)
+# Library Name which refers to given symbol (flag = lib)
+#****************************************************************************
+sub GetParentOfSymbol
+{
+ # Name Size VMA LMA File off Algn
+ my ($strSymName, $flag) = @_;
+
+ my $parent_array;
+ if($flag eq "all")
+ {
+ $parent_array = $parent_of_symbol{$strSymName};
+ }
+ elsif($flag eq "lib")
+ {
+ $parent_array = $parent_lib_of_symbol{$strSymName};
+ }
+ elsif($flag eq "obj")
+ {
+ $parent_array = $parent_obj_of_symbol{$strSymName};
+ }
+ return $parent_array;
+}
+
+#****************************************************************************
+# subroutine: GetChildOfSymbol
+# input: symbol name
+# output: undef(not support this function)
+#****************************************************************************
+sub GetChildOfSymbol
+{
+ my ($strSymbolName) = @_;
+ return undef;
+}
+
+#****************************************************************************
+# subroutine: ListObjByLib
+# input: Library Name
+# output: Objects array reference
+#****************************************************************************
+sub ListObjByLib
+{
+ my ($lib_name) = @_;
+ my @obj_array = keys %{$contained_obj{$lib_name}};
+ return \@obj_array;
+}
+
+#****************************************************************************
+# subroutine: ListLibByObj
+# input: Object Name
+# output: Library array reference
+#****************************************************************************
+sub ListLibByObj
+{
+ my ($obj_name) = @_;
+ my @lib_array = keys %{$related_lib{$obj_name}};
+ return \@lib_array;
+}
+
+#****************************************************************************
+# subroutine: ListObjLibByAddr
+# input: symbol address
+# output: objeck and lib info
+#****************************************************************************
+sub ListObjLibByAddr
+{
+ my ($strAddress) = @_;
+ my @obj_lib_by_addr = @{$obj_lib_lookup{$strAddress}} if $obj_lib_lookup{$strAddress};
+
+ return \@obj_lib_by_addr;
+}
+
+#****************************************************************************
+# subroutine: GetTotalSizeByObj
+# input: Object Name, Library Name
+# output: Total size of given object
+# (excluding size in .comment, .ARM.attribut,
+# execution region which begins with .debug or .stab)
+#****************************************************************************
+sub GetTotalSizeByObj
+{
+ my ($obj_name, $lib_name) = @_;
+ my $key = $obj_name."-".$lib_name;
+ my $obj_size = $obj_size{$key};
+ return $obj_size;
+}
+
+#****************************************************************************
+# subroutine: GetTotalSizeByLib
+# input: Library Name
+# output: Total size of given library
+# (excluding size in .comment, .ARM.attribut,
+# execution region which begins with .debug or .stab)
+#****************************************************************************
+sub GetTotalSizeByLib
+{
+ my ($lib_name) = @_;
+ my $obj_array = $contained_obj{$lib_name};
+ foreach my $temp (@$obj_array)
+ {
+ my $strObjSize = CommonUtil::Dec2Hex($obj_size{$temp});
+ _UpdateSize(\%lib_size, $lib_name, $strObjSize);
+ }
+ return $lib_size{$lib_name};
+}
+
+#****************************************************************************
+# subroutine: GetObjByExeRegion
+# input: Execution Region Name
+# output: objects which given execution region contains
+#****************************************************************************
+sub GetObjByExeRegion
+{
+ my ($strExeRegionName) = @_;
+ my @obj_array = keys %{$region_contained_obj{$strExeRegionName}};
+ return \@obj_array;
+}
+
+#****************************************************************************
+# subroutine: GetLibByExeRegion
+# input: Execution Region Name
+# output: libraries which given execution region contains
+#****************************************************************************
+sub GetLibByExeRegion
+{
+ my ($strExeRegionName) = @_;
+ my @lib_array = keys %{$region_contained_lib{$strExeRegionName}};
+ return \@lib_array;
+}
+
+#****************************************************************************
+# subroutine: GetObjSizeByExeRegion
+# input: ExeRegion Name, Object Name, Library Name
+# output: size of object in given execution region
+#****************************************************************************
+sub GetObjSizeByExeRegion
+{
+ my ($strExeRegion, $strObj, $strLib) = @_;
+ my $string = $strExeRegion."-".$strObj."-".$strLib;
+ my $obj_size = $region_obj_size{$string};
+ return $obj_size;
+}
+
+#****************************************************************************
+# subroutine: GetLibSizeByExeRegion
+# input: ExeRegion Name, Library Name
+# output: size of library in given execution region
+#****************************************************************************
+sub GetLibSizeByExeRegion
+{
+ my ($strExeRegion, $strLib) = @_;
+ my $string = $strExeRegion."-".$strLib;
+ my $lib_size = $region_lib_size{$string};
+ return $lib_size;
+}
+
+#****************************************************************************
+# subroutine: GetObjSizeByCatExeRegion
+# input: $strRegionName: Execution Name (Case sensitive)
+# $strCategory: RO/RW/ZI (Case sensitive)
+# output: ObjCateSize Hash Reference
+#****************************************************************************
+sub GetObjSizeByCatExeRegion
+{
+ my ($strERName, $strCategory) = @_;
+ my %ObjSize; # {strObjName} => Size
+
+ my $included_obj_aref = &GetObjByExeRegion($strERName);
+ my $region_OBJ_href = undef;
+ $region_OBJ_href = \%region_OBJ_ZI_Size if(isZI($strERName) and $strCategory =~ /ZI/i);
+ $region_OBJ_href = \%region_OBJ_RW_Size if(isRW($strERName) and $strCategory =~ /RW/i);
+ $region_OBJ_href = \%region_OBJ_RO_Size if(isRO($strERName) and $strCategory =~ /RO/i);
+
+ if(defined $region_OBJ_href)
+ {
+ foreach my $temp(@$included_obj_aref)
+ {
+ my $key = $strERName."-".$temp;
+ if(exists $region_OBJ_href->{$key})
+ {
+ $ObjSize{$temp} = $region_OBJ_href->{$key};
+ }
+ else
+ {
+ $ObjSize{$temp} = 0;
+ }
+ }
+ }
+ return \%ObjSize;
+}
+
+#****************************************************************************
+# subroutine: GetVeneerInfo
+# input: N/A
+# output: [Execution Region, Base Address, Size] list for veneer
+#****************************************************************************
+sub GetVeneerInfo
+{
+ return \@veneers;
+}
+
+#****************************************************************************
+# subroutine: GetExeRegionAttr
+# input: N/A
+# output: {region_name} = region attribution
+#****************************************************************************
+sub GetExeRegionAttr
+{
+ return \%region_arribution;
+}
+
+#****************************************************************************
+# subroutine: ListObjLibBySymbol
+# input: $strSymName: Symbol Name (Case sensitive)
+# output: for map file, output array reference
+# array content:[[strObjName1,strLibName1],[strObjName2,strLibName2],...]
+#****************************************************************************
+sub ListObjLibBySymbol
+{
+ print "[Error] not support any more\n";
+ return undef;
+}
+
+#****************************************************************************
+# subroutine: GetLoadRegionInfo - Get Load Region information
+# input: N/A
+# output: undef(not support this function)
+#****************************************************************************
+sub GetLoadRegionInfo
+{
+ return undef;
+}
+
+#****************************************************************************
+# subroutine: GetTotalROSize - Get total RO size
+# input: $bNeedString: 1=Return string, 0/default/no input=Return int
+# output: undef(not support this function)
+#****************************************************************************
+sub GetTotalROSize
+{
+ my ($bNeedString) = @_;
+ return undef;
+}
+
+#****************************************************************************
+# subroutine: GetTotalRWZISize - Get total RWZI size
+# input: $bNeedString: 1=Return string, 0/default/no input=Return int
+# output: undef(not support this function)
+#****************************************************************************
+sub GetTotalRWZISize
+{
+ my ($bNeedString) = @_;
+ return undef;
+}
+
+#****************************************************************************
+# subroutine: GetTotalROMSize - Get total ROM size
+# input: $bNeedString: 1=Return string, 0/default/no input=Return int
+# output: undef(not support this function)
+#****************************************************************************
+sub GetTotalROMSize
+{
+ my ($bNeedString) = @_;
+ return undef;
+}
+
+#****************************************************************************
+# subroutine: GetObjDebugInfoSize
+# input: $strObjName: Obj Name (Case sensitive)
+# output: debug info size for given obj
+#****************************************************************************
+sub GetObjDebugInfoSize
+{
+ my ($strObjName) = @_;
+ my $DebugInfoSize = $obj_debuginfo{$strObjName};
+ return $DebugInfoSize;
+}
+
+#****************************************************************************
+# subroutine: ListObjSummaryInfo
+# input: obj name, flag represents which column to show
+# flag = "RO"
+# = "RW"
+# = "ZI"
+# = "Debug"
+# output: RO/RW/ZI/Debug size for given obj
+#****************************************************************************
+sub ListObjSummaryInfo
+{
+ my ($strName, $flag) = @_;
+ my $nSize = 0;
+ if ($flag =~ /RO/i)
+ {
+ $nSize = $OBJ_RO_Size{$strName};
+ }
+ elsif ($flag =~ /RW/i)
+ {
+ $nSize = $OBJ_RW_Size{$strName};
+ }
+ elsif ($flag =~ /ZI/i)
+ {
+ $nSize = $OBJ_ZI_Size{$strName};
+ }
+ elsif ($flag eq "Debug")
+ {
+ $nSize = $obj_debuginfo{$strName};
+ }
+ return $nSize;
+}
+
+#****************************************************************************
+# subroutine: ListLibSummaryInfo
+# input: lib name, flag represents which column to show
+# flag = "RO"
+# = "RW"
+# = "ZI"
+# = "Debug"
+# output: RO/RW/ZI/Debug size for given lib
+#****************************************************************************
+sub ListLibSummaryInfo
+{
+ my ($strLibName, $flag) = @_;
+ my $nSize = 0;
+ if ($flag =~ /RO/i)
+ {
+ $nSize = $LIB_RO_Size{$strLibName};
+ }
+ elsif ($flag =~ /RW/i)
+ {
+ $nSize = $LIB_RW_Size{$strLibName};
+ }
+ elsif ($flag =~ /ZI/i)
+ {
+ $nSize = $LIB_ZI_Size{$strLibName};
+ }
+ elsif ($flag eq "Debug")
+ {
+ $nSize = $lib_debuginfo{$strLibName};
+ }
+ return $nSize;
+}
+
+#****************************************************************************
+# subroutine: GrepSymbolByInputSection
+# input: input section name represent in regular expression
+# ex: INTSRAM_ROCODE.*
+# INTSRAM_ROCODE_A
+# INTSRAM_ROCODE_B
+#
+# output: symbol info array reference in order of address in the following format:
+# [[$strSymbolName, $nSymbolAddr, $strObjName, $strLibName, $strOutputSectionName, $strInputSectionName, $nInputSectionSize], ...]
+#****************************************************************************
+sub GrepSymbolByInputSection
+{
+ my ($strSectionNameInRegularExp) = @_;
+ my @SymInfoKeys = sort { hex($symbol_info{$a}->[SymbolInfoTable::Addr]) <=> hex($symbol_info{$b}->[SymbolInfoTable::Addr]) }
+ grep{$symbol_info{$_}->[SymbolInfoTable::InputSectionName] =~ /$strSectionNameInRegularExp/} keys %symbol_info;
+ #map {print $_."\n"} @SymInfoKeys;
+ my @SymInfo = map {$symbol_info{$_}} @SymInfoKeys;
+ return \@SymInfo;
+}
+
+#****************************************************************************
+# subroutine: GrepSymbolByOutputSection
+# input: input section name represent in regular expression
+# ex: CACHED_EXTSRAM_L2CACHE_LOCK_DATA
+# CACHED_EXTSRAM_L2CACHE_LOCK_DATA
+# CACHED_EXTSRAM_L2CACHE_LOCK_DATA_ZI
+#
+# output: symbol info array reference in order of address in the following format:
+# [[$strObjName, $strLibName], [$strObjName, $strLibName] ...]
+#****************************************************************************
+sub GrepSymbolByOutputSection
+{
+ my ($strSectionNameInRegularExp) = @_;
+ my @SymInfoKeys = sort { hex($symbol_info{$a}->[SymbolInfoTable::Addr]) <=> hex($symbol_info{$b}->[SymbolInfoTable::Addr]) }
+ grep{$symbol_info{$_}->[SymbolInfoTable::OutputSectionName] =~ /$strSectionNameInRegularExp/} keys %symbol_info;
+ #map {print $_."\n"} @SymInfoKeys;
+ my @SymInfo = map {$symbol_info{$_}} @SymInfoKeys;
+ return \@SymInfo;
+}
+