Home | History | Annotate | Download | only in Debugger_scripts
      1 //
      2 // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
      3 //  
      4 //  This program and the accompanying materials
      5 //  are licensed and made available under the terms and conditions of the BSD License
      6 //  which accompanies this distribution.  The full text of the license may be found at
      7 //  http://opensource.org/licenses/bsd-license.php
      8 //
      9 //  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 //  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 //
     12 
     13   ENTRY &ram_start &ram_size
     14 
     15   ;If system is running then stop the execution so we can load symbols.
     16   break
     17   
     18   ;Reset all windows
     19   WINPAGE.RESET
     20   
     21   AREA.Reset
     22   AREA.Create SYMBOL 300. 100.
     23   AREA.View SYMBOL
     24   AREA.Select SYMBOL
     25   SYS.Option BE OFF
     26  
     27   ; Added based on suggestion from Lauterbach support.
     28   MMU.TABLEWALK ON
     29   MMU.ON
     30 
     31   GOSUB load_symbols &ram_start &ram_size
     32 
     33   ;Open some windows.
     34   WINPOS 83.125 29.063 48. 9. 0. 0. W003
     35   Register
     36 
     37   WINPOS 83.25 10. 48. 9. 0. 1. W002
     38   Var.Local
     39   
     40   END
     41 
     42 find_system_table:
     43   ENTRY &mem_start &mem_size
     44   &mem_ptr=&mem_start+&mem_size
     45   RPT    
     46   (
     47     &mem_ptr=&mem_ptr-0x400000  // 4 MB
     48     &word1=Data.LONG(D:&mem_ptr)
     49     &word2=Data.LONG(D:&mem_ptr+0x04)
     50     IF &word1==0x20494249
     51     (
     52       IF &word2==0x54535953
     53       (
     54         &result=Data.LONG(D:&mem_ptr+0x08)
     55         RETURN &result
     56       )
     57     )
     58   )
     59   WHILE &mem_ptr>&mem_start
     60   &result=0
     61   RETURN &result
     62 
     63 compare_guid:
     64   ENTRY &guid
     65   IF Data.LONG(D:&guid)==0x49152E77
     66   (
     67     IF Data.LONG(D:&guid+0x04)==0x47641ADA
     68     (
     69       IF Data.LONG(D:&guid+0x08)==0xFE7AA2B7
     70       (
     71         IF Data.LONG(D:&guid+0x0C)==0x8B5ED9FE
     72         (
     73           RETURN 0
     74         )
     75       )
     76     )
     77   )
     78   RETURN 1  
     79 
     80 find_debug_info_table_header:
     81   ENTRY &system_table
     82   &config_table_entries=Data.LONG(D:&system_table+0x40)
     83   &config_table_pointer=Data.LONG(D:&system_table+0x44)
     84   RPT &config_table_entries
     85   (
     86     GOSUB compare_guid &config_table_pointer
     87     ENTRY &result
     88     IF &result==0
     89     (
     90       &result=Data.LONG(D:&config_table_pointer+0x10)
     91       RETURN &result
     92     )  
     93     &config_table_pointer=&config_table_pointer+0x14
     94   )
     95   RETURN 0;
     96 
     97 valid_pe_header:
     98   ENTRY &header
     99   IF Data.BYTE(D:&header+0x00)==0x4D
    100   (
    101     IF Data.BYTE(D:&header+0x01)==0x5A
    102     (
    103       IF Data.BYTE(D:&header+0x80)==0x50
    104       (
    105         IF Data.BYTE(D:&header+0x81)==0x45
    106         (
    107           RETURN 1
    108         )
    109       )
    110     )
    111   )
    112   RETURN 0
    113 
    114 get_file_string:
    115   ENTRY &stringOffset
    116 
    117   local &string
    118   
    119   &more_string=data.string(d:&stringOffset)
    120 
    121   if (string.len("&more_string")>=128.)
    122   (
    123     &string="&string"+"&more_string"
    124     &stringOffset=&stringOffset+string.len("&more_string")
    125 
    126     //Get remaining file string
    127     GOSUB get_file_string &stringOffset
    128     ENTRY &more_string
    129     &string="&string"+"&more_string"
    130   )
    131   else
    132   (
    133     &string="&string"+"&more_string"
    134     &more_string=""
    135   )
    136   RETURN &string
    137  
    138 load_symbol_file:
    139   ENTRY &header &load_address
    140   GOSUB valid_pe_header &header
    141   ENTRY &result
    142  
    143   IF &result==1
    144   (
    145     &debugOffset=Data.LONG(D:&header+0x0128)
    146     &stringOffset=&header+&debugOffset+0x002C
    147     
    148     &stringOffset=&stringOffset+11.
    149 
    150     GOSUB get_file_string &stringOffset
    151     ENTRY &filestring
    152   
    153     &filestring="c:"+"&filestring"
    154 
    155     PRINT "&filestring 0x" &load_address
    156     Data.load.elf &filestring &load_address /nocode /noclear
    157   )
    158   RETURN
    159 
    160 pe_headersize:
    161   ENTRY &header;
    162   RETURN Data.LONG(D:&header+0x00AC)
    163 
    164 load_symbols:
    165   ENTRY &mem_start &mem_size
    166   GOSUB find_system_table &mem_start &mem_size
    167   ENTRY &system_table
    168   GOSUB find_debug_info_table_header &system_table
    169   ENTRY &debug_info_table_header
    170   &debug_info_table=Data.LONG(D:&debug_info_table_header+0x08)
    171   &debug_info_table_size=Data.LONG(D:&debug_info_table_header+0x04)
    172   &index=0
    173   RPT &debug_info_table_size
    174   (
    175     &debug_image_info=Data.LONG(D:&debug_info_table+&index)
    176     IF &debug_image_info==0
    177       RETURN        
    178     &loaded_image_protocol=Data.LONG(D:&debug_image_info+0x04);
    179     &image_base=Data.LONG(D:&loaded_image_protocol+0x20);
    180     GOSUB pe_headersize &image_base
    181     ENTRY &header_size
    182     &image_load_address=&image_base+&header_size
    183     GOSUB load_symbol_file &image_base &image_load_address
    184     &index=&index+0x4
    185   )
    186     
    187   RETURN
    188