From: Stefan Berger <stefanb@linux.ibm.com>
To: grub-devel@gnu.org
Cc: dkiper@net-space.pl, hbathini@linux.ibm.com, pavrampu@in.ibm.com,
mpe@ellerman.id.au, cpscherr@us.ibm.com, mahesh@linux.ibm.com,
sourabhjain@linux.ibm.com, avnish.chouhan@ibm.com,
Stefan Berger <stefanb@linux.ibm.com>,
Daniel Kiper <daniel.kiper@oracle.com>
Subject: [PATCH v4 07/10] loader/powerpc/ieee1275: Use new allocation function for kernel and initrd
Date: Fri, 10 Nov 2023 11:09:50 -0500 [thread overview]
Message-ID: <20231110160953.3918186-8-stefanb@linux.ibm.com> (raw)
In-Reply-To: <20231110160953.3918186-1-stefanb@linux.ibm.com>
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
next prev parent reply other threads:[~2023-11-10 16:12 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
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 ` [PATCH v4 03/10] kern/ieee1275/init: ppc64: Return allocated address using context Stefan Berger
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 ` [PATCH v4 05/10] kern/ieee1275/init: ppc64: Rename regions_claim to grub_regions_claim 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
2023-11-13 5:58 ` Michael Ellerman
2023-11-13 23:26 ` Stefan Berger
2023-11-10 16:09 ` Stefan Berger [this message]
2023-11-10 16:09 ` [PATCH v4 08/10] kern/ieee1275/ieee1275: debug: Display successful memory claims 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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231110160953.3918186-8-stefanb@linux.ibm.com \
--to=stefanb@linux.ibm.com \
--cc=avnish.chouhan@ibm.com \
--cc=cpscherr@us.ibm.com \
--cc=daniel.kiper@oracle.com \
--cc=dkiper@net-space.pl \
--cc=grub-devel@gnu.org \
--cc=hbathini@linux.ibm.com \
--cc=mahesh@linux.ibm.com \
--cc=mpe@ellerman.id.au \
--cc=pavrampu@in.ibm.com \
--cc=sourabhjain@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.