[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v7 01/10] kern/ieee1275/init: ppc64: Introduce a request for regi
From: |
Stefan Berger |
Subject: |
[PATCH v7 01/10] kern/ieee1275/init: ppc64: Introduce a request for regions_claim |
Date: |
Mon, 27 Nov 2023 06:58:44 -0500 |
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
use regions_claim() for memory allocation on PowerVM and KVM on Power
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 <stefanb@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
Cc: Hari Bathini <hbathini@linux.ibm.com>
Cc: Pavithra Prakash <pavrampu@in.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Carolyn Scherrer <cpscherr@us.ibm.com>
Cc: Mahesh Salgaonkar <mahesh@linux.ibm.com>
Cc: Sourabh Jain <sourabhjain@linux.ibm.com>
---
grub-core/Makefile.am | 2 ++
grub-core/kern/ieee1275/init.c | 43 ++++++++++++++++++++++++++--------
include/grub/ieee1275/alloc.h | 31 ++++++++++++++++++++++++
3 files changed, 66 insertions(+), 10 deletions(-)
create mode 100644 include/grub/ieee1275/alloc.h
diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am
index f0cb2f2cc..fc9fc6a90 100644
--- a/grub-core/Makefile.am
+++ b/grub-core/Makefile.am
@@ -153,6 +153,7 @@ endif
if COND_i386_ieee1275
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h
+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/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
@@ -240,6 +241,7 @@ endif
if COND_powerpc_ieee1275
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h
+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/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..b65fc9be5 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
+#if defined(__powerpc__) || defined(__i386__)
+#include <grub/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/ieee1275/alloc.h b/include/grub/ieee1275/alloc.h
new file mode 100644
index 000000000..12fade5e4
--- /dev/null
+++ b/include/grub/ieee1275/alloc.h
@@ -0,0 +1,31 @@
+/* alloc.h - Memory allocation for PowerVM, KVM on Power, and i386 */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2023 Free Software Foundation, Inc.
+ * Copyright (C) 2023 IBM Corporation
+ *
+ * GRUB is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GRUB is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GRUB_IEEE1275_ALLOC_HEADER
+#define GRUB_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_IEEE1275_ALLOC_HEADER */
--
2.42.0
- [PATCH v7 00/10] ppc64: Restrict memory allocations for kernel and initrd, Stefan Berger, 2023/11/27
- [PATCH v7 02/10] kern/ieee1275/init: ppc64: Decide by request whether to initialize region, Stefan Berger, 2023/11/27
- [PATCH v7 07/10] loader/powerpc/ieee1275: Use new allocation function for kernel and initrd, Stefan Berger, 2023/11/27
- [PATCH v7 04/10] kern/ieee1275/init: ppc64: Add support for alignment requirements, Stefan Berger, 2023/11/27
- [PATCH v7 05/10] kern/ieee1275/init: ppc64: Rename regions_claim to grub_regions_claim, Stefan Berger, 2023/11/27
- [PATCH v7 03/10] kern/ieee1275/init: ppc64: Return allocated address using context, Stefan Berger, 2023/11/27
- [PATCH v7 08/10] kern/ieee1275/ieee1275: debug: Display successful memory claims, Stefan Berger, 2023/11/27
- [PATCH v7 01/10] kern/ieee1275/init: ppc64: Introduce a request for regions_claim,
Stefan Berger <=
- [PATCH v7 09/10] kern/ieee1275/init: ppc64: Fix a comment, Stefan Berger, 2023/11/27
- [PATCH v7 10/10] kern/ieee1275/init: ppc64: Display upper_mem_limit for debugging, Stefan Berger, 2023/11/27
- [PATCH v7 06/10] kern/ieee1275/cmain: ppc64: Introduce flags to identify KVM and Power VM, Stefan Berger, 2023/11/27
- Re: [PATCH v7 00/10] ppc64: Restrict memory allocations for kernel and initrd, John Paul Adrian Glaubitz, 2023/11/27
- Re: [PATCH v7 00/10] ppc64: Restrict memory allocations for kernel and initrd, Stefan Berger, 2023/11/27
- Re: [PATCH v7 00/10] ppc64: Restrict memory allocations for kernel and initrd, Daniel Kiper, 2023/11/30