On Fri, Feb 23, 2018 at 01:28:58PM +0000, Ard Biesheuvel wrote:
> Now that the secure firmware image BL31 has been moved back into secure
> memory where it belongs, we can no longer keep the stage2 translation
> tables in the same image, given that EL2 is non-secure.
> 
> So instead, let's put those tables in the NOR flash, at the end of the
> ARM-TF region. This is difficult to integrate into the build sequence
> of either ARM-TF or UEFI, so let's just generate the binary and put it
> at the correct offset using the .fdf description of the platform.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
> ---
> I am not sure where to put this and how to integrate this into the build,
> hence the RFC.

Would it be feasible to generate this as part of the build (and hence
make it possible to keep the source in edk2-platforms)? Feels like it
could come in handy.

There is already a [Nasm-to-Binary-Code-File] rule in
build_rule.template, so I'd say there's precedent.

>  Platform/Socionext/DeveloperBox/README            |   2 +
>  Platform/Socionext/DeveloperBox/stage2_tables.S   |  95 ++++++++++++++++++++
>  Platform/Socionext/DeveloperBox/stage2_tables.bin | Bin 0 -> 20480 bytes
>  3 files changed, 97 insertions(+)
> 
> diff --git a/Platform/Socionext/DeveloperBox/README 
> b/Platform/Socionext/DeveloperBox/README
> index 8f079011e153..5728bf0ef88a 100644
> --- a/Platform/Socionext/DeveloperBox/README
> +++ b/Platform/Socionext/DeveloperBox/README
> @@ -6,3 +6,5 @@ fip_all_arm_tf.bin - prebuilt ARM Trusted Firmware RELEASE 
> binary
>  Repo: https://git.linaro.org/leg/noupstream/arm-trusted-firmware.git
>  Commit: cd3de9253d90f5ab6eed046fb7bb9f4e9f87ae5a
>  
> +stage2_tables.bin - prebuilt stage 2 translation tables
> +Built from stage2_tables.S in the same directory

If not possible to integrate in build, add the exact command line used
to generate file (and preferably toolchain version)?

/
    Leif

