[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v1 10/21] ArmVirtualizationPkg: Xen/PV relocatable platformlib instance



On 01/23/15 16:02, Ard Biesheuvel wrote:
> Add a ArmPlatformLib instance that can deal with the self relocation
> and truly dynamic discovery of system RAM base and size.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx>
> ---
>  .../AARCH64/MemnodeParser.S                        | 232 
> +++++++++++++++++++++
>  .../AARCH64/RelocatableVirtHelper.S                | 161 ++++++++++++++
>  .../ArmXenRelocatablePlatformLib.inf               |  66 ++++++
>  .../ArmVirtualizationPlatformLib/RelocatableVirt.c |  78 +++++++
>  .../ArmVirtualizationPlatformLib/XenVirtMem.c      |  83 ++++++++
>  5 files changed, 620 insertions(+)
>  create mode 100644 
> ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/AARCH64/MemnodeParser.S
>  create mode 100644 
> ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/AARCH64/RelocatableVirtHelper.S
>  create mode 100644 
> ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/ArmXenRelocatablePlatformLib.inf
>  create mode 100644 
> ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/RelocatableVirt.c
>  create mode 100644 
> ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/XenVirtMem.c

Please do not add these new files to the existent directory

ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/

because the new files will mix with the old and they will crash my brain
when I need to look at them two weeks later.

You're adding a full-blown, standalone library instance of
ArmPlatformLib, called "ArmVirtRelocatablePlatformLib" (see BASE_NAME in
the new INF file); please introduce it in a separate directory:

ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtRelocatablePlatformLib

The general rule is: one INF file per directory, unless you build the
library for different UEFI phases, and some of the .c files are shared
between them (ie. some .c files with library logic are included by
multiple phases / multiple INF files). That's not the case here; please
keep 'em separated.

Thanks!
Laszlo


