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
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
#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__
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)
}
}
}
- 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)
{
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;
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
--- /dev/null
+/* 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 */