Sent 0-7 and part of 11 separately taking all the comments into account:

    https://lists.gnu.org/archive/html/grub-devel/2024-09/msg00194.html

Regards,
Sergii

On Tue, Sep 17, 2024 at 11:06:51AM -0700, Ross Philipson via Grub-devel wrote:
> On 8/26/24 5:44 AM, Sergii Dmytruk wrote:
> > From: Daniel Kiper <daniel.ki...@oracle.com>
> > 
> > The functions calculate lowest and highest available RAM
> > addresses respectively.
> > 
> > Both functions are needed to calculate PMR boundaries for
> > Intel TXT secure launcher introduced by subsequent patches.
> 
> After discussing this we think the best course of action is to submit the
> first 7 patches standalone (also see my response to patch 11 that is
> coming). For this patch I would just remove the last sentence about TXT so
> it is not tied to the DRTM work.
> 
> Then you can submit this set (with the couple of the changes I suggested
> earlier) and we can more easily get this part in.
> 
> Thanks
> Ross
> 
> > 
> > Signed-off-by: Daniel Kiper <daniel.ki...@oracle.com>
> > ---
> >   grub-core/mmap/mmap.c | 83 +++++++++++++++++++++++++++++++++++++++++++
> >   include/grub/memory.h |  3 ++
> >   2 files changed, 86 insertions(+)
> > 
> > diff --git a/grub-core/mmap/mmap.c b/grub-core/mmap/mmap.c
> > index c8c8312c5..80d6c60b8 100644
> > --- a/grub-core/mmap/mmap.c
> > +++ b/grub-core/mmap/mmap.c
> > @@ -26,6 +26,7 @@
> >   #include <grub/command.h>
> >   #include <grub/dl.h>
> >   #include <grub/i18n.h>
> > +#include <grub/safemath.h>
> >   GRUB_MOD_LICENSE ("GPLv3+");
> > @@ -343,6 +344,88 @@ grub_mmap_unregister (int handle)
> >   #endif /* ! GRUB_MMAP_REGISTER_BY_FIRMWARE */
> > +typedef struct
> > +{
> > +  grub_uint64_t addr;
> > +  grub_uint64_t limit;
> > +} addr_limit_t;
> > +
> > +/* Helper for grub_mmap_get_lowest(). */
> > +static int
> > +lowest_hook (grub_uint64_t addr, grub_uint64_t size, grub_memory_type_t 
> > type,
> > +             void *data)
> > +{
> > +  addr_limit_t *al = data;
> > +  grub_uint64_t end;
> > +
> > +  if (type != GRUB_MEMORY_AVAILABLE)
> > +    return 0;
> > +
> > +  if (grub_add (addr, size, &end))
> > +    return 0;
> > +
> > +  if (addr >= al->limit)
> > +    al->addr = grub_min (al->addr, addr);
> > +
> > +  if ((addr < al->limit) && (end > al->limit))
> > +    al->addr = al->limit;
> > +
> > +  return 0;
> > +}
> > +
> > +/*
> > + * This function calculates lowest available RAM address that is at or 
> > above
> > + * the passed limit.  If no RAM exists above the limit, ~0 is returned.
> > + */
> > +grub_uint64_t
> > +grub_mmap_get_lowest (grub_uint64_t limit)
> > +{
> > +  addr_limit_t al = {~0, limit};
> > +
> > +  grub_mmap_iterate (lowest_hook, &al);
> > +
> > +  return al.addr;
> > +}
> > +
> > +/* Helper for grub_mmap_get_highest(). */
> > +static int
> > +highest_hook (grub_uint64_t addr, grub_uint64_t size, grub_memory_type_t 
> > type,
> > +              void *data)
> > +{
> > +  addr_limit_t *al = data;
> > +  grub_uint64_t end;
> > +
> > +  if (type != GRUB_MEMORY_AVAILABLE)
> > +    return 0;
> > +
> > +  if (grub_add (addr, size, &end))
> > +    return 0;
> > +
> > +  if (end < al->limit)
> > +    al->addr = grub_max (al->addr, end);
> > +
> > +  if ((addr < al->limit) && (end >= al->limit))
> > +    al->addr = al->limit;
> > +
> > +  return 0;
> > +}
> > +
> > +/*
> > + * This function calculates highest available RAM address that is below the
> > + * passed limit.  Returned address is either one byte after last byte of 
> > RAM or
> > + * equal to limit, whichever is lower.  If no RAM exists below limit, 0 is
> > + * returned.
> > + */
> > +grub_uint64_t
> > +grub_mmap_get_highest (grub_uint64_t limit)
> > +{
> > +  addr_limit_t al = {0, limit};
> > +
> > +  grub_mmap_iterate (highest_hook, &al);
> > +
> > +  return al.addr;
> > +}
> > +
> >   #define CHUNK_SIZE        0x400
> >   struct badram_entry {
> > diff --git a/include/grub/memory.h b/include/grub/memory.h
> > index 6da114a1b..8f22f7525 100644
> > --- a/include/grub/memory.h
> > +++ b/include/grub/memory.h
> > @@ -69,6 +69,9 @@ void *grub_mmap_malign_and_register (grub_uint64_t align, 
> > grub_uint64_t size,
> >   void grub_mmap_free_and_unregister (int handle);
> > +extern grub_uint64_t grub_mmap_get_lowest (grub_uint64_t limit);
> > +extern grub_uint64_t grub_mmap_get_highest (grub_uint64_t limit);
> > +
> >   #ifndef GRUB_MMAP_REGISTER_BY_FIRMWARE
> >   struct grub_mmap_region

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to