On Apr 8, 2013, at 3:38 PM, Duane Voth <[email protected]> wrote:

> > 0x400/0xB000 are I/O ranges, not memory ranges.
> 
> I knew that...  :^  :D     But gdb can't read i/o ports!?
> 
> 
> So gdb => qemu: I can single step and get/set cpu regs, but I can't set 
> breakpoints or step over subroutines... does qemu 1.2 support breakpoints?  
> (anything to make this easier!)
> 
> My additions/observations are in blue (html):
> 
> volatile UINT32 xxx = 0;
> AcpiTimerLibConstructor (VOID) {
>   // Check to see if the PIIX4 Power Management Base Address is already 
> enabled
>   if ((PciRead8 (PMREGMISC) & PMIOSE) == 0) {
> 
> // PMREGMISC = 0xb080, PciRead8 returns 0 so the following is executed
> 
>     // If the PIIX4 Power Management Base Address is not programmed, 
>     // then program the PIIX4 Power Management Base Address from a PCD.
>     PciAndThenOr32 (PMBA, (UINT32)(~0x0000FFC0), PcdGet16 
> (PcdAcpiPmBaseAddress));
> 
> // PcdAcpiPmBaseAddress = 0xb040
> 
>     // Enable PMBA I/O port decodes in PMREGMISC
>     PciOr8 (PMREGMISC, PMIOSE);
>   }
>   xxx = PciRead32(PMBA);       // xxx = 0xb001
> 
>   return RETURN_SUCCESS;     // always?  no test is possible?
> }
> 
> 
> I'm not sure I get to read from the PMBA but 0xb001 looks suspicious. (And I 
> verified that AcpiTimerLibConstructor is called exactly once).
> 
> 
> 
> For my edification, Pcd stands for?
> 

Platform Configuration Database (PCD). It is basically a config knob that gets 
added to the driver that the platform can control not only control the default 
value, but the form that the access takes. By form I mean method for access, so 
for example the PCD value could be compiled into the driver, it could by 
dynamically looked up, it could be mapped to a setup options menu, it could be 
stored in a known location so a binary could be patched, or it could come from 
a known location of FLASH that was programmed when the system was manufactured. 
The idea here was to not require the driver code to change based on the form 
the config knob took. There are also something called a PCD Feature flag, and 
they work like #ifdefs but both sides of the code always compile, and thus it 
is up the optimizer to remove the dead code. 

So a driver/application accesses via the PcdLib: 
https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/MdePkg/Include/Library/PcdLib.h

You have to list the PCD entries that your driver consumes in the INF file:
https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/MdeModulePkg/Core/Dxe/DxeMain.inf
[FeaturePcd]
  gEfiMdeModulePkgTokenSpaceGuid.PcdFrameworkCompatibilitySupport          ## 
CONSUMES

[Pcd]
  gEfiMdeModulePkgTokenSpaceGuid.PcdLoadFixAddressBootTimeCodePageNumber    ## 
SOMETIMES_CONSUMES
  gEfiMdeModulePkgTokenSpaceGuid.PcdLoadFixAddressRuntimeCodePageNumber     ## 
SOMETIMES_CONSUMES
  gEfiMdeModulePkgTokenSpaceGuid.PcdLoadModuleAtFixAddressEnable            ## 
CONSUMES
  gEfiMdeModulePkgTokenSpaceGuid.PcdMaxEfiSystemTablePointerAddress         ## 
CONSUMES
 
The projects DSC file gets to set a default value, put other code can also 
dynamically update the value:
https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/EmulatorPkg/EmulatorPkg.dsc
[PcdsFeatureFlag]
  gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE
  gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseSerial|TRUE
  gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|FALSE
  gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables|FALSE

[PcdsFixedAtBuild]
  gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|FALSE

The PCD is added to a package via the .DEC file, and a default value is given. 
https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/MdeModulePkg/MdeModulePkg.dec
[PcdsFixedAtBuild, PcdsDynamic, PcdsDynamicEx]
  ## Base address of the NV variable range in flash device
  
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|0x0|UINT32|0x30000001

> And unrelated to this but what might help debugging - Andrei Warkentin's 
> GdbSyms script gdb_uefi.py is looking for EFI_SYSTEM_TABLE and not finding it 
> (the actual error is: No type named EFI_SYSTEM_TABLE_POINTER).  Have these 
> structures changed names since 2 years ago when he worked with students 
> during the GsoC?
> 

EFI_SYSTEM_TABLE_POINTER is defined in the UEFI spec, and has not changed in a 
long time. 
https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/MdePkg/Include/Guid/DebugImageInfoTable.h

I'm not familiar with the gdb script in question, but from doing this kind of 
thing enough times it looks like the script depends on some symbols being 
loaded if it needs to know the type of EFI_SYSTEM_TABLE_POINTER. The debugger 
will only know how to work with a type if symbols for that code have been 
loaded. So maybe there is some assumption that symbols for the DXE Core have 
been loaded in this script? 

Thanks,

Andrew Fish

> ------------------------------------------------------------------------------
> Minimize network downtime and maximize team effectiveness.
> Reduce network management and security costs.Learn how to hire 
> the most talented Cisco Certified professionals. Visit the 
> Employer Resources Portal
> http://www.cisco.com/web/learning/employer_resources/index.html_______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to