On Tue, Oct 31, 2023 at 01:50:23PM -0400, Stefan Berger wrote:
> The regions_claim() function limits the allocation of memory regions
> by excluding certain memory areas from being used by grub. This for
> example includes a gap between 640MB and 768MB as well as an upper
> limit beyond which no memory may be used when an fadump is present.
> However, the ieee1275 loader for kernel and initrd currently does not
> current use regions_claim() for memory allocation on PowerVM and
> PowerKVM and therefore may allocate memory in those areas that it
> should not use.
>
> To make the regions_claim() function more flexible and ulimately usable
> for the ieee1275 loader, introduce a request structure to pass various
> parameters to the regions_claim() function that describe the properties
> of requested memory chunks. In a first step, move the total and flags
> variables into this structure.
>
> Signed-off-by: Stefan Berger <stef...@linux.ibm.com>
> Cc: Hari Bathini <hbath...@linux.ibm.com>
> Cc: Pavithra Prakash <pavra...@in.ibm.com>
> Cc: Michael Ellerman <m...@ellerman.id.au>
> Cc: Carolyn Scherrer <cpsch...@us.ibm.com>
> Cc: Mahesh Salgaonkar <mah...@linux.ibm.com>
> Cc: Sourabh Jain <sourabhj...@linux.ibm.com>
> ---
>  grub-core/Makefile.am                 |  1 +
>  grub-core/kern/ieee1275/init.c        | 43 ++++++++++++++++++++-------
>  include/grub/powerpc/ieee1275/alloc.h | 11 +++++++
>  3 files changed, 45 insertions(+), 10 deletions(-)
>  create mode 100644 include/grub/powerpc/ieee1275/alloc.h
>
> diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am
> index f0cb2f2cc..4f9f3f963 100644
> --- a/grub-core/Makefile.am
> +++ b/grub-core/Makefile.am
> @@ -240,6 +240,7 @@ endif
>
>  if COND_powerpc_ieee1275
>  KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h
> +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/powerpc/ieee1275/alloc.h
>  KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
>  KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
>  KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
> diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
> index d6c9c9049..061c28c98 100644
> --- a/grub-core/kern/ieee1275/init.c
> +++ b/grub-core/kern/ieee1275/init.c
> @@ -46,6 +46,9 @@
>  #ifdef __sparc__
>  #include <grub/machine/kernel.h>
>  #endif
> +#ifdef __powerpc__
> +#include <grub/powerpc/ieee1275/alloc.h>
> +#endif
>
>  /* The maximum heap size we're going to claim at boot. Not used by sparc. */
>  #ifdef __i386__
> @@ -317,9 +320,9 @@ count_free (grub_uint64_t addr, grub_uint64_t len, 
> grub_memory_type_t type,
>
>  static int
>  regions_claim (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t 
> type,
> -           unsigned int flags, void *data)
> +            void *data)
>  {
> -  grub_uint32_t total = *(grub_uint32_t *) data;
> +  struct regions_claim_request *rcr = data;
>    grub_uint64_t linux_rmo_save;
>
>    if (type != GRUB_MEMORY_AVAILABLE)
> @@ -499,11 +502,11 @@ regions_claim (grub_uint64_t addr, grub_uint64_t len, 
> grub_memory_type_t type,
>              }
>          }
>      }
> -  if (flags & GRUB_MM_ADD_REGION_CONSECUTIVE && len < total)
> +  if (rcr->flags & GRUB_MM_ADD_REGION_CONSECUTIVE && len < rcr->total)
>      return 0;
>
> -  if (len > total)
> -    len = total;
> +  if (len > rcr->total)
> +    len = rcr->total;
>
>    if (len)
>      {
> @@ -513,12 +516,12 @@ regions_claim (grub_uint64_t addr, grub_uint64_t len, 
> grub_memory_type_t type,
>        if (err)
>       return err;
>        grub_mm_init_region ((void *) (grub_addr_t) addr, len);
> -      total -= len;
> +      rcr->total -= len;
>      }
>
> -  *(grub_uint32_t *) data = total;
> +  *(grub_uint32_t *) data = rcr->total;
>
> -  if (total == 0)
> +  if (rcr->total == 0)
>      return 1;
>
>    return 0;
> @@ -528,14 +531,34 @@ static int
>  heap_init (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
>          void *data)
>  {
> -  return regions_claim (addr, len, type, GRUB_MM_ADD_REGION_NONE, data);
> +  struct regions_claim_request rcr = {
> +    .flags = GRUB_MM_ADD_REGION_NONE,
> +    .total = *(grub_uint32_t *) data,
> +  };
> +  int ret;
> +
> +  ret = regions_claim (addr, len, type, &rcr);
> +
> +  *(grub_uint32_t *) data = rcr.total;
> +
> +  return ret;
>  }
>
>  static int
>  region_claim (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
>          void *data)
>  {
> -  return regions_claim (addr, len, type, GRUB_MM_ADD_REGION_CONSECUTIVE, 
> data);
> +  struct regions_claim_request rcr = {
> +    .flags = GRUB_MM_ADD_REGION_CONSECUTIVE,
> +    .total = *(grub_uint32_t *) data,
> +  };
> +  int ret;
> +
> +  ret = regions_claim (addr, len, type, &rcr);
> +
> +  *(grub_uint32_t *) data = rcr.total;
> +
> +  return ret;
>  }
>
>  static grub_err_t
> diff --git a/include/grub/powerpc/ieee1275/alloc.h 
> b/include/grub/powerpc/ieee1275/alloc.h
> new file mode 100644
> index 000000000..97b8c2683
> --- /dev/null
> +++ b/include/grub/powerpc/ieee1275/alloc.h
> @@ -0,0 +1,11 @@

Missing standard license header. Please add it.

> +#ifndef GRUB_POWERPC_IEEE1275_ALLOC_HEADER
> +#define GRUB_POWERPC_IEEE1275_ALLOC_HEADER   1
> +
> +#include <grub/memory.h>
> +
> +struct regions_claim_request {
> +  unsigned int flags;     /* GRUB_MM_ADD_REGION_(NONE|CONSECUTIVE) */
> +  grub_uint32_t total;    /* number of requested bytes */
> +};
> +
> +#endif /* GRUB_POWERPC_IEEE1275_ALLOC_HEADER */

Daniel

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

Reply via email to