There have been many changes since EfiLoadDxe.cmm was last updated in 2011. The EFI_SYSTEM_TABLE can no longer be found by scanning memory on 4KB boundaries, so require users pass in its address instead. Update various offsets so that the debug information can be found and loaded with a recent version of TRACE32. Signed-off-by: Rebecca Cran <rebecca@os.amperecomputing.com> Reviewed-by: Leif Lindholm <quic_llindhol@quicinc.com>
73 lines
1.8 KiB
Plaintext
73 lines
1.8 KiB
Plaintext
;
|
|
; Copyright (c) 2024, Ampere Computing LLC. All rights reserved.<BR>
|
|
; Copyright (c) 2011, Hewlett-Packard Company. All rights reserved.<BR>
|
|
;
|
|
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
;
|
|
|
|
LOCAL &imgstart &filehdrstart &debugdirentryrva &debugtype &debugrva &dwarfsig &baseofcode &baseofdata &elfbase &elfpath &pathoffset
|
|
ENTRY &imgstart
|
|
|
|
&imgstart=&imgstart
|
|
print "PE32 image found at &imgstart"
|
|
|
|
; offset from dos hdr to PE file hdr (i.e. 'PE\0\0' signature)
|
|
&filehdrstart=&imgstart+Data.Long(c:&imgstart+0x3C)
|
|
|
|
; offset to debug dir in PE hdrs
|
|
&debugdirentryrva=Data.Long(c:&imgstart+0xf10)
|
|
if &debugdirentryrva==0
|
|
(
|
|
print "no debug dir for image at &imgstart"
|
|
enddo
|
|
)
|
|
|
|
&debugtype=Data.Long(c:&imgstart+&debugdirentryrva+0xc)
|
|
if (&debugtype!=0xdf)&&(&debugtype!=0x02)
|
|
(
|
|
print "debug type is not dwarf for image at &imgstart, it's &debugtype"
|
|
enddo
|
|
)
|
|
|
|
&debugrva=Data.Long(c:&imgstart+&debugdirentryrva+0x14)
|
|
&dwarfsig=Data.Long(c:&imgstart+&debugrva)
|
|
|
|
if &dwarfsig==0x66727764
|
|
(
|
|
&pathoffset=0xc
|
|
)
|
|
else
|
|
(
|
|
if &dwarfsig==0x3031424E
|
|
(
|
|
&pathoffset=0x10
|
|
)
|
|
else
|
|
(
|
|
print "debug signature not found for image at &imgstart, its &dwarfsig"
|
|
enddo
|
|
)
|
|
)
|
|
|
|
&elfpath=Data.String(c:&imgstart+&debugrva+&pathoffset)
|
|
|
|
&baseofcode=&imgstart+Data.Long(c:&filehdrstart+0x28)
|
|
&baseofdata=&imgstart+Data.Long(c:&filehdrstart+0x2c)
|
|
|
|
if (&baseofcode<&baseofdata)&&(&baseofcode!=0)
|
|
(
|
|
&elfbase=&baseofcode;
|
|
)
|
|
else
|
|
(
|
|
&elfbase=&baseofdata;
|
|
)
|
|
|
|
print "found path &elfpath with address &elfbase"
|
|
ON ERROR GOSUB
|
|
return
|
|
data.load.elf &elfpath &elfbase /NOCODE /NOCLEAR
|
|
ON error
|
|
|
|
enddo
|