Hi Ilias,

On Thu, 6 Feb 2025 at 05:40, Ilias Apalodimas
<ilias.apalodi...@linaro.org> wrote:
>
> Hi Simon,
>
> On Thu, 6 Feb 2025 at 14:33, Simon Glass <s...@chromium.org> wrote:
> >
> > Hi Ilias,
> >
> > On Thu, 30 Jan 2025 at 00:21, Ilias Apalodimas
> > <ilias.apalodi...@linaro.org> wrote:
> > >
> > > U-Boot maps all pages as RWX. Sadly it's not not 1990 anymore and we are
> > > better off mapping binaries with proper permissions.
> > >
> > > This is an attempt to map the U-Boot binary properly, but leave the
> > > area we load binaries unaffected and RWX.
> > >
> > > patch #1 adds printing capabilities for page permissions in meminfo
> > > patch #2 prepares our linker scripts, aligns sections in page boundaries 
> > > etc
> > > patch #3 is adding a function to change page tables
> > > patch #4 sets the permissions for .rodata, .text and .data
> > >
> > > There's a few problems problem in this RFC ...
> > > - U-Boot has no MMU APIs in place. As a result I just wired up the 
> > > function
> > >   changing the page permissions in board_r.c but only for arm64. In the 
> > > long
> > >   term we should add an API that other archs can use if they wish/can
> >
> > But this creates more work for others. It would be better to do the
> > job properly at the start. You don't need to support other archs, but
> > you should create a plausible API and some structs which others can
> > use. See cpu.h for some ideas. Of course you can't predict the future,
> > but others will build on it if you make an effort. Otherwise, I doubt
> > anyone else will (later) clean it up.
>
> I can move that function to cpu_ops.h and have if NULL for other archs
>
> >
> > > - meminfo doesn't align all results properly (Caleb?)
> > > - I am not setting the permissions of EFI runtime services section on 
> > > purpose.
> > >   Since the OS is allowed to call SetVirtualAddressMap, we need to reset 
> > > the
> > >   pages to RWX just before ExitBootServices, so the OS can relocate that 
> > > code.
> > >   In arm64 this isn't a huge problem, because we explicitly disable SVAM 
> > > if
> > >   if VA_BITS > 39, but other OSes/archs will have a problem.
> > >
> > > # TODO:
> > > - Long term. Add an MMU API and use that instead of exporting arch 
> > > specific
> > >   functions
> > > - Add an enum in mmu_set_attrs() instead of 1,2,3 arguments
> > > - Set the permissions of EFI runtime services anbd reset them before EBS()
> > > - Fix alignment when printing pages & information
> > > - Add a Kconfig option so the feature can be turned off.
> > >   The reason is that QEMU CI and some boards, fail because they are 
> > > trying to
> > >   write RO pages. This usually happens due to variables being wrongly 
> > > defined as
> > >   const, but with the updated page permissions this leads to a crash [0] 
> > > [1].
> > >   In both cases the reported ESR is 0x9600004f which translates to
> > >   "Abort caused by writing to memory" "Permission fault, level 3.". On 
> > > top of
> > >   that not setting pages as RO (and only setting .data and .text 
> > > sections) works
> > >   fine. So until we find and fix the bugs above we can't turn this on
> > >   unconditionally.
> > >
> > > # Open questions
> > > - Is initr_reloc_global_data() the right place to change permissions? Or 
> > > is there
> > >   a better/safer place to do that?
> > >
> > > # How to test patches
> > > - Aplly them an enable
> > >   CONFIG_CMD_MEMINFO=y
> > >   CONFIG_CMD_MEMINFO_MAP=y
> > >   'meminfo' should print something along the lines of
> > > => meminfo
> > > DRAM:  8 GiB
> > > Walking pagetable at 000000023ffe0000, va_bits: 40. Using 4 levels
> > > [0x23ffe1000]                     |  Table |               |
> > >   [0x23ffe2000]                   |  Table |               |
> > >     [0x000000000 - 0x008000000]   |  Block | RWX | Normal        | 
> > > Inner-shareable
> > >     [0x008000000 - 0x040000000]   |  Block | RW | Device-nGnRnE | 
> > > Non-shareable
> > >   [0x040000000 - 0x200000000]     |  Block | RWX | Normal        | 
> > > Inner-shareable
> > >   [0x23ffea000]                   |  Table |               |
> > >     [0x200000000 - 0x23f600000]   |  Block | RWX | Normal        | 
> > > Inner-shareable
> > >     [0x23ffeb000]                 |  Table |               |
> > >       [0x23f600000 - 0x23f68b000] |  Pages | RWX | Normal        | 
> > > Inner-shareable
> > >       [0x23f68b000 - 0x23f74e000] |  Pages | RX | Normal        | 
> > > Inner-shareable
> > >       [0x23f74e000 - 0x23f793000] |  Pages | RO | Normal        | 
> > > Inner-shareable
> > >       [0x23f793000 - 0x23f794000] |  Pages | RWX | Normal        | 
> > > Inner-shareable
> > >       [0x23f794000 - 0x23f79d000] |  Pages | RW | Normal        | 
> > > Inner-shareable
> > >       [0x23f79d000 - 0x23f800000] |  Pages | RWX | Normal        | 
> > > Inner-shareable
> > >     [0x23f800000 - 0x240000000]   |  Block | RWX | Normal        | 
> > > Inner-shareable
> > >   [0x240000000 - 0x4000000000]     |  Block | RWX | Normal        | 
> > > Inner-shareable
> > >   [0x23ffe3000]                   |  Table |               |
> > >     [0x4010000000 - 0x4020000000]   |  Block | RW | Device-nGnRnE | 
> > > Non-shareable
> > > [0x23ffe4000]                     |  Table |               |
> > >   [0x8000000000 - 0x10000000000]     |  Block | RW | Device-nGnRnE | 
> > > Non-shareable
> >
> > No, this is not a memory map.
>
> This is *literally* the memory map.

