On 9 November 2015 at 19:01, Vladimir Olovyannikov
<volov...@broadcom.com> wrote:
> -----Original Message-----
> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
> Sent: Sunday, November 08, 2015 10:52 PM
> To: Vladimir Olovyannikov
> Cc: Cohen, Eugene; edk2-devel@lists.01.org
> Subject: Re: [edk2] Strange behavior of the DS-5 debugger on AARCH64 with 
> step-by-step debugging in uefi
>
> On 6 November 2015 at 21:32, Vladimir Olovyannikov
> <volov...@broadcom.com>> wrote:
>>> Hello Ard, Eugene,
>>> Thank you for explanation.
>>>
>>> Ard, I tried the patch, but it cannot be applied to the latest (pulled a 
>>> minute ago, git-svn-id: 
>>> https://svn.code.sf.net/p/edk2/code/trunk/edk2@18732 
>>> 6f19259b-4bc3-4df7-8a09-765794883524)
>>> tree: all 3 hunks failed. Which commit should I be based on to apply the 
>>> patch?
>>>
>>> Anyway I found the lines manually and changed them. However, when I try to
>>>
>>> source /uefi/ArmPlatformPkg/Scripts/Ds5/cmd_load_symbols.py -f 
>>> (0x85000000,0x00280000) -m (0x80000000,0x40000000) -a
>>> I am getting
>>>
>>> ERROR(?): ValueError: need more than 1 value to unpack
>>>   File " /uefi/ArmPlatformPkg/Scripts/Ds5/cmd_load_symbols.py", line 94, in 
>>> <module>>
>>>     armplatform_debugger.load_all_symbols()
>>> ERROR(CMD656):
>>> # in /uefi/BroadcomPlatformPkg/NS2Pkg/Scripts/armpkg_syms.ds:2 while 
>>> executing: source /uefi/ArmPlatformPkg/Scripts/Ds5/cmd_load_symbols.py -f 
>>> (0x85000000,0x00280000) -m (0x80000000,0x40000000) -a
>>> ! The script /uefi/ArmPlatformPkg/Scripts/Ds5/cmd_load_symbols.py failed to 
>>> complete due to an error during execution of the script
>>>
>>> Replacing the script with the older version makes it work as before, but 
>>> again the debugger is useless.
>>>
>>> Any idea what is wrong?
>>>
>
>>No, not a clue. But could you please share the diff between the
>>version of the script that works for you and the version that doesn't?
>>I don't think the patch I sent could trigger the error you are seeing,
>>so it must be something else that changed.
> Here is the diff.
>
> --- firmware_volume_old.py      2015-06-24 15:15:37.000000000 -0700
> +++ firmware_volume_new.py      2015-11-06 11:49:24.321730539 -0800
> @@ -91,12 +91,7 @@
>          return filename[0:string.find(filename,'\0')]
>
>      def get_debug_elfbase(self):
> -        stripped_size = struct.unpack("<H", 
> self.ec.getMemoryService().read(self.base_te + 0x6, 2, 32))[0]
> -        stripped_size -= EfiSectionTE.SIZEOF_EFI_TE_IMAGE_HEADER
> -
> -        base_of_code = self.ec.getMemoryService().readMemory32(self.base_te 
> + 0xC)
> -
> -        return self.base_te + base_of_code - stripped_size
> +        return self.base_pe32
>

This hunk is incorrect. Could you please try the patch instead?
(attached, this time, so it should apply more easily)

Thanks,
Ard.

