Hi Sami, 

Inline reply.

> -----Original Message-----
> From: Sami Mujawar <sami.muja...@arm.com>
> Sent: Tuesday, November 22, 2022 11:48 PM
> To: Jianyong Wu <jianyong...@arm.com>; devel@edk2.groups.io
> Cc: ardb+tianoc...@kernel.org; Justin He <justin...@arm.com>; nd
> <n...@arm.com>
> Subject: Re: [PATCH 2/3] CloudHv:arm: build hob for kernel image memory as
> read-only
> 
> Hi Jianyong,
> 
> Please see my feedback marked inline as [SAMI].
> 
> Regards,
> 
> Sami Mujawar
> 
> On 16/09/2022 03:46 am, Jianyong Wu wrote:
> > As we use memory to pass kernel image, the memory region where kernel
> > image locates should be added into hob as read-only.
> >
> > Signed-off-by: Jianyong Wu <jianyong...@arm.com>
> > ---
> >   .../CloudHvVirtMemInfoLib.c                   | 66 +++++++++++++++++--
> >   1 file changed, 62 insertions(+), 4 deletions(-)
> >
> > diff --git
> > a/ArmVirtPkg/Library/CloudHvVirtMemInfoLib/CloudHvVirtMemInfoLib.c
> > b/ArmVirtPkg/Library/CloudHvVirtMemInfoLib/CloudHvVirtMemInfoLib.c
> > index 28a0c0b078..d9b7d51a16 100644
> > ---
> a/ArmVirtPkg/Library/CloudHvVirtMemInfoLib/CloudHvVirtMemInfoLib.c
> > +++
> b/ArmVirtPkg/Library/CloudHvVirtMemInfoLib/CloudHvVirtMemInfoLib.c
> > @@ -37,13 +37,14 @@ CloudHvVirtMemInfoPeiLibConstructor (
> >     )
> >   {
> >     VOID                         *DeviceTreeBase;
> > -  EFI_RESOURCE_ATTRIBUTE_TYPE  ResourceAttributes;
> > +  EFI_RESOURCE_ATTRIBUTE_TYPE  ResourceAttributes,
> > + ReadOnlyResourceAttributes;
> >     INT32                        Node, Prev;
> >     UINT64                       FirMemNodeBase, FirMemNodeSize;
> > -  UINT64                       CurBase, MemBase;
> > +  UINT64                       CurBase, MemBase, CurSizeOff;
> >     UINT64                       CurSize;
> > +  UINT64                       KernelStart, KernelSize;
> >     CONST CHAR8                  *Type;
> > -  INT32                        Len;
> > +  INT32                        Len, ChosenNode;
> >     CONST UINT64                 *RegProp;
> >     RETURN_STATUS                PcdStatus;
> >     UINT8                        Index;
> > @@ -53,6 +54,8 @@ CloudHvVirtMemInfoPeiLibConstructor (
> >     FirMemNodeBase     = 0;
> >     FirMemNodeSize     = 0;
> >     Index              = 0;
> > +  CurSizeOff         = 0;
> > +  KernelSize         = 0;
> >     MemBase            = FixedPcdGet64 (PcdSystemMemoryBase);
> >     ResourceAttributes = (
> >                           EFI_RESOURCE_ATTRIBUTE_PRESENT | @@ -60,6
> > +63,12 @@ CloudHvVirtMemInfoPeiLibConstructor (
> >                           EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |
> >                           EFI_RESOURCE_ATTRIBUTE_TESTED
> >                           );
> > +  ReadOnlyResourceAttributes = (
> > +                                EFI_RESOURCE_ATTRIBUTE_PRESENT |
> > +                                EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
> > +                                EFI_RESOURCE_ATTRIBUTE_TESTED |
> > +                                EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTED
> > +                                );
> >     DeviceTreeBase = (VOID *)(UINTN)PcdGet64
> (PcdDeviceTreeInitialBaseAddress);
> >     if (DeviceTreeBase == NULL) {
> >       return EFI_NOT_FOUND;
> > @@ -72,6 +81,21 @@ CloudHvVirtMemInfoPeiLibConstructor (
> >       return EFI_NOT_FOUND;
> >     }
> >
> > +  //
> > +  // Try to get kernel image info from DT  //  ChosenNode =
> > + fdt_path_offset (DeviceTreeBase, "/chosen");  if (ChosenNode >= 0) {
> > +    RegProp = fdt_getprop (DeviceTreeBase, ChosenNode, "linux,kernel-
> start", &Len);
> > +    if ((RegProp != NULL) && (Len > 0)) {
> > +      KernelStart = (UINT64)fdt64_to_cpu (ReadUnaligned64 (RegProp));
> > +      RegProp     = fdt_getprop (DeviceTreeBase, ChosenNode,
> "linux,kernel-size", &Len);
> > +      if ((RegProp != NULL) && (Len > 0)) {
> > +        KernelSize = (UINT64)fdt64_to_cpu (ReadUnaligned64 (RegProp));
> > +      }
> > +    }
> > +  }
> > +
> >     //
> >     // Look for the lowest memory node
> >     //
> > @@ -105,11 +129,26 @@ CloudHvVirtMemInfoPeiLibConstructor (
> >
> >           // We should build Hob seperately for the memory node except the
> first one
> >           if (CurBase != MemBase) {
> > +          // If kernel image resides in current memory node, build hob from
> CurBase to the beginning of kernel image.
> > +          if ((KernelSize != 0) && (KernelStart >= CurBase) && 
> > (KernelStart +
> KernelSize <= CurBase + CurSize)) {
> > +            CurSizeOff =  CurBase + CurSize - KernelStart;
> > +            // align up with 0x1000
> > +            CurSizeOff = (CurSizeOff + 0xfff) & ~0xfffUL;
> > +          }
> > +
> >             BuildResourceDescriptorHob (
> >               EFI_RESOURCE_SYSTEM_MEMORY,
> >               ResourceAttributes,
> >               CurBase,
> > -            CurSize
> > +            CurSize - CurSizeOff
> > +            );
> > +
> > +          // Add kernel image memory region to hob as read only
> > +          BuildResourceDescriptorHob (
> > +            EFI_RESOURCE_SYSTEM_MEMORY,
> > +            ReadOnlyResourceAttributes,
> > +            CurBase + CurSize - CurSizeOff,
> > +            CurSizeOff
> >               );
> 
> [SAMI] Can you explain why this is required and what would happen if this is
> not done, please?  It would be good to add this description to the commit
> message.
>       
As we need put kernel image into a range of memory, we can't let uefi modify 
that region, so we need set it as read-only.
If not, kernel won't start after load.
But I'm not sure how does it impact kernel, for example, the memory used for 
kernel may decrease, however, I have no better way to do this.

> Also, what about the initrd and the commandline?

I have not considered initrd yet. If there is a requirement for it, we can add 
later.
Command line is just a string, so it can be conveyed by fdt directly without 
occupy memory.

Thanks
Jianyong
> 
> [/SAMI]
> 
> >           } else {
> >             FirMemNodeBase = CurBase;
> > @@ -146,8 +185,27 @@ CloudHvVirtMemInfoPeiLibConstructor (
> >       return EFI_NOT_FOUND;
> >     }
> >
> > +  CurSizeOff = 0;
> > +  // Build hob for the lowest memory node from its base to the
> > + beginning of kernel image once the kernel image reside here  if
> ((KernelSize != 0) && (KernelStart >= FirMemNodeBase) && (KernelStart +
> KernelSize <= FirMemNodeBase + FirMemNodeSize)) {
> > +    CurSizeOff = FirMemNodeBase + FirMemNodeSize - KernelStart;
> > +    // Caution the alignment
> > +    CurSizeOff = (CurSizeOff + 0xfff) & ~0xfffUL;
> > +
> > +    // Add kernel image memory region to hob as read only
> > +    BuildResourceDescriptorHob (
> > +      EFI_RESOURCE_SYSTEM_MEMORY,
> > +      ReadOnlyResourceAttributes,
> > +      FirMemNodeBase + FirMemNodeSize - CurSizeOff,
> > +      CurSizeOff
> > +      );
> > +  }
> > +
> > +  FirMemNodeSize -= CurSizeOff;
> > +
> >     PcdStatus = PcdSet64S (PcdSystemMemorySize, FirMemNodeSize);
> >     ASSERT_RETURN_ERROR (PcdStatus);
> > +
> >     ASSERT (
> >       (((UINT64)PcdGet64 (PcdFdBaseAddress) +
> >         (UINT64)PcdGet32 (PcdFdSize)) <= FirMemNodeBase) ||


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#96583): https://edk2.groups.io/g/devel/message/96583
Mute This Topic: https://groups.io/mt/93715217/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to