The memory map currently has a single address and describes what each
region is for. This looks like a detailed list of some other
attributes.

>
> > Please make all that stuff an option.
> > Try to use generic structs to print it, not ARM-specific code.
>
> How? The information in the page tables is arch specific.

enum cpu_mem_permission {
   CPUMP_RO = BIT(0),
   CPUMP_RW = BIT(1),
   etc.
};

struct cpu_mem_attrs {
   uint permission;   /* enum cpu_mem_permission */
   (more things here)
};

Regards,
Simon


>
> Thanks
> /Ilias
> >
> > >
> > > [0] 
> > > https://lore.kernel.org/u-boot/20250129-rockchip-pinctrl-const-v1-0-450ccdadf...@cherry.de/
> > > [1] https://source.denx.de/u-boot/custodians/u-boot-tpm/-/jobs/1008714
> > >
> > > Ilias Apalodimas (4):
> > >   meminfo: add memory details for armv8
> > >   arm: Prepare linker scripts for memory permissions
> > >   arm64: mmu_change_region_attr() add an option not to break PTEs
> > >   arm64: Change mapping for data/rodata/text
> > >
> > >  Makefile                                | 15 +++++----
> > >  arch/arm/cpu/armv8/cache_v8.c           | 45 +++++++++++++++++++++++--
> > >  arch/arm/cpu/armv8/fsl-layerscape/cpu.c | 10 +++---
> > >  arch/arm/cpu/armv8/u-boot.lds           | 32 +++++++++++-------
> > >  arch/arm/include/asm/armv8/mmu.h        |  2 ++
> > >  arch/arm/include/asm/system.h           |  3 +-
> > >  arch/arm/mach-snapdragon/board.c        |  2 +-
> > >  cmd/meminfo.c                           |  5 +++
> > >  common/board_r.c                        |  7 ++++
> > >  include/asm-generic/sections.h          |  2 ++
> > >  lib/efi_loader/efi_runtime.c            |  2 ++
> > >  11 files changed, 97 insertions(+), 28 deletions(-)
> > >
> > > --
> > > 2.43.0
> > >
> >
> > Regards,
> > Simon

Reply via email to