* [PATCH v4 01/10] kern/ieee1275/init: ppc64: Introduce a request for regions_claim
2023-11-10 16:09 [PATCH v4 00/10] ppc64: Restrict memory allocations for kernel and initrd Stefan Berger
@ 2023-11-10 16:09 ` Stefan Berger
2023-11-10 16:09 ` [PATCH v4 02/10] kern/ieee1275/init: ppc64: Decide by request whether to initialize region Stefan Berger
` (8 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Stefan Berger @ 2023-11-10 16:09 UTC (permalink / raw)
To: grub-devel
Cc: dkiper, hbathini, pavrampu, mpe, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Stefan Berger, Daniel Kiper
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 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 <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 | 1 +
grub-core/kern/ieee1275/init.c | 43 ++++++++++++++++++++-------
include/grub/powerpc/ieee1275/alloc.h | 30 +++++++++++++++++++
3 files changed, 64 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..fc45a51b2
--- /dev/null
+++ b/include/grub/powerpc/ieee1275/alloc.h
@@ -0,0 +1,30 @@
+/* alloc.h - Memory allocation for PowerVM/KVM */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2003,2004,2005,2007 Free Software Foundation, Inc.
+ *
+ * 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_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 */
--
2.25.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v4 02/10] kern/ieee1275/init: ppc64: Decide by request whether to initialize region
2023-11-10 16:09 [PATCH v4 00/10] ppc64: Restrict memory allocations for kernel and initrd Stefan Berger
2023-11-10 16:09 ` [PATCH v4 01/10] kern/ieee1275/init: ppc64: Introduce a request for regions_claim Stefan Berger
@ 2023-11-10 16:09 ` Stefan Berger
2023-11-10 16:09 ` [PATCH v4 03/10] kern/ieee1275/init: ppc64: Return allocated address using context Stefan Berger
` (7 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Stefan Berger @ 2023-11-10 16:09 UTC (permalink / raw)
To: grub-devel
Cc: dkiper, hbathini, pavrampu, mpe, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Stefan Berger, Daniel Kiper
Let the regions_claim() request structure's init_region determine whether
to call grub_mm_init_region() on it. This allows for adding memory to
GRUB's memory heap if init_region is set to true, or direct usage of the
memory otherwise. Set all current callers' init_region to true since they
want to add memory regions to GRUB's heap.
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/kern/ieee1275/init.c | 5 ++++-
include/grub/powerpc/ieee1275/alloc.h | 3 +++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
index 061c28c98..217f25fae 100644
--- a/grub-core/kern/ieee1275/init.c
+++ b/grub-core/kern/ieee1275/init.c
@@ -515,7 +515,8 @@ regions_claim (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
err = grub_claimmap (addr, len);
if (err)
return err;
- grub_mm_init_region ((void *) (grub_addr_t) addr, len);
+ if (rcr->init_region)
+ grub_mm_init_region ((void *) (grub_addr_t) addr, len);
rcr->total -= len;
}
@@ -534,6 +535,7 @@ heap_init (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
struct regions_claim_request rcr = {
.flags = GRUB_MM_ADD_REGION_NONE,
.total = *(grub_uint32_t *) data,
+ .init_region = true,
};
int ret;
@@ -551,6 +553,7 @@ region_claim (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
struct regions_claim_request rcr = {
.flags = GRUB_MM_ADD_REGION_CONSECUTIVE,
.total = *(grub_uint32_t *) data,
+ .init_region = true,
};
int ret;
diff --git a/include/grub/powerpc/ieee1275/alloc.h b/include/grub/powerpc/ieee1275/alloc.h
index fc45a51b2..dd7a847a5 100644
--- a/include/grub/powerpc/ieee1275/alloc.h
+++ b/include/grub/powerpc/ieee1275/alloc.h
@@ -20,11 +20,14 @@
#ifndef GRUB_POWERPC_IEEE1275_ALLOC_HEADER
#define GRUB_POWERPC_IEEE1275_ALLOC_HEADER 1
+#include <stdbool.h>
+
#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 */
+ bool init_region; /* whether to add memory to the heap using grub_mm_init_region() */
};
#endif /* GRUB_POWERPC_IEEE1275_ALLOC_HEADER */
--
2.25.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v4 03/10] kern/ieee1275/init: ppc64: Return allocated address using context
2023-11-10 16:09 [PATCH v4 00/10] ppc64: Restrict memory allocations for kernel and initrd Stefan Berger
2023-11-10 16:09 ` [PATCH v4 01/10] kern/ieee1275/init: ppc64: Introduce a request for regions_claim Stefan Berger
2023-11-10 16:09 ` [PATCH v4 02/10] kern/ieee1275/init: ppc64: Decide by request whether to initialize region Stefan Berger
@ 2023-11-10 16:09 ` Stefan Berger
2023-11-10 16:09 ` [PATCH v4 04/10] kern/ieee1275/init: ppc64: Add support for alignment requirements Stefan Berger
` (6 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Stefan Berger @ 2023-11-10 16:09 UTC (permalink / raw)
To: grub-devel
Cc: dkiper, hbathini, pavrampu, mpe, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Stefan Berger, Daniel Kiper
Return the allocated address of the memory block in the request structure
if a memory allocation was actually done. Leave the address untouched
otherwise. This enables a caller who wants to use the allocated memory
directly (rather than adding the memory to the heap) to see where memory
was allocated. None of the current callers need this but the converted
ieee1275 loader will make use of it.
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/kern/ieee1275/init.c | 2 ++
include/grub/powerpc/ieee1275/alloc.h | 1 +
2 files changed, 3 insertions(+)
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
index 217f25fae..6d5fb573a 100644
--- a/grub-core/kern/ieee1275/init.c
+++ b/grub-core/kern/ieee1275/init.c
@@ -518,6 +518,8 @@ regions_claim (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
if (rcr->init_region)
grub_mm_init_region ((void *) (grub_addr_t) addr, len);
rcr->total -= len;
+
+ rcr->addr = addr;
}
*(grub_uint32_t *) data = rcr->total;
diff --git a/include/grub/powerpc/ieee1275/alloc.h b/include/grub/powerpc/ieee1275/alloc.h
index dd7a847a5..9aaea4d46 100644
--- a/include/grub/powerpc/ieee1275/alloc.h
+++ b/include/grub/powerpc/ieee1275/alloc.h
@@ -28,6 +28,7 @@ struct regions_claim_request {
unsigned int flags; /* GRUB_MM_ADD_REGION_(NONE|CONSECUTIVE) */
grub_uint32_t total; /* number of requested bytes */
bool init_region; /* whether to add memory to the heap using grub_mm_init_region() */
+ grub_uint64_t addr; /* result address */
};
#endif /* GRUB_POWERPC_IEEE1275_ALLOC_HEADER */
--
2.25.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v4 04/10] kern/ieee1275/init: ppc64: Add support for alignment requirements
2023-11-10 16:09 [PATCH v4 00/10] ppc64: Restrict memory allocations for kernel and initrd Stefan Berger
` (2 preceding siblings ...)
2023-11-10 16:09 ` [PATCH v4 03/10] kern/ieee1275/init: ppc64: Return allocated address using context Stefan Berger
@ 2023-11-10 16:09 ` Stefan Berger
2023-11-10 16:09 ` [PATCH v4 05/10] kern/ieee1275/init: ppc64: Rename regions_claim to grub_regions_claim Stefan Berger
` (5 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Stefan Berger @ 2023-11-10 16:09 UTC (permalink / raw)
To: grub-devel
Cc: dkiper, hbathini, pavrampu, mpe, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Stefan Berger, Daniel Kiper
Add support for memory alignment requirements and adjust a candidate
address to it before checking whether the block is large enough. This
must be done in this order since the alignment adjustment can make a
block smaller than what was requested.
None of the current callers has memory alignment requirements but the
ieee1275 loader for kernel and initrd will use it to convey them.
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/kern/ieee1275/init.c | 14 ++++++++++++++
include/grub/powerpc/ieee1275/alloc.h | 1 +
2 files changed, 15 insertions(+)
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
index 6d5fb573a..d71d4b682 100644
--- a/grub-core/kern/ieee1275/init.c
+++ b/grub-core/kern/ieee1275/init.c
@@ -502,6 +502,20 @@ regions_claim (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
}
}
}
+
+ /* Honor alignment restrictions on candidate addr */
+ if (rcr->align)
+ {
+ grub_uint64_t align_addr = ALIGN_UP (addr, rcr->align);
+ grub_uint64_t d = align_addr - addr;
+
+ if (d > len)
+ return 0;
+
+ len -= d;
+ addr = align_addr;
+ }
+
if (rcr->flags & GRUB_MM_ADD_REGION_CONSECUTIVE && len < rcr->total)
return 0;
diff --git a/include/grub/powerpc/ieee1275/alloc.h b/include/grub/powerpc/ieee1275/alloc.h
index 9aaea4d46..9258eded1 100644
--- a/include/grub/powerpc/ieee1275/alloc.h
+++ b/include/grub/powerpc/ieee1275/alloc.h
@@ -29,6 +29,7 @@ struct regions_claim_request {
grub_uint32_t total; /* number of requested bytes */
bool init_region; /* whether to add memory to the heap using grub_mm_init_region() */
grub_uint64_t addr; /* result address */
+ grub_size_t align; /* alignment restrictions */
};
#endif /* GRUB_POWERPC_IEEE1275_ALLOC_HEADER */
--
2.25.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v4 05/10] kern/ieee1275/init: ppc64: Rename regions_claim to grub_regions_claim
2023-11-10 16:09 [PATCH v4 00/10] ppc64: Restrict memory allocations for kernel and initrd Stefan Berger
` (3 preceding siblings ...)
2023-11-10 16:09 ` [PATCH v4 04/10] kern/ieee1275/init: ppc64: Add support for alignment requirements Stefan Berger
@ 2023-11-10 16:09 ` Stefan Berger
2023-11-10 16:09 ` [PATCH v4 06/10] kern/ieee1275/cmain: ppc64: Introduce flags to identify Power VM and KVM Stefan Berger
` (4 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Stefan Berger @ 2023-11-10 16:09 UTC (permalink / raw)
To: grub-devel
Cc: dkiper, hbathini, pavrampu, mpe, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Stefan Berger, Daniel Kiper
Rename regions_claim() to grub_regions_claim() to make it available for
memory allocation. The ieee1275 loader will use this function on PowerVM
and PowerKVM and thus avoid usage of memory that it is not allowed to use.
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/kern/ieee1275/init.c | 10 +++++-----
include/grub/powerpc/ieee1275/alloc.h | 3 +++
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
index d71d4b682..5d9d86c12 100644
--- a/grub-core/kern/ieee1275/init.c
+++ b/grub-core/kern/ieee1275/init.c
@@ -318,9 +318,9 @@ count_free (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
return 0;
}
-static int
-regions_claim (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
- void *data)
+int
+grub_regions_claim (grub_uint64_t addr, grub_uint64_t len,
+ grub_memory_type_t type, void *data)
{
struct regions_claim_request *rcr = data;
grub_uint64_t linux_rmo_save;
@@ -555,7 +555,7 @@ heap_init (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
};
int ret;
- ret = regions_claim (addr, len, type, &rcr);
+ ret = grub_regions_claim (addr, len, type, &rcr);
*(grub_uint32_t *) data = rcr.total;
@@ -573,7 +573,7 @@ region_claim (grub_uint64_t addr, grub_uint64_t len, grub_memory_type_t type,
};
int ret;
- ret = regions_claim (addr, len, type, &rcr);
+ ret = grub_regions_claim (addr, len, type, &rcr);
*(grub_uint32_t *) data = rcr.total;
diff --git a/include/grub/powerpc/ieee1275/alloc.h b/include/grub/powerpc/ieee1275/alloc.h
index 9258eded1..df39c43dd 100644
--- a/include/grub/powerpc/ieee1275/alloc.h
+++ b/include/grub/powerpc/ieee1275/alloc.h
@@ -32,4 +32,7 @@ struct regions_claim_request {
grub_size_t align; /* alignment restrictions */
};
+int EXPORT_FUNC(grub_regions_claim) (grub_uint64_t addr, grub_uint64_t len,
+ grub_memory_type_t type, void *data);
+
#endif /* GRUB_POWERPC_IEEE1275_ALLOC_HEADER */
--
2.25.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v4 06/10] kern/ieee1275/cmain: ppc64: Introduce flags to identify Power VM and KVM
2023-11-10 16:09 [PATCH v4 00/10] ppc64: Restrict memory allocations for kernel and initrd Stefan Berger
` (4 preceding siblings ...)
2023-11-10 16:09 ` [PATCH v4 05/10] kern/ieee1275/init: ppc64: Rename regions_claim to grub_regions_claim Stefan Berger
@ 2023-11-10 16:09 ` Stefan Berger
2023-11-13 5:58 ` Michael Ellerman
2023-11-10 16:09 ` [PATCH v4 07/10] loader/powerpc/ieee1275: Use new allocation function for kernel and initrd Stefan Berger
` (3 subsequent siblings)
9 siblings, 1 reply; 13+ messages in thread
From: Stefan Berger @ 2023-11-10 16:09 UTC (permalink / raw)
To: grub-devel
Cc: dkiper, hbathini, pavrampu, mpe, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Stefan Berger, Daniel Kiper
Introduce flags to identify PowerVM and PowerKVM and set them where
each type of host has been detected.
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/kern/ieee1275/cmain.c | 6 +++++-
include/grub/ieee1275/ieee1275.h | 4 ++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/grub-core/kern/ieee1275/cmain.c b/grub-core/kern/ieee1275/cmain.c
index 400d85d28..cc7c32873 100644
--- a/grub-core/kern/ieee1275/cmain.c
+++ b/grub-core/kern/ieee1275/cmain.c
@@ -126,7 +126,10 @@ grub_ieee1275_find_options (void)
#if defined(__powerpc__)
if (grub_strncmp (tmp, "IBM,", 4) == 0)
- grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY);
+ {
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY);
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_POWER_VM);
+ }
#endif
}
@@ -193,6 +196,7 @@ grub_ieee1275_find_options (void)
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM);
grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_HAS_CURSORONOFF);
+ grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_POWER_KVM);
}
}
diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
index 9f669fbee..5b7a36ad8 100644
--- a/include/grub/ieee1275/ieee1275.h
+++ b/include/grub/ieee1275/ieee1275.h
@@ -140,6 +140,10 @@ enum grub_ieee1275_flag
* only 256MB in size, try asking for more with CAS.
*/
GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY,
+
+ GRUB_IEEE1275_FLAG_POWER_VM,
+
+ GRUB_IEEE1275_FLAG_POWER_KVM,
#endif
};
--
2.25.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v4 06/10] kern/ieee1275/cmain: ppc64: Introduce flags to identify Power VM and KVM
2023-11-10 16:09 ` [PATCH v4 06/10] kern/ieee1275/cmain: ppc64: Introduce flags to identify Power VM and KVM Stefan Berger
@ 2023-11-13 5:58 ` Michael Ellerman
2023-11-13 23:26 ` Stefan Berger
0 siblings, 1 reply; 13+ messages in thread
From: Michael Ellerman @ 2023-11-13 5:58 UTC (permalink / raw)
To: Stefan Berger, grub-devel
Cc: dkiper, hbathini, pavrampu, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Stefan Berger, Daniel Kiper
Stefan Berger <stefanb@linux.ibm.com> writes:
> Introduce flags to identify PowerVM and PowerKVM and set them where
> each type of host has been detected.
Minor nit, "PowerKVM" was the name of a productised version of KVM on
Power, but it was discontinued many years ago.
The thing that exists these days is just "KVM" running on Power.
cheers
> diff --git a/grub-core/kern/ieee1275/cmain.c b/grub-core/kern/ieee1275/cmain.c
> index 400d85d28..cc7c32873 100644
> --- a/grub-core/kern/ieee1275/cmain.c
> +++ b/grub-core/kern/ieee1275/cmain.c
> @@ -126,7 +126,10 @@ grub_ieee1275_find_options (void)
>
> #if defined(__powerpc__)
> if (grub_strncmp (tmp, "IBM,", 4) == 0)
> - grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY);
> + {
> + grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY);
> + grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_POWER_VM);
> + }
> #endif
> }
>
> @@ -193,6 +196,7 @@ grub_ieee1275_find_options (void)
> grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_PRE1_5M_CLAIM);
>
> grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_HAS_CURSORONOFF);
> + grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_POWER_KVM);
> }
> }
>
> diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
> index 9f669fbee..5b7a36ad8 100644
> --- a/include/grub/ieee1275/ieee1275.h
> +++ b/include/grub/ieee1275/ieee1275.h
> @@ -140,6 +140,10 @@ enum grub_ieee1275_flag
> * only 256MB in size, try asking for more with CAS.
> */
> GRUB_IEEE1275_FLAG_CAN_TRY_CAS_FOR_MORE_MEMORY,
> +
> + GRUB_IEEE1275_FLAG_POWER_VM,
> +
> + GRUB_IEEE1275_FLAG_POWER_KVM,
> #endif
> };
>
> --
> 2.25.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH v4 06/10] kern/ieee1275/cmain: ppc64: Introduce flags to identify Power VM and KVM
2023-11-13 5:58 ` Michael Ellerman
@ 2023-11-13 23:26 ` Stefan Berger
0 siblings, 0 replies; 13+ messages in thread
From: Stefan Berger @ 2023-11-13 23:26 UTC (permalink / raw)
To: Michael Ellerman, grub-devel
Cc: dkiper, hbathini, pavrampu, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Daniel Kiper
On 11/13/23 00:58, Michael Ellerman wrote:
> Stefan Berger <stefanb@linux.ibm.com> writes:
>> Introduce flags to identify PowerVM and PowerKVM and set them where
>> each type of host has been detected.
>
> Minor nit, "PowerKVM" was the name of a productised version of KVM on
> Power, but it was discontinued many years ago.
I will replace all occurrences of PowerKVM with KVM on Power in the
patch descriptions.
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v4 07/10] loader/powerpc/ieee1275: Use new allocation function for kernel and initrd
2023-11-10 16:09 [PATCH v4 00/10] ppc64: Restrict memory allocations for kernel and initrd Stefan Berger
` (5 preceding siblings ...)
2023-11-10 16:09 ` [PATCH v4 06/10] kern/ieee1275/cmain: ppc64: Introduce flags to identify Power VM and KVM Stefan Berger
@ 2023-11-10 16:09 ` Stefan Berger
2023-11-10 16:09 ` [PATCH v4 08/10] kern/ieee1275/ieee1275: debug: Display successful memory claims Stefan Berger
` (2 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Stefan Berger @ 2023-11-10 16:09 UTC (permalink / raw)
To: grub-devel
Cc: dkiper, hbathini, pavrampu, mpe, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Stefan Berger, Daniel Kiper
On PowerVM and PowerKVM use the new memory allocation function that honors
restrictions on which memory GRUB can actually use. In the request
structure indicate the request for a single memory block along with
address alignment restrictions. Request direct usage of the memory block
by setting init_region to false (prevent it from being added to GRUB's
heap). Initialize the found addr to '-1', so that '-1' will be returned
to the loader in case no memory could be allocated.
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/loader/powerpc/ieee1275/linux.c | 50 +++++++++++++++++++----
1 file changed, 42 insertions(+), 8 deletions(-)
diff --git a/grub-core/loader/powerpc/ieee1275/linux.c b/grub-core/loader/powerpc/ieee1275/linux.c
index e6d071508..beac7a1e0 100644
--- a/grub-core/loader/powerpc/ieee1275/linux.c
+++ b/grub-core/loader/powerpc/ieee1275/linux.c
@@ -30,6 +30,7 @@
#include <grub/lib/cmdline.h>
#include <grub/cache.h>
#include <grub/linux.h>
+#include <grub/powerpc/ieee1275/alloc.h>
GRUB_MOD_LICENSE ("GPLv3+");
@@ -116,6 +117,22 @@ grub_linux_claimmap_iterate (grub_addr_t target, grub_size_t size,
return ctx.found_addr;
}
+static grub_addr_t
+grub_linux_claimmap_iterate_restricted (grub_size_t size, grub_size_t align)
+{
+ struct regions_claim_request rcr = {
+ .flags = GRUB_MM_ADD_REGION_CONSECUTIVE,
+ .total = size,
+ .init_region = false,
+ .addr = (grub_uint64_t) -1,
+ .align = align,
+ };
+
+ grub_machine_mmap_iterate (grub_regions_claim, &rcr);
+
+ return rcr.addr;
+}
+
static grub_err_t
grub_linux_boot (void)
{
@@ -227,10 +244,18 @@ grub_linux_load64 (grub_elf_t elf, const char *filename)
offset = entry - base_addr;
/* Linux's incorrectly contains a virtual address. */
- /* On some systems, firmware occupies the memory we're trying to use.
- * Happily, Linux can be loaded anywhere (it relocates itself). Iterate
- * until we find an open area. */
- seg_addr = grub_linux_claimmap_iterate (base_addr & ~ELF64_LOADMASK, linux_size, align);
+ if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_POWER_VM) ||
+ grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_POWER_KVM))
+ {
+ seg_addr = grub_linux_claimmap_iterate_restricted (linux_size, align);
+ }
+ else
+ {
+ /* On some systems, firmware occupies the memory we're trying to use.
+ * Happily, Linux can be loaded anywhere (it relocates itself). Iterate
+ * until we find an open area. */
+ seg_addr = grub_linux_claimmap_iterate (base_addr & ~ELF64_LOADMASK, linux_size, align);
+ }
if (seg_addr == (grub_addr_t) -1)
return grub_error (GRUB_ERR_OUT_OF_MEMORY, "couldn't claim memory");
@@ -339,11 +364,20 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
size = grub_get_initrd_size (&initrd_ctx);
- first_addr = linux_addr + linux_size;
- /* Attempt to claim at a series of addresses until successful in
- the same way that grub_rescue_cmd_linux does. */
- addr = grub_linux_claimmap_iterate (first_addr, size, 0x100000);
+ if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_POWER_VM) ||
+ grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_POWER_KVM))
+ {
+ addr = grub_linux_claimmap_iterate_restricted (size, 0x100000);
+ }
+ else
+ {
+ /* Attempt to claim at a series of addresses until successful in
+ the same way that grub_rescue_cmd_linux does. */
+ first_addr = linux_addr + linux_size;
+ addr = grub_linux_claimmap_iterate (first_addr, size, 0x100000);
+ }
+
if (addr == (grub_addr_t) -1)
goto fail;
--
2.25.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v4 08/10] kern/ieee1275/ieee1275: debug: Display successful memory claims
2023-11-10 16:09 [PATCH v4 00/10] ppc64: Restrict memory allocations for kernel and initrd Stefan Berger
` (6 preceding siblings ...)
2023-11-10 16:09 ` [PATCH v4 07/10] loader/powerpc/ieee1275: Use new allocation function for kernel and initrd Stefan Berger
@ 2023-11-10 16:09 ` Stefan Berger
2023-11-10 16:09 ` [PATCH v4 09/10] kern/ieee1275/init: ppc64: Fix a comment Stefan Berger
2023-11-10 16:09 ` [PATCH v4 10/10] kern/ieee1275/init: ppc64: Display upper_mem_limit for debugging Stefan Berger
9 siblings, 0 replies; 13+ messages in thread
From: Stefan Berger @ 2023-11-10 16:09 UTC (permalink / raw)
To: grub-devel
Cc: dkiper, hbathini, pavrampu, mpe, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Stefan Berger, Daniel Kiper, Eric Snowberg
Display successful memory claims with exact address and rounded-down
MiB location and rounded-up size in MiB.
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
Cc: Eric Snowberg <eric.snowberg@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/kern/ieee1275/ieee1275.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/grub-core/kern/ieee1275/ieee1275.c b/grub-core/kern/ieee1275/ieee1275.c
index db870db47..fef3ccf1a 100644
--- a/grub-core/kern/ieee1275/ieee1275.c
+++ b/grub-core/kern/ieee1275/ieee1275.c
@@ -590,6 +590,8 @@ grub_ieee1275_claim (grub_addr_t addr, grub_size_t size, unsigned int align,
*result = args.base;
if (args.base == IEEE1275_CELL_INVALID)
return -1;
+ grub_dprintf ("mmap", "CLAIMED: 0x%x (%d MiB) size: %d MiB\n",
+ args.base, args.base >> 20, ALIGN_UP(size, 1 << 20) >> 20);
return 0;
}
--
2.25.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v4 09/10] kern/ieee1275/init: ppc64: Fix a comment
2023-11-10 16:09 [PATCH v4 00/10] ppc64: Restrict memory allocations for kernel and initrd Stefan Berger
` (7 preceding siblings ...)
2023-11-10 16:09 ` [PATCH v4 08/10] kern/ieee1275/ieee1275: debug: Display successful memory claims Stefan Berger
@ 2023-11-10 16:09 ` Stefan Berger
2023-11-10 16:09 ` [PATCH v4 10/10] kern/ieee1275/init: ppc64: Display upper_mem_limit for debugging Stefan Berger
9 siblings, 0 replies; 13+ messages in thread
From: Stefan Berger @ 2023-11-10 16:09 UTC (permalink / raw)
To: grub-devel
Cc: dkiper, hbathini, pavrampu, mpe, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Stefan Berger
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
---
grub-core/kern/ieee1275/init.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
index 5d9d86c12..164cccb2a 100644
--- a/grub-core/kern/ieee1275/init.c
+++ b/grub-core/kern/ieee1275/init.c
@@ -472,7 +472,7 @@ grub_regions_claim (grub_uint64_t addr, grub_uint64_t len,
/* We must not exceed the upper_mem_limit (assuming it's >= RMO_ADDR_MAX) */
if (addr + len > upper_mem_limit)
{
- /* take the bigger chunk from either below linux_rmo_save or above upper_mem_limit */
+ /* take the bigger chunk from either below linux_rmo_save or above RMO_ADDR_MAX */
len = upper_mem_limit - addr;
if (orig_addr < linux_rmo_save && linux_rmo_save - orig_addr > len)
{
--
2.25.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v4 10/10] kern/ieee1275/init: ppc64: Display upper_mem_limit for debugging
2023-11-10 16:09 [PATCH v4 00/10] ppc64: Restrict memory allocations for kernel and initrd Stefan Berger
` (8 preceding siblings ...)
2023-11-10 16:09 ` [PATCH v4 09/10] kern/ieee1275/init: ppc64: Fix a comment Stefan Berger
@ 2023-11-10 16:09 ` Stefan Berger
9 siblings, 0 replies; 13+ messages in thread
From: Stefan Berger @ 2023-11-10 16:09 UTC (permalink / raw)
To: grub-devel
Cc: dkiper, hbathini, pavrampu, mpe, cpscherr, mahesh, sourabhjain,
avnish.chouhan, Stefan Berger
Display upper_mem_limit and its rounded-down value in MiB.
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
---
grub-core/kern/ieee1275/init.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c
index 164cccb2a..72e0292a3 100644
--- a/grub-core/kern/ieee1275/init.c
+++ b/grub-core/kern/ieee1275/init.c
@@ -454,6 +454,9 @@ grub_regions_claim (grub_uint64_t addr, grub_uint64_t len,
check_kernel_dump (&upper_mem_limit);
+ grub_dprintf ("ieee1275", "upper_mem_limit is at %llx (%lld MiB)\n",
+ upper_mem_limit, upper_mem_limit >> 20);
+
/*
* we order these cases to prefer higher addresses and avoid some
* splitting issues
--
2.25.1
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread