Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Leif Lindholm <leif.lindholm@linaro.org> Signed-off-by: Olivier Martin <olivier.martin@arm.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15241 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			188 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//
 | 
						|
// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
 | 
						|
//  
 | 
						|
//  This program and the accompanying materials
 | 
						|
//  are licensed and made available under the terms and conditions of the BSD License
 | 
						|
//  which accompanies this distribution.  The full text of the license may be found at
 | 
						|
//  http://opensource.org/licenses/bsd-license.php
 | 
						|
//
 | 
						|
//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | 
						|
//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
//
 | 
						|
 | 
						|
  ENTRY &ram_start &ram_size
 | 
						|
 | 
						|
  ;If system is running then stop the execution so we can load symbols.
 | 
						|
  break
 | 
						|
  
 | 
						|
  ;Reset all windows
 | 
						|
  WINPAGE.RESET
 | 
						|
  
 | 
						|
  AREA.Reset
 | 
						|
  AREA.Create SYMBOL 300. 100.
 | 
						|
  AREA.View SYMBOL
 | 
						|
  AREA.Select SYMBOL
 | 
						|
  SYS.Option BE OFF
 | 
						|
 
 | 
						|
  ; Added based on suggestion from Lauterbach support.
 | 
						|
  MMU.TABLEWALK ON
 | 
						|
  MMU.ON
 | 
						|
 | 
						|
  GOSUB load_symbols &ram_start &ram_size
 | 
						|
 | 
						|
  ;Open some windows.
 | 
						|
  WINPOS 83.125 29.063 48. 9. 0. 0. W003
 | 
						|
  Register
 | 
						|
 | 
						|
  WINPOS 83.25 10. 48. 9. 0. 1. W002
 | 
						|
  Var.Local
 | 
						|
  
 | 
						|
  END
 | 
						|
 | 
						|
find_system_table:
 | 
						|
  ENTRY &mem_start &mem_size
 | 
						|
  &mem_ptr=&mem_start+&mem_size
 | 
						|
  RPT    
 | 
						|
  (
 | 
						|
    &mem_ptr=&mem_ptr-0x400000  // 4 MB
 | 
						|
    &word1=Data.LONG(D:&mem_ptr)
 | 
						|
    &word2=Data.LONG(D:&mem_ptr+0x04)
 | 
						|
    IF &word1==0x20494249
 | 
						|
    (
 | 
						|
      IF &word2==0x54535953
 | 
						|
      (
 | 
						|
        &result=Data.LONG(D:&mem_ptr+0x08)
 | 
						|
        RETURN &result
 | 
						|
      )
 | 
						|
    )
 | 
						|
  )
 | 
						|
  WHILE &mem_ptr>&mem_start
 | 
						|
  &result=0
 | 
						|
  RETURN &result
 | 
						|
 | 
						|
compare_guid:
 | 
						|
  ENTRY &guid
 | 
						|
  IF Data.LONG(D:&guid)==0x49152E77
 | 
						|
  (
 | 
						|
    IF Data.LONG(D:&guid+0x04)==0x47641ADA
 | 
						|
    (
 | 
						|
      IF Data.LONG(D:&guid+0x08)==0xFE7AA2B7
 | 
						|
      (
 | 
						|
        IF Data.LONG(D:&guid+0x0C)==0x8B5ED9FE
 | 
						|
        (
 | 
						|
          RETURN 0
 | 
						|
        )
 | 
						|
      )
 | 
						|
    )
 | 
						|
  )
 | 
						|
  RETURN 1  
 | 
						|
 | 
						|
find_debug_info_table_header:
 | 
						|
  ENTRY &system_table
 | 
						|
  &config_table_entries=Data.LONG(D:&system_table+0x40)
 | 
						|
  &config_table_pointer=Data.LONG(D:&system_table+0x44)
 | 
						|
  RPT &config_table_entries
 | 
						|
  (
 | 
						|
    GOSUB compare_guid &config_table_pointer
 | 
						|
    ENTRY &result
 | 
						|
    IF &result==0
 | 
						|
    (
 | 
						|
      &result=Data.LONG(D:&config_table_pointer+0x10)
 | 
						|
      RETURN &result
 | 
						|
    )  
 | 
						|
    &config_table_pointer=&config_table_pointer+0x14
 | 
						|
  )
 | 
						|
  RETURN 0;
 | 
						|
 | 
						|