>  class EfiSectionPE32:
>      def __init__(self, ec, base_pe32):
> @@ -131,17 +126,7 @@
>          return filename[0:string.find(filename,'\0')]
>
>      def get_debug_elfbase(self):
> -        # Offset from dos hdr to PE file hdr
> -        pe_file_header = self.base_pe32 + 
> self.ec.getMemoryService().readMemory32(self.base_pe32 + 0x3C)
> -
> -        base_of_code = self.base_pe32 + 
> self.ec.getMemoryService().readMemory32(pe_file_header + 0x28)
> -        base_of_data = self.base_pe32 + 
> self.ec.getMemoryService().readMemory32(pe_file_header + 0x2C)
> -
> -        if (base_of_code < base_of_data) and (base_of_code != 0):
> -            return base_of_code
> -        else:
> -            return base_of_data
> -
> +        return self.base_pe32
>  class EfiSectionPE64:
>      def __init__(self, ec, base_pe64):
>          self.ec = ec
> @@ -176,16 +161,7 @@
>          return filename[0:string.find(filename,'\0')]
>
>      def get_debug_elfbase(self):
> -        # Offset from dos hdr to PE file hdr
> -        pe_file_header = self.base_pe64 + 
> self.ec.getMemoryService().readMemory32(self.base_pe64 + 0x3C)
> -
> -        base_of_code = self.base_pe64 + 
> self.ec.getMemoryService().readMemory32(pe_file_header + 0x28)
> -        base_of_data = self.base_pe64 + 
> self.ec.getMemoryService().readMemory32(pe_file_header + 0x2C)
> -
> -        if (base_of_code < base_of_data) and (base_of_code != 0):
> -            return base_of_code
> -        else:
> -            return base_of_data
> +        return self.base_pe64
>
>  class FirmwareFile:
>      EFI_FV_FILETYPE_RAW                   = 0x01
>
>>> Eugene, so you do not use the so convenient cmd_load_symbols.py script to 
>>> load all symbols?
>>> I dumped efi and dll as you suggested. The .text and .data sections in 
>>> PE-COFF and ELF match 1:1 for me. Still the debugger is useless as it 
>>> points to non-relevant code.
>>>
>
>>Indeed, this is expected. The PE/COFF and ELF versions of the binary
>>should look entirely the same, it's only the DS-5 scripts that needs
>>to have the hack removed to deal with the difference.
> OK, I see.
>
> Thank you,
>
> Vladimir
From b24184070e3df4d3454b6abc00692bcbaf7b575e Mon Sep 17 00:00:00 2001
From: Ard Biesheuvel <ard.biesheu...@linaro.org>
Date: Fri, 6 Nov 2015 08:07:53 +0100
Subject: [PATCH] ArmPlatformPkg: bring DS-5 scripts in line with linker script
 changes

The ARM and AARCH64 linker scripts have recently been updated so that
the memory layouts of the ELF and PE/COFF versions of each module are
identical. In particular, this means that the ELF images now have a
hole before the first section rather than starting at offset 0x0, which
means we no longer have to correct for this difference when loading the
ELF image into the debugger.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
---
 ArmPlatformPkg/Scripts/Ds5/firmware_volume.py | 26 +++-----------------
 1 file changed, 3 insertions(+), 23 deletions(-)

diff --git a/ArmPlatformPkg/Scripts/Ds5/firmware_volume.py b/ArmPlatformPkg/Scripts/Ds5/firmware_volume.py
index 8e3a8adc9bc8..c434e3de19da 100644
--- a/ArmPlatformPkg/Scripts/Ds5/firmware_volume.py
+++ b/ArmPlatformPkg/Scripts/Ds5/firmware_volume.py
@@ -94,9 +94,7 @@ class EfiSectionTE:
         stripped_size = struct.unpack("<H", self.ec.getMemoryService().read(self.base_te + 0x6, 2, 32))[0]
         stripped_size -= EfiSectionTE.SIZEOF_EFI_TE_IMAGE_HEADER
 
-        base_of_code = self.ec.getMemoryService().readMemory32(self.base_te + 0xC)
-
-        return self.base_te + base_of_code - stripped_size
+        return self.base_te - stripped_size
 
 class EfiSectionPE32:
     def __init__(self, ec, base_pe32):
@@ -131,16 +129,7 @@ class EfiSectionPE32:
         return filename[0:string.find(filename,'\0')]
 
     def get_debug_elfbase(self):
-        # Offset from dos hdr to PE file hdr
-        pe_file_header = self.base_pe32 + self.ec.getMemoryService().readMemory32(self.base_pe32 + 0x3C)
-
-        base_of_code = self.base_pe32 + self.ec.getMemoryService().readMemory32(pe_file_header + 0x28)
-        base_of_data = self.base_pe32 + self.ec.getMemoryService().readMemory32(pe_file_header + 0x2C)
-
-        if (base_of_code < base_of_data) and (base_of_code != 0):
-            return base_of_code
-        else:
-            return base_of_data
+        return self.base_pe32
 
 class EfiSectionPE64:
     def __init__(self, ec, base_pe64):
@@ -176,16 +165,7 @@ class EfiSectionPE64:
         return filename[0:string.find(filename,'\0')]
 
     def get_debug_elfbase(self):
-        # Offset from dos hdr to PE file hdr
-        pe_file_header = self.base_pe64 + self.ec.getMemoryService().readMemory32(self.base_pe64 + 0x3C)
-
-        base_of_code = self.base_pe64 + self.ec.getMemoryService().readMemory32(pe_file_header + 0x28)
-        base_of_data = self.base_pe64 + self.ec.getMemoryService().readMemory32(pe_file_header + 0x2C)
-
-        if (base_of_code < base_of_data) and (base_of_code != 0):
-            return base_of_code
-        else:
-            return base_of_data
+        return self.base_pe64
 
 class FirmwareFile:
     EFI_FV_FILETYPE_RAW                   = 0x01
-- 
1.9.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to