HI Olivier,
  ArmPkg\Drivers\CpuDxe\AArch64\Mmu.c  has the code to  find the  memory type 
programmed for the given  region.

Equates are defined in AARch64mmu.h
#define TT_TYPE_MASK                            0x3
#define TT_TYPE_TABLE_ENTRY                     0x3
#define TT_TYPE_BLOCK_ENTRY                     0x1
#define TT_TYPE_BLOCK_ENTRY_LEVEL3              0x3




In the below code,  If   level  3 table,  Blockentrytype = 3.  Since this entry 
type  satisfies (EntryType == TT_TYPE_TABLE_ENTRY) condition,  It  will try to 
call the   GetMemoryRegionRec()  again instead . Do we need another condition 
to make it  reach the else part?

In other words,  How to handle the situation (EntryType == TT_TYPE_TABLE_ENTRY) 
= TRUE and  (EntryType == BlockEntryType) = TRUE


Thanks
Siva



ArmPkg\Drivers\CpuDxe\AArch64\Mmu.c   code snippet



  if (TableLevel != 3) {
    BlockEntryType = TT_TYPE_BLOCK_ENTRY;
  } else {
    BlockEntryType = TT_TYPE_BLOCK_ENTRY_LEVEL3;
  }

  // Find the block entry linked to the Base Address
  BlockEntry = (UINT64*)TT_GET_ENTRY_FOR_ADDRESS (TranslationTable, TableLevel, 
*BaseAddress);
  EntryType = *BlockEntry & TT_TYPE_MASK;

  if (EntryType == TT_TYPE_TABLE_ENTRY) {
    NextTranslationTable = (UINT64*)(*BlockEntry & 
TT_ADDRESS_MASK_DESCRIPTION_TABLE);

    // The entry is a page table, so we go to the next level
    Status = GetMemoryRegionRec (
        NextTranslationTable, // Address of the next level page table
        TableLevel + 1, // Next Page Table level
        (UINTN*)TT_LAST_BLOCK_ADDRESS(NextTranslationTable, TT_ENTRY_COUNT),
        BaseAddress, RegionLength, RegionAttributes);

    // In case of 'Success', it means the end of the block region has been 
found into the upper
    // level translation table
    if (!EFI_ERROR(Status)) {
      return EFI_SUCCESS;
    }
  } else if (EntryType == BlockEntryType) {
    // We have found the BlockEntry attached to the address. We save its start 
address (the start
    // address might be before the 'BaseAdress') and attributes
    *BaseAddress      = *BaseAddress & ~(TT_ADDRESS_AT_LEVEL(TableLevel) - 1);
    *RegionLength     = 0;
    *RegionAttributes = *BlockEntry & TT_ATTRIBUTES_MASK;
  } else {
    // We have an 'Invalid' entry
    return EFI_UNSUPPORTED;
  }

The information contained in this message may be confidential and proprietary 
to American Megatrends, Inc.  This communication is intended to be read only by 
the individual or entity to whom it is addressed or by their designee. If the 
reader of this message is not the intended recipient, you are on notice that 
any distribution of this message, in any form, is strictly prohibited.  Please 
promptly notify the sender by reply e-mail or by telephone at 770-246-8600, and 
then delete or destroy all copies of the transmission.
------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from 
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60134071&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to