navienginebsp/tools/testreference/lauterbach/symbolics.cmm
changeset 0 5de814552237
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/navienginebsp/tools/testreference/lauterbach/symbolics.cmm	Tue Sep 28 18:00:05 2010 +0100
@@ -0,0 +1,421 @@
+//
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:  
+//
+//////////////////////////////////////////////////////////////////////////////
+//
+// This script configures the autoloader for full symbolic debugging.  It is
+// designed to be used in conjunction with the board configuration system to
+// be found in configdialog.cmm.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+print "======================================================================="
+print "Generic symbol autoloader configuration script"
+
+global &_IS_BOOTLOADER
+global &_T32ROMDIR
+global &IsTextshell
+
+&IsTextshell=(0==1)
+
+if "&_IS_BOOTLOADER"==""
+	(
+	&_IS_BOOTLOADER=(0==1)
+	)
+
+; Start from clean
+symbol.reset
+symbol.autoload.reset
+
+; Add some special labels to various addresses so if an exception occurs it will me
+; immediately obvious as to what caused it
+symbol.new.function VECTORS 0xFFFF0000++0x1C
+symbol.new.label RESET 0xFFFF0000
+symbol.new.label UNDEF 0xFFFF0004
+symbol.new.label SWI 0xFFFF0008
+symbol.new.label PREFETCH_ABORT 0xFFFF000C
+symbol.new.label DATA_ABORT 0xFFFF0010
+symbol.new.label IRQ 0xFFFF0018
+symbol.new.label FIQ 0xFFFF001C
+
+; Get the image filename
+&_DIALOG_PATH=os.env(T32ROMDIR)
+
+if "&_DIALOG_PATH"==""
+	(
+	if "&_T32ROMDIR"==""
+		(
+		&_DIALOG_PATH="*.IMG"
+		)
+		else
+		(
+		&_DIALOG_PATH="&_T32ROMDIR"+"\*.IMG"
+		)
+	)
+else
+	(
+	&_DIALOG_PATH="&_DIALOG_PATH"+"\*.IMG"
+	)
+
+local &_SYMBOLICS_FILENAME
+&_SYMBOLICS_FILENAME="&RamImage"
+
+local &_SYMBOLICS_LOAD_ADDRESS
+&_SYMBOLICS_LOAD_ADDRESS="&RamAddr"
+
+if "&_SYMBOLICS_FILENAME"==""
+	(
+	print "Select EPOC image that is currently running:"
+
+	dialog.file &_DIALOG_PATH
+	entry &_SYMBOLICS_FILENAME
+
+	if "&_SYMBOLICS_FILENAME"==""
+		(
+		 ; disconnect from the board
+		 print "*** Aborted (no ROM image filename specified) ***"
+		 enddo
+		)
+	)
+
+; Check for a logfile with the same path and stem as the ROM name and if found use that.  Failing
+; that, check for a logfile with the same path but called romfile.log and if found, use that
+&_LOGBASENAME=string.cut("&_SYMBOLICS_FILENAME",-string.len(os.file.extension(&_SYMBOLICS_FILENAME)))
+&_LOGFILENAME="&_LOGBASENAME"+".log"
+
+if !os.file("&_LOGFILENAME")
+	(
+	&_LOGFILENAME=string.cut("&_SYMBOLICS_FILENAME",-string.len(os.file.name(&_SYMBOLICS_FILENAME)))
+	&_LOGFILENAME="&_LOGFILENAME"+"rombuild.log"
+
+	if !os.file("&_LOGFILENAME")
+		(
+		print "*** Log file not found.  Select logfile for this image ***"
+		&_DIALOG_PATH="&_SYMBOLICS_FILENAME"+"\*.log"
+		dialog.file &_DIALOG_PATH
+		entry &_LOGFILENAME
+		)
+	)
+
+if os.file("&_LOGFILENAME")
+	(
+	print "Using &_LOGFILENAME for symbols"
+	)
+else
+	(
+	print "*** Aborted (no logfile name specified) ***"
+	enddo
+	)
+
+; It's possible that the script guesses a right logfilename but the user has let
+; the log get out of date when compared to the image. Do a very quick compare on
+; the timestamps - this will reject guessed filenames if the minute rolls over.
+local &_DATE_IMAGE
+local &_DATE_LOG
+
+&_DATE_IMAGE=string.cut(os.file.date(&_SYMBOLICS_FILENAME), -2)
+&_DATE_LOG=string.cut(os.file.date(&_LOGFILENAME), -2)
+
+if "&_DATE_IMAGE"!="&_DATE_LOG"
+	(
+	print "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+	print "Would guess logfile was &_LOGFILENAME but not perfect time match"
+	print "Date image: &_DATE_IMAGE"
+	print "Date log: &_DATE_LOG"
+	print "Select rombuild.log for this image:"
+	print "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+	&_DIALOG_PATH="&_SYMBOLICS_FILENAME"+"\*.log"
+	dialog.file &_DIALOG_PATH
+	entry &_LOGFILENAME
+
+	if "&_LOGFILENAME"==""
+		(
+		print "*** Aborted (no logfile name specified) ***"
+		enddo
+		)
+
+	if os.file("&_LOGFILENAME")
+		(
+		print "Now using &_LOGFILENAME for symbols"
+		)
+	else
+		(
+		print "*** Aborted (no logfile name specified) ***"
+		enddo
+		)
+	)
+
+; parse the rombuild.log file to extract the rom checksum
+LOCAL &data &_BLANKS &_LOG_CHECKSUM
+&_BLANKS=0
+
+OPEN #1 &_LOGFILENAME /Read
+REPEAT
+(
+	READ #1 %line &data
+	; Okay, this is because there isn't a way of the read returning EOF
+	; the easiest solution is to count the number of blank lines and if
+	; it crosses a threshold assume that the end was reached.
+	if "&data"==""
+		(
+		 &_BLANKS=&_BLANKS+1
+		 if &_BLANKS>10
+		 (
+		  print "10 blank lines, assume EOF"
+		  goto endloop
+		 )
+		)
+	else
+		(
+		 &_BLANKS=0
+		 )
+
+	if (string.scan("&data", "bootldr",0)!=-1)
+		(
+		 &_IS_BOOTLOADER=(1==1)
+		)
+
+	if (string.scan("&data", "Checksum word:",0)!=-1)
+		(
+		 &_LOG_CHECKSUM=string.cut("&data", 25.)
+		 goto endloop
+		)
+)
+endloop:
+CLOSE #1
+
+if ("&_LOG_CHECKSUM"=="")
+	(
+	print "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+	print "Can't get checksum from rombuild.log - aborting"
+	print "Log: &_LOG_CHECKSUM"
+	print "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+	enddo
+	)
+
+if ("&_LOG_CHECKSUM"!="")
+	(
+	 &_LOG_CHECKSUM="0x"+string.upr("&_LOG_CHECKSUM")
+	)
+
+; Get the checksum from the board.  Yes, duplicating two lines - it takes more
+; lines of code to do the conditionals and variables required to record state
+; and it looks very strange
+local &_ROM_CHECKSUM
+
+; TODO - Temporary hack to get around NaviEngine problems
+if "&Platform"!="ne1_tb"
+	(
+	if run()
+		(
+		break
+		&_ROM_CHECKSUM=&_SYMBOLICS_LOAD_ADDRESS+0xA8
+		&_ROM_CHECKSUM=data.long(ad:&_ROM_CHECKSUM)
+		go
+		)
+	else
+		(
+		&_ROM_CHECKSUM=&_SYMBOLICS_LOAD_ADDRESS+0xA8
+		&_ROM_CHECKSUM=data.long(ad:&_ROM_CHECKSUM)
+		)
+
+	if (&_ROM_CHECKSUM!=&_LOG_CHECKSUM)
+		(
+		print "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+		print "Checksums don't match"
+		print "Rom: &_ROM_CHECKSUM"
+		print "Log: &_LOG_CHECKSUM"
+		print "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+		)
+	)
+
+; Try and find the root of the source.  This works relative to the "os" directory
+; to take into account different source code layouts.  It will work with substed
+; and non substed drives, and with Perforce style and CBR style source layouts.
+;
+; The root is determined from the value of the fully qualified ROM name as setup
+; in the &RamImage variable, as specified in the configdialog.cmm script.  This is
+; to take into account different source layouts and the fact that EPOCROOT may not
+; be == \
+
+local &epoc32
+local &os
+
+; Start by finding the "os" directory in the current qualified ROM name
+print "Scanning "+os.file.path(&_SYMBOLICS_FILENAME)+" for os source directory"
+&os=string.scan(os.file.path(&_SYMBOLICS_FILENAME),"os",0.)
+
+if (&os>=0x00)
+	(
+	&_BASELOC=string.mid(os.file.path(&_SYMBOLICS_FILENAME),0,&os)
+
+	if os.dir("&_BASELOC")
+		(
+		&IsTextshell=(1==1)
+		print "Using path &_BASELOC as a relative path to source"
+		)
+	else
+		(
+		&_BASELOC=""
+		)
+	)
+else
+	(
+	; Not found so assume we are using a CBR build and try for epoc32
+	print "Scanning "+os.file.path(&_SYMBOLICS_FILENAME)+" for epoc32 directory"
+	&epoc32=string.scan(os.file.path(&_SYMBOLICS_FILENAME),"epoc32",0.)
+
+	if (&epoc32>=0x00)
+		(
+		&_BASELOC=string.mid(os.file.path(&_SYMBOLICS_FILENAME),0,&epoc32)
+
+		if os.dir("&_BASELOC")
+			(
+			print "Using path &_BASELOC as a relative path to source"
+			)
+		else
+			(
+			&_BASELOC=""
+			)
+		)
+	)
+
+if "&_BASELOC"==""
+	(
+	print "No os source path found, guessing it is one of the usual ones..."
+	&_BASELOC="&driveletter\os"
+	if os.dir("&_BASELOC")
+		(
+		)
+	else
+		(
+		&_BASELOC="&driveletter\sf\os"
+		)
+	print "Using path &_BASELOC as a relative path to source"
+	)
+
+&_AUTOLOAD="/autoload"	; handles arm4 and armv5
+
+; Try to determine from the ROM name the CPU architecture is in use.  If we can't then assume that it's
+; the upcoming armv7
+local &_ARCH
+
+&flexible=""
+
+if string.scan(string.lwr("&_SYMBOLICS_FILENAME"),"arm4",0)!=-1
+	(
+	&_ARCH="arm4"
+	)
+else if string.scan(string.lwr("&_SYMBOLICS_FILENAME"),"armv5smp",0)!=-1
+	(
+	&_ARCH="armv5smp"
+	if ("&Platform"=="ne1_tb")
+		(
+		print "Detected Flexible Memory Model for NaviEngine SMP image"
+		&flexible="f"
+		)
+	)
+else if string.scan(string.lwr("&_SYMBOLICS_FILENAME"),"armv7",0)!=-1
+	(
+	&_ARCH="armv7"
+	)
+else
+	(
+	&_ARCH="armv5"
+	if ("&Platform"=="ne1_tb"&&string.scan(string.lwr("&_SYMBOLICS_FILENAME"),"fne1_tb",0)!=-1)
+		(
+		print "Detected Flexible Memory Model for NaviEngine unicore image"
+		&flexible="f"
+		)
+	)
+
+; Setup the source paths as determined automatically and also as specified by the user
+do sourcepaths.cmm
+
+local &epocRoot
+if os.dir("&driveletter\epoc32")
+(
+	&epocRoot="&driveletter\"
+)
+else
+(
+	&epocRoot="&_BASELOC"
+)
+
+; Determine the name of the bootstrap binary, using special handling if this is a bootloader image
+local &bootStrapFileName
+
+if &_IS_BOOTLOADER
+	(
+	&bootStrapFileName="&epocRoot"+"epoc32\release\"+"&_ARCH"+"\_"+"&flexible&Platform"+"_bootloader_bootrom.bin"
+	)
+else
+	(
+	&bootStrapFileName="&epocRoot"+"epoc32\release\"+"&_ARCH"+"\_"+"&flexible&Platform"+"_bootrom.bin"
+	)
+
+; Determine whether to use SBSv1 or SBSv2 symbol file
+local &symfilename
+
+do checksymbols.cmm "&bootStrapFileName"
+if "&symfilename"!=""
+	(
+	&bootStrapFileName="&symfilename"
+	)
+
+; Scan rombuild log file for modules & addresses
+symbol.AutoLoad.LOADEPOC &_LOGFILENAME "do "+os.ppd()+"&_AUTOLOAD "
+symbol.AutoLoad.CHECKEPOC "do "+os.ppd()+"&_AUTOLOAD " ; define dynamic autoloader
+symbol.AutoLoad.CHECK OFF				; switch off automatic process detection
+
+; If we are running a textshell image then we are probably a base engineer who has compile the image him
+; or herself, so the kernel symbolics will be available.  If so then load them now
+if &IsTextshell
+	(
+	symbol.autoload.touch "*ekern.exe*"
+	)
+
+; If the user has specified to load symbols for a particular module, load them now
+if "&AutoloadModule"!=""
+	(
+	print "Autoloading symbols for &AutoloadModule"
+	symbol.autoload.touch "&AutoloadModule"
+	)
+
+; Breakpoint on kernel faults - do this before any other symbol files get loaded
+; otherwise it could match on stub functions
+if (y.exist("Kern::Fault"))
+	(
+	B.S Kern::Fault /P /ONCHIP
+	)
+
+; Again, if we are running a textshell image then load the variant and bootstrap symbols
+if &IsTextshell
+	(
+	symbol.AutoLoad.TOUCH "*ecust*"
+
+	if os.file(&bootStrapFileName)
+		(
+		print "Loading bootstrap symbolics for &bootStrapFileName"
+		data.load.auto &bootStrapFileName &_SYMBOLICS_LOAD_ADDRESS /nocode /strippart 3 /noclear
+		)
+	else
+		(
+		print "*** Skipping bootstrap symbolics (can't find &bootStrapFileName) ***"
+		)
+	)
+
+symbol.cleanup
+enddo