> diff --git a/Platform/Socionext/DeveloperBox/stage2_tables.S 
> b/Platform/Socionext/DeveloperBox/stage2_tables.S
> new file mode 100644
> index 000000000000..44da21e7e467
> --- /dev/null
> +++ b/Platform/Socionext/DeveloperBox/stage2_tables.S
> @@ -0,0 +1,95 @@
> +/** @file
> +  Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR>
> +
> +  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.
> +**/
> +
> +/*
> + * This file contains the assembler code to instantiate a set of stage 2
> + * translation tables that make the ECAM space of the Synopsys DesignWare
> + * PCIe root complexes appear sane to the OS.
> + * - ECAM 'shadows' caused by non TLP filtering root ports are eliminated
> + * - MMIO region are mapped with device attributes that supersede write 
> combine
> +     attributes that the OS may attempt to use, and which is not supported by
> +     the SoC.
> + *
> + * Build using:
> + *
> + * gcc -o stage2_tables.elf stage2_tables.S \
> + *            -Wl,-e,0x81f8000 -Wl,--section-start=.rodata=0x81f8000 
> -nostdlib
> + *
> + * objcopy -O binary -j .rodata stage2_tables.elf stage2_tables.bin
> + */
> +
> +#define      TT_S2_CONT_SHIFT                52
> +#define      TT_S2_AF                        (0x1 << 10)
> +#define      TT_S2_SH_NON_SHAREABLE          (0x0 << 8)
> +#define      TT_S2_AP_RW                     (0x3 << 6)
> +#define      TT_S2_MEMATTR_DEVICE_nGRE       (0x2 << 2)
> +#define      TT_S2_MEMATTR_MEMORY_WB         (0xf << 2)
> +#define      TT_S2_TABLE                     (0x3 << 0)
> +#define      TT_S2_L3_PAGE                   (0x1 << 1)
> +#define      TT_S2_VALID                     (0x1 << 0)
> +
> +     .altmacro
> +     .macro          for, start, count, do, arg2, arg3, arg4
> +     .if             \count == 1
> +     \do             \start, \arg2, \arg3, \arg4
> +     .elseif         \count > 1
> +     for             \start, %(\count / 2), \do, \arg2, \arg3, \arg4
> +     for             %(\start + \count / 2), %((\count + 1) / 2), \do, 
> \arg2, \arg3, \arg4
> +     .endif
> +     .endm
> +
> +     .macro          s2_dev_entry, base, shift=30, offset=0, cont=0
> +     .quad           ((\base << \shift) + \offset) | TT_S2_AF | TT_S2_AP_RW 
> | \
> +                     TT_S2_SH_NON_SHAREABLE | TT_S2_MEMATTR_DEVICE_nGRE | \
> +                     TT_S2_VALID | (\cont << TT_S2_CONT_SHIFT)
> +     .endm
> +
> +     .macro          s2_mem_entry, base, shift=30, offset=0, cont=0
> +     .quad           ((\base << \shift) + \offset) | TT_S2_AF | TT_S2_AP_RW 
> | \
> +                     TT_S2_SH_NON_SHAREABLE | TT_S2_MEMATTR_MEMORY_WB | \
> +                     TT_S2_VALID | (\cont << TT_S2_CONT_SHIFT)
> +     .endm
> +
> +     .macro          s2_l3_entry, base, offset=0, cont=0
> +     .quad           ((\base << 12) + \offset) | TT_S2_AF | TT_S2_AP_RW | \
> +                     TT_S2_SH_NON_SHAREABLE | TT_S2_MEMATTR_MEMORY_WB | \
> +                     TT_S2_L3_PAGE | TT_S2_VALID | (\cont << 
> TT_S2_CONT_SHIFT)
> +     .endm
> +
> +     .section        ".rodata", "a", %progbits
> +     /* level 1 */
> +     s2_mem_entry    0                       /* 0x0000_0000 - 0x3fff_ffff */
> +     .quad           1f + TT_S2_TABLE        /* 0x4000_0000 - 0x7fff_ffff */
> +     for               2, 246, s2_mem_entry  /* 0x8000_0000 - 0x3d_ffff_ffff 
> */
> +     for             248,   8, s2_dev_entry  /* PCIe MMIO64 */
> +     for             256, 768, s2_mem_entry  /* 0x40_0000_0000 - 
> 0xff_ffff_ffff */
> +
> +     /* level 2 */
> +1:   for             0, 256, s2_mem_entry, 21, 0x40000000, 1
> +
> +     .quad           2f + TT_S2_TABLE        /* 0x6000_0000 -> RC #0 bus 0 */
> +     for             1, 15, s2_mem_entry, 21, 0x60000000
> +     for             0, 48, s2_mem_entry, 21, 0x62000000, 1
> +     for             0, 64, s2_dev_entry, 21, 0x68000000, 1 /* PCIe MMIO32 */
> +
> +     .quad           3f + TT_S2_TABLE        /* 0x7000_0000 -> RC #1 bus 0 */
> +     for             1, 15, s2_mem_entry, 21, 0x70000000
> +     for             0, 48, s2_mem_entry, 21, 0x72000000, 1
> +     for             0, 64, s2_dev_entry, 21, 0x78000000, 1 /* PCIe MMIO32 */
> +
> +     /* level 3 */
> +2:   for             0,   8, s2_l3_entry, 0x60000000
> +     for             0,   8, s2_l3_entry, 0x60010000 /* hide device #1 */
> +     for             0, 496, s2_l3_entry, 0x60010000, 1
> +3:   for             0,   8, s2_l3_entry, 0x70000000
> +     for             0,   8, s2_l3_entry, 0x70010000 /* hide device #1 */
> +     for             0, 496, s2_l3_entry, 0x70010000, 1
> diff --git a/Platform/Socionext/DeveloperBox/stage2_tables.bin 
> b/Platform/Socionext/DeveloperBox/stage2_tables.bin
> new file mode 100644
> index 000000000000..48369f00c022
> Binary files /dev/null and 
> b/Platform/Socionext/DeveloperBox/stage2_tables.bin differ
> -- 
> 2.11.0
> 
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to