valid_pe_header:
 | 
						|
  ENTRY &header
 | 
						|
  IF Data.BYTE(D:&header+0x00)==0x4D
 | 
						|
  (
 | 
						|
    IF Data.BYTE(D:&header+0x01)==0x5A
 | 
						|
    (
 | 
						|
      IF Data.BYTE(D:&header+0x80)==0x50
 | 
						|
      (
 | 
						|
        IF Data.BYTE(D:&header+0x81)==0x45
 | 
						|
        (
 | 
						|
          RETURN 1
 | 
						|
        )
 | 
						|
      )
 | 
						|
    )
 | 
						|
  )
 | 
						|
  RETURN 0
 | 
						|
 | 
						|
get_file_string:
 | 
						|
  ENTRY &stringOffset
 | 
						|
 | 
						|
  local &string
 | 
						|
  
 | 
						|
  &more_string=data.string(d:&stringOffset)
 | 
						|
 | 
						|
  if (string.len("&more_string")>=128.)
 | 
						|
  (
 | 
						|
    &string="&string"+"&more_string"
 | 
						|
    &stringOffset=&stringOffset+string.len("&more_string")
 | 
						|
 | 
						|
    //Get remaining file string
 | 
						|
    GOSUB get_file_string &stringOffset
 | 
						|
    ENTRY &more_string
 | 
						|
    &string="&string"+"&more_string"
 | 
						|
  )
 | 
						|
  else
 | 
						|
  (
 | 
						|
    &string="&string"+"&more_string"
 | 
						|
    &more_string=""
 | 
						|
  )
 | 
						|
  RETURN &string
 | 
						|
 
 | 
						|
load_symbol_file:
 | 
						|
  ENTRY &header &load_address
 | 
						|
  GOSUB valid_pe_header &header
 | 
						|
  ENTRY &result
 | 
						|
 
 | 
						|
  IF &result==1
 | 
						|
  (
 | 
						|
    &debugOffset=Data.LONG(D:&header+0x0128)
 | 
						|
    &stringOffset=&header+&debugOffset+0x002C
 | 
						|
    
 | 
						|
    &stringOffset=&stringOffset+11.
 | 
						|
 | 
						|
    GOSUB get_file_string &stringOffset
 | 
						|
    ENTRY &filestring
 | 
						|
  
 | 
						|
    &filestring="c:"+"&filestring"
 | 
						|
 | 
						|
    PRINT "&filestring 0x" &load_address
 | 
						|
    Data.load.elf &filestring &load_address /nocode /noclear
 | 
						|
  )
 | 
						|
  RETURN
 | 
						|
 | 
						|
pe_headersize:
 | 
						|
  ENTRY &header;
 | 
						|
  RETURN Data.LONG(D:&header+0x00AC)
 | 
						|
 | 
						|
load_symbols:
 | 
						|
  ENTRY &mem_start &mem_size
 | 
						|
  GOSUB find_system_table &mem_start &mem_size
 | 
						|
  ENTRY &system_table
 | 
						|
  GOSUB find_debug_info_table_header &system_table
 | 
						|
  ENTRY &debug_info_table_header
 | 
						|
  &debug_info_table=Data.LONG(D:&debug_info_table_header+0x08)
 | 
						|
  &debug_info_table_size=Data.LONG(D:&debug_info_table_header+0x04)
 | 
						|
  &index=0
 | 
						|
  RPT &debug_info_table_size
 | 
						|
  (
 | 
						|
    &debug_image_info=Data.LONG(D:&debug_info_table+&index)
 | 
						|
    IF &debug_image_info==0
 | 
						|
      RETURN        
 | 
						|
    &loaded_image_protocol=Data.LONG(D:&debug_image_info+0x04);
 | 
						|
    &image_base=Data.LONG(D:&loaded_image_protocol+0x20);
 | 
						|
    GOSUB pe_headersize &image_base
 | 
						|
    ENTRY &header_size
 | 
						|
    &image_load_address=&image_base+&header_size
 | 
						|
    GOSUB load_symbol_file &image_base &image_load_address
 | 
						|
    &index=&index+0x4
 | 
						|
  )
 | 
						|
    
 | 
						|
  RETURN
 | 
						|
   |