> 
> diff --git 
> a/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/AARCH64/MemnodeParser.S
>  
> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/AARCH64/MemnodeParser.S
> new file mode 100644
> index 000000000000..cce2c4800c51
> --- /dev/null
> +++ 
> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/AARCH64/MemnodeParser.S
> @@ -0,0 +1,232 @@
> +/*
> + * Copyright (c) 2014, Linaro Ltd. All rights reserved.
> + *
> + * This program and the accompanying materials
> + * are licensed and made available under the terms and conditions of the BSD 
> License
> + * which accompanies this distribution.  The full text of the license may be 
> found at
> + * http://opensource.org/licenses/bsd-license.php
> + *
> + * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> + */
> +
> +/*
> + * Theory of operation
> + * -------------------
> + *
> + * This code parses a Flattened Device Tree binary (DTB) to find the base of
> + * system RAM. It is written in assembly so that it can be executed before a
> + * stack has been set up.
> + *
> + * To find the base of system RAM, we have to traverse the FDT to find a 
> memory
> + * node. In the context of this implementation, the first node that has a
> + * device_type property with the value 'memory' and a 'reg' property is
> + * acceptable, and the name of the node (memory[@xxx]) is ignored, as are any
> + * other nodes that match the above constraints.
> + *
> + * In pseudo code, this implementation does the following:
> + *
> + * for each node {
> + *   have_device_type = false
> + *   have_reg = false
> + *
> + *   for each property {
> + *           if property value == 'memory' {
> + *                   if property name == 'device_type' {
> + *                           have_device_type = true
> + *                   }
> + *           } else {
> + *                   if property name == 'reg' {
> + *                           have_reg = true
> + *                           membase = property value[0]
> + *                           memsize = property value[1]
> + *                   }
> + *           }
> + *   }
> + *   if have_device_type and have_reg {
> + *           return membase and memsize
> + *   }
> + * }
> + * return NOT_FOUND
> + */
> +
> +#define FDT_MAGIC    0xedfe0dd0
> +
> +#define FDT_BEGIN_NODE       0x1
> +#define FDT_END_NODE 0x2
> +#define FDT_PROP     0x3
> +#define FDT_END              0x9
> +
> +     xMEMSIZE        .req    x0
> +     xMEMBASE        .req    x1
> +
> +     xLR             .req    x8
> +     xDTP            .req    x9
> +     xSTRTAB         .req    x10
> +     xMEMNODE        .req    x11
> +
> +     .text
> +     .align  3
> +_memory:
> +     .asciz  "memory"
> +_reg:
> +     .asciz  "reg"
> +_device_type:
> +     .asciz  "device_type"
> +
> +     /*
> +      * Compare strings in x4 and x5, return in w7
> +      */
> +     .align  3
> +strcmp:
> +     ldrb    w2, [x4], #1
> +     ldrb    w3, [x5], #1
> +     subs    w7, w2, w3
> +     cbz     w2, 0f
> +     cbz     w3, 0f
> +     beq     strcmp
> +0:   ret
> +
> +     .globl  find_memnode
> +find_memnode:
> +     // preserve link register
> +     mov     xLR, x30
> +     mov     xDTP, x0
> +     mov     xMEMNODE, #0
> +
> +     /*
> +      * Check the DTB magic at offset 0
> +      */
> +     movz    w4, #:abs_g0_nc:FDT_MAGIC
> +     movk    w4, #:abs_g1:FDT_MAGIC
> +     ldr     w5, [xDTP]
> +     cmp     w4, w5
> +     bne     err_invalid_magic
> +
> +     /*
> +      * Read the string offset and store it for later use
> +      */
> +     ldr     w4, [xDTP, #12]
> +     rev     w4, w4
> +     add     xSTRTAB, xDTP, x4
> +
> +     /*
> +      * Read the struct offset and add it to the DT pointer
> +      */
> +     ldr     w5, [xDTP, #8]
> +     rev     w5, w5
> +     add     xDTP, xDTP, x5
> +
> +     /*
> +      * Check current tag for FDT_BEGIN_NODE
> +      */
> +     ldr     w5, [xDTP]
> +     rev     w5, w5
> +     cmp     w5, #FDT_BEGIN_NODE
> +     bne     err_unexpected_begin_tag
> +
> +begin_node:
> +     mov     xMEMNODE, #0
> +     add     xDTP, xDTP, #4
> +
> +     /*
> +      * Advance xDTP past NULL terminated string
> +      */
> +0:   ldrb    w4, [xDTP], #1
> +     cbnz    w4, 0b
> +
> +next_tag:
> +     add     xDTP, xDTP, #3
> +     and     xDTP, xDTP, #~3
> +
> +     /*
> +      * Read the next tag, could be BEGIN_NODE, END_NODE, PROP, END
> +      */
> +     ldr     w5, [xDTP]
> +     rev     w5, w5
> +     cmp     w5, #FDT_BEGIN_NODE
> +     beq     begin_node
> +     cmp     w5, #FDT_END_NODE
> +     beq     end_node
> +     cmp     w5, #FDT_PROP
> +     beq     prop_node
> +     cmp     w5, #FDT_END
> +     beq     err_end_of_fdt
> +     b       err_unexpected_tag
> +
> +prop_node:
> +     /*
> +      * If propname == 'reg', record as membase and memsize
> +      * If propname == 'device_type' and value == 'memory',
> +      * set the 'is_memnode' flag for this node
> +      */
> +     ldr     w6, [xDTP, #4]
> +     add     xDTP, xDTP, #12
> +     rev     w6, w6
> +     mov     x5, xDTP
> +     adr     x4, _memory
> +     bl      strcmp
> +
> +     /*
> +      * Get handle to property name
> +      */
> +     ldr     w5, [xDTP, #-4]
> +     rev     w5, w5
> +     add     x5, xSTRTAB, x5
> +
> +     cbz     w7, check_device_type
> +
> +     /*
> +      * Check for 'reg' property
> +      */
> +     adr     x4, _reg
> +     bl      strcmp
> +     cbnz    w7, inc_and_next_tag
> +
> +     /*
> +      * Extract two 64-bit quantities from the 'reg' property. These values
> +      * will only be used if the node also turns out to have a device_type
> +      * property with a value of 'memory'.
> +      *
> +      * NOTE: xDTP is only guaranteed to be 32 bit aligned, and we are most
> +      *       likely executing with the MMU off, so we cannot use 64 bit
> +      *       wide accesses here.
> +      */
> +     ldp     w4, w5, [xDTP]
> +     orr     xMEMBASE, x4, x5, lsl #32
> +     ldp     w4, w5, [xDTP, #8]
> +     orr     xMEMSIZE, x4, x5, lsl #32
> +     rev     xMEMBASE, xMEMBASE
> +     rev     xMEMSIZE, xMEMSIZE
> +     orr     xMEMNODE, xMEMNODE, #2
> +     b       inc_and_next_tag
> +
> +check_device_type:
> +     /*
> +      * Check whether the current property's name is 'device_type'
> +      */
> +     adr     x4, _device_type
> +     bl      strcmp
> +     cbnz    w7, inc_and_next_tag
> +     orr     xMEMNODE, xMEMNODE, #1
> +
> +inc_and_next_tag:
> +     add     xDTP, xDTP, x6
> +     b       next_tag
> +
> +end_node:
> +     /*
> +      * Check for device_type = memory and reg = xxxx
> +      * If we have both, we are done
> +      */
> +     add     xDTP, xDTP, #4
> +     cmp     xMEMNODE, #3
> +     bne     next_tag
> +
> +     ret     xLR
> +
> +err_invalid_magic:
> +err_unexpected_begin_tag:
> +err_unexpected_tag:
> +err_end_of_fdt:
> +     wfi
> diff --git 
> a/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/AARCH64/RelocatableVirtHelper.S
>  
> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/AARCH64/RelocatableVirtHelper.S
> new file mode 100644
> index 000000000000..58071b5ae62a
> --- /dev/null
> +++ 
> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/AARCH64/RelocatableVirtHelper.S
> @@ -0,0 +1,161 @@
> +#
> +#  Copyright (c) 2011-2013, ARM Limited. All rights reserved.
> +#
> +#  This program and the accompanying materials
> +#  are licensed and made available under the terms and conditions of the BSD 
> License
> +#  which accompanies this distribution.  The full text of the license may be 
> found at
> +#  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +#
> +#
> +
> +#include <AsmMacroIoLibV8.h>
> +#include <Base.h>
> +#include <Library/ArmLib.h>
> +#include <Library/PcdLib.h>
> +#include <AutoGen.h>
> +
> +.text
> +.align 2
> +
> +GCC_ASM_EXPORT(ArmPlatformPeiBootAction)
> +GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
> +GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId)
> +GCC_ASM_EXPORT(ArmPlatformGetCorePosition)
> +GCC_ASM_EXPORT(ArmGetPhysAddrTop)
> +
> +GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
> +GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)
> +GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdCoreCount)
> +
> +.LFdtMagic:
> +  .byte   0xd0, 0x0d, 0xfe, 0xed
> +
> +.LArm64LinuxMagic:
> +  .byte   0x41, 0x52, 0x4d, 0x64
> +
> +ASM_PFX(ArmPlatformPeiBootAction):
> +  mov   x29, x30            // preserve LR
> +
> +  //
> +  // If we are booting from RAM using the Linux kernel boot protocol, x0 will
> +  // point to the DTB image in memory. Otherwise, we are just coming out of
> +  // reset, and x0 will be 0. Check also the FDT magic.
> +  //
> +  cbz   x0, .Lout
> +  ldr   w8, .LFdtMagic
> +  ldr   w9, [x0]
> +  cmp   w8, w9
> +  bne   .Lout
> +
> +  //
> +  // The base of the runtime image has been preserved in x1. Check whether
> +  // the expected magic number can be found in the header.
> +  //
> +  ldr   w8, .LArm64LinuxMagic
> +  ldr   w9, [x1, #0x38]
> +  cmp   w8, w9
> +  bne   .Lout
> +
> +  //
> +  //
> +  // OK, so far so good. We have confirmed that we likely have a DTB and are
> +  // booting via the arm64 Linux boot protocol. Update the base-of-image PCD
> +  // to the actual relocated value, and add the shift of PcdFdBaseAddress to
> +  // PcdFvBaseAddress as well
> +  //
> +  adr   x8, PcdGet64 (PcdFdBaseAddress)
> +  adr   x9, PcdGet64 (PcdFvBaseAddress)
> +  ldr   x6, [x8]
> +  ldr   x7, [x9]
> +  sub   x7, x7, x6
> +  add   x7, x7, x1
> +  str   x1, [x8]
> +  str   x7, [x9]
> +
> +  //
> +  // Copy the DTB to the slack space right after the header at the base of 
> this
> +  // image, and record the pointer in PcdDeviceTreeInitialBaseAddress.
> +  //
> +  adr   x8, PcdGet64 (PcdDeviceTreeInitialBaseAddress)
> +  add   x1, x1, #0x40
> +  str   x1, [x8]
> +
> +  ldr   w8, [x0, #4]          // get DTB size (BE)
> +  mov   x9, x1
> +  rev   w8, w8
> +  add   x8, x8, x0
> +0:ldp   x6, x7, [x0], #16
> +  stp   x6, x7, [x9], #16
> +  cmp   x0, x8
> +  blt   0b
> +
> +  //
> +  // Discover the memory size and offset from the DTB, and record in the
> +  // respective PCDs
> +  //
> +  mov   x0, x1
> +  bl    find_memnode    // returns (size, base) size in (x0, x1)
> +  cbz   x0, .Lout
> +
> +  adr   x8, PcdGet64 (PcdSystemMemorySize)
> +  adr   x9, PcdGet64 (PcdSystemMemoryBase)
> +  str   x0, [x8]
> +  str   x1, [x9]
> +
> +.Lout:
> +  ret    x29
> +
> +//UINTN
> +//ArmPlatformGetPrimaryCoreMpId (
> +//  VOID
> +//  );
> +ASM_PFX(ArmPlatformGetPrimaryCoreMpId):
> +  LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCore, x0)
> +  ldrh   w0, [x0]
> +  ret
> +
> +//UINTN
> +//ArmPlatformIsPrimaryCore (
> +//  IN UINTN MpId
> +//  );
> +ASM_PFX(ArmPlatformIsPrimaryCore):
> +  mov   x0, #1
> +  ret
> +
> +//UINTN
> +//ArmPlatformGetCorePosition (
> +//  IN UINTN MpId
> +//  );
> +// With this function: CorePos = (ClusterId * 4) + CoreId
> +ASM_PFX(ArmPlatformGetCorePosition):
> +  and   x1, x0, #ARM_CORE_MASK
> +  and   x0, x0, #ARM_CLUSTER_MASK
> +  add   x0, x1, x0, LSR #6
> +  ret
> +
> +//EFI_PHYSICAL_ADDRESS
> +//GetPhysAddrTop (
> +//  VOID
> +//  );
> +ASM_PFX(ArmGetPhysAddrTop):
> +  mrs   x0, id_aa64mmfr0_el1
> +  adr   x1, .LPARanges
> +  and   x0, x0, #7
> +  ldrb  w1, [x1, x0]
> +  mov   x0, #1
> +  lsl   x0, x0, x1
> +  ret
> +
> +//
> +// Bits 0..2 of the AA64MFR0_EL1 system register encode the size of the
> +// physical address space support on this CPU:
> +// 0 == 32 bits, 1 == 36 bits, etc etc
> +// 6 and 7 are reserved
> +//
> +.LPARanges:
> +  .byte 32, 36, 40, 42, 44, 48, -1, -1
> +
> +ASM_FUNCTION_REMOVE_IF_UNREFERENCED
> diff --git 
> a/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/ArmXenRelocatablePlatformLib.inf
>  
> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/ArmXenRelocatablePlatformLib.inf
> new file mode 100644
> index 000000000000..7775a46beee2
> --- /dev/null
> +++ 
> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/ArmXenRelocatablePlatformLib.inf
> @@ -0,0 +1,66 @@
> +#/* @file
> +#  Copyright (c) 2011-2014, ARM Limited. All rights reserved.
> +#  Copyright (c) 2014, Linaro Limited. All rights reserved.
> +#
> +#  This program and the accompanying materials
> +#  are licensed and made available under the terms and conditions of the BSD 
> License
> +#  which accompanies this distribution.  The full text of the license may be 
> found at
> +#  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +#
> +#*/
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = ArmVirtRelocatablePlatformLib
> +  FILE_GUID                      = c8602718-4faa-4119-90ca-cae72509ac4c
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = ArmPlatformLib|SEC PEIM
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  EmbeddedPkg/EmbeddedPkg.dec
> +  ArmPkg/ArmPkg.dec
> +  ArmPlatformPkg/ArmPlatformPkg.dec
> +  ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec
> +
> +[LibraryClasses]
> +  IoLib
> +  ArmLib
> +  PrintLib
> +  FdtLib
> +  SerialPortLib
> +  HobLib
> +
> +[Sources.common]
> +  RelocatableVirt.c
> +  XenVirtMem.c
> +
> +[Sources.AARCH64]
> +  AARCH64/RelocatableVirtHelper.S
> +  AARCH64/MemnodeParser.S
> +
> +[FeaturePcd]
> +  gEmbeddedTokenSpaceGuid.PcdCacheEnable
> +  gArmPlatformTokenSpaceGuid.PcdSystemMemoryInitializeInSec
> +
> +[Pcd]
> +  gArmTokenSpaceGuid.PcdSystemMemorySize
> +
> +[FixedPcd]
> +  gArmVirtualizationTokenSpaceGuid.PcdDeviceTreeInitialBaseAddress
> +  gArmPlatformTokenSpaceGuid.PcdCoreCount
> +  gArmTokenSpaceGuid.PcdSystemMemoryBase
> +  gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
> +  gArmTokenSpaceGuid.PcdArmPrimaryCore
> +  gArmTokenSpaceGuid.PcdFdBaseAddress
> +  gArmTokenSpaceGuid.PcdFdSize
> +  gArmTokenSpaceGuid.PcdFvBaseAddress
> +
> +[Guids]
> +  gEarlyPL011BaseAddressGuid
> +  gFdtHobGuid
> diff --git 
> a/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/RelocatableVirt.c
>  
> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/RelocatableVirt.c
> new file mode 100644
> index 000000000000..e9fe114383a5
> --- /dev/null
> +++ 
> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/RelocatableVirt.c
> @@ -0,0 +1,78 @@
> +/** @file
> +*
> +*  Copyright (c) 2011-2013, ARM Limited. All rights reserved.
> +*  Copyright (c) 2014, Linaro Limited. All rights reserved.
> +*  Copyright (c) 2014, Red Hat, Inc.
> +*
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD 
> License
> +*  which accompanies this distribution.  The full text of the license may be 
> found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +*
> +**/
> +
> +#include <Library/IoLib.h>
> +#include <Library/ArmPlatformLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PcdLib.h>
> +#include <ArmPlatform.h>
> +#include <libfdt.h>
> +#include <Pi/PiBootMode.h>
> +#include <Uefi/UefiBaseType.h>
> +#include <Uefi/UefiMultiPhase.h>
> +#include <Pi/PiHob.h>
> +#include <Library/HobLib.h>
> +#include <Guid/EarlyPL011BaseAddress.h>
> +
> +/**
> +  Return the current Boot Mode
> +
> +  This function returns the boot reason on the platform
> +
> +  @return   Return the current Boot Mode of the platform
> +
> +**/
> +EFI_BOOT_MODE
> +ArmPlatformGetBootMode (
> +  VOID
> +  )
> +{
> +  return BOOT_WITH_FULL_CONFIGURATION;
> +}
> +
> +/**
> +  This function is called by PrePeiCore, in the SEC phase.
> +**/
> +RETURN_STATUS
> +ArmPlatformInitialize (
> +  IN  UINTN                     MpId
> +  )
> +{
> +  //
> +  // We are relying on ArmPlatformInitializeSystemMemory () being called from
> +  // InitializeMemory (), which only occurs if the following feature is 
> disabled
> +  //
> +  ASSERT (!FeaturePcdGet (PcdSystemMemoryInitializeInSec));
> +  return RETURN_SUCCESS;
> +}
> +
> +VOID
> +ArmPlatformInitializeSystemMemory (
> +  VOID
> +  )
> +{
> +}
> +
> +VOID
> +ArmPlatformGetPlatformPpiList (
> +  OUT UINTN                   *PpiListSize,
> +  OUT EFI_PEI_PPI_DESCRIPTOR  **PpiList
> +  )
> +{
> +  *PpiListSize = 0;
> +  *PpiList = NULL;
> +}
> diff --git 
> a/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/XenVirtMem.c
>  
> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/XenVirtMem.c
> new file mode 100644
> index 000000000000..657b840059c2
> --- /dev/null
> +++ 
> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/XenVirtMem.c
> @@ -0,0 +1,83 @@
> +/** @file
> +*
> +*  Copyright (c) 2014, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD 
> License
> +*  which accompanies this distribution.  The full text of the license may be 
> found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
> IMPLIED.
> +*
> +**/
> +
> +#include <Library/ArmPlatformLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <ArmPlatform.h>
> +
> +// Number of Virtual Memory Map Descriptors
> +#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS          2
> +
> +// DDR attributes
> +#define DDR_ATTRIBUTES_CACHED    ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK
> +#define DDR_ATTRIBUTES_UNCACHED  
> ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED
> +
> +EFI_PHYSICAL_ADDRESS
> +ArmGetPhysAddrTop (
> +  VOID
> +  );
> +
> +/**
> +  Return the Virtual Memory Map of your platform
> +
> +  This Virtual Memory Map is used by MemoryInitPei Module to initialize the 
> MMU
> +  on your platform.
> +
> +  @param[out]   VirtualMemoryMap    Array of ARM_MEMORY_REGION_DESCRIPTOR
> +                                    describing a Physical-to-Virtual Memory
> +                                    mapping. This array must be ended by a
> +                                    zero-filled entry
> +
> +**/
> +VOID
> +ArmPlatformGetVirtualMemoryMap (
> +  IN ARM_MEMORY_REGION_DESCRIPTOR** VirtualMemoryMap
> +  )
> +{
> +  ARM_MEMORY_REGION_DESCRIPTOR  *VirtualMemoryTable;
> +
> +  ASSERT (VirtualMemoryMap != NULL);
> +
> +  VirtualMemoryTable = AllocatePages (
> +                         EFI_SIZE_TO_PAGES (
> +                           sizeof (ARM_MEMORY_REGION_DESCRIPTOR)
> +                           * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS
> +                           )
> +                         );
> +
> +  if (VirtualMemoryTable == NULL) {
> +    DEBUG ((EFI_D_ERROR, "%a: Error: Failed AllocatePages()\n", 
> __FUNCTION__));
> +    return;
> +  }
> +
> +  //
> +  // Map the entire physical memory space as cached. The only device
> +  // we care about is the GIC, which will be stage 2 mapped as a device
> +  // by the hypervisor, which will override the cached mapping we install
> +  // here.
> +  //
> +  VirtualMemoryTable[0].PhysicalBase = 0x0;
> +  VirtualMemoryTable[0].VirtualBase  = 0x0;
> +  VirtualMemoryTable[0].Length       = ArmGetPhysAddrTop ();
> +  VirtualMemoryTable[0].Attributes   = DDR_ATTRIBUTES_CACHED;
> +
> +  // End of Table
> +  ZeroMem (&VirtualMemoryTable[1], sizeof (ARM_MEMORY_REGION_DESCRIPTOR));
> +
> +  *VirtualMemoryMap = VirtualMemoryTable;
> +}
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.