|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] device-tree: Move Arm's static-memory feature to common
commit 3e027c2732162e4c1b685a110f93e277b721edb6
Author: Michal Orzel <michal.orzel@xxxxxxx>
AuthorDate: Tue Jun 3 12:03:28 2025 +0200
Commit: Michal Orzel <michal.orzel@xxxxxxx>
CommitDate: Wed Jun 4 09:02:59 2025 +0200
device-tree: Move Arm's static-memory feature to common
This feature is arch agnostic, thus move it to common.
While at it, move xen/pfn.h inclusion in static-memory.h below #ifdef
CONFIG_STATIC_MEMORY when it is only needed.
Signed-off-by: Michal Orzel <michal.orzel@xxxxxxx>
Acked-by: Julien Grall <jgrall@xxxxxxxxxx>
---
xen/arch/arm/Makefile | 1 -
xen/arch/arm/arm32/mmu/mm.c | 2 +-
xen/arch/arm/arm64/mmu/mm.c | 2 +-
xen/arch/arm/dom0less-build.c | 2 +-
xen/arch/arm/include/asm/static-memory.h | 58 -------
xen/arch/arm/static-memory.c | 281 -------------------------------
xen/arch/arm/static-shmem.c | 2 +-
xen/common/device-tree/Makefile | 1 +
xen/common/device-tree/dom0less-build.c | 6 +-
xen/common/device-tree/static-memory.c | 281 +++++++++++++++++++++++++++++++
xen/include/xen/static-memory.h | 59 +++++++
11 files changed, 346 insertions(+), 349 deletions(-)
diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile
index eeeac4e653..4f08014547 100644
--- a/xen/arch/arm/Makefile
+++ b/xen/arch/arm/Makefile
@@ -51,7 +51,6 @@ obj-y += setup.o
obj-y += shutdown.o
obj-y += smp.o
obj-y += smpboot.o
-obj-$(CONFIG_STATIC_MEMORY) += static-memory.init.o
obj-$(CONFIG_STATIC_SHM) += static-shmem.init.o
obj-y += sysctl.o
obj-y += time.o
diff --git a/xen/arch/arm/arm32/mmu/mm.c b/xen/arch/arm/arm32/mmu/mm.c
index 956693232a..f3305e28e9 100644
--- a/xen/arch/arm/arm32/mmu/mm.c
+++ b/xen/arch/arm/arm32/mmu/mm.c
@@ -6,9 +6,9 @@
#include <xen/mm.h>
#include <xen/param.h>
#include <xen/pfn.h>
+#include <xen/static-memory.h>
#include <asm/fixmap.h>
#include <asm/setup.h>
-#include <asm/static-memory.h>
#include <asm/static-shmem.h>
static unsigned long opt_xenheap_megabytes __initdata;
diff --git a/xen/arch/arm/arm64/mmu/mm.c b/xen/arch/arm/arm64/mmu/mm.c
index c1efa1348a..cded8f2787 100644
--- a/xen/arch/arm/arm64/mmu/mm.c
+++ b/xen/arch/arm/arm64/mmu/mm.c
@@ -4,9 +4,9 @@
#include <xen/llc-coloring.h>
#include <xen/mm.h>
#include <xen/pfn.h>
+#include <xen/static-memory.h>
#include <asm/setup.h>
-#include <asm/static-memory.h>
#include <asm/static-shmem.h>
/* Override macros from asm/page.h to make them work with mfn_t */
diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c
index a49764f0ad..bcfd686a8b 100644
--- a/xen/arch/arm/dom0less-build.c
+++ b/xen/arch/arm/dom0less-build.c
@@ -12,6 +12,7 @@
#include <xen/sched.h>
#include <xen/serial.h>
#include <xen/sizes.h>
+#include <xen/static-memory.h>
#include <xen/vmap.h>
#include <public/bootfdt.h>
@@ -22,7 +23,6 @@
#include <asm/domain_build.h>
#include <asm/grant_table.h>
#include <asm/setup.h>
-#include <asm/static-memory.h>
#include <asm/static-shmem.h>
#ifdef CONFIG_VGICV2
diff --git a/xen/arch/arm/include/asm/static-memory.h
b/xen/arch/arm/include/asm/static-memory.h
deleted file mode 100644
index a32a3c6553..0000000000
--- a/xen/arch/arm/include/asm/static-memory.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-
-#ifndef __ASM_STATIC_MEMORY_H_
-#define __ASM_STATIC_MEMORY_H_
-
-#include <xen/fdt-kernel.h>
-#include <xen/pfn.h>
-
-#ifdef CONFIG_STATIC_MEMORY
-
-static inline void init_staticmem_bank(const struct membank *bank)
-{
- mfn_t bank_start = _mfn(PFN_UP(bank->start));
- unsigned long bank_pages = PFN_DOWN(bank->size);
- mfn_t bank_end = mfn_add(bank_start, bank_pages);
-
- if ( mfn_x(bank_end) <= mfn_x(bank_start) )
- return;
-
- unprepare_staticmem_pages(mfn_to_page(bank_start), bank_pages, false);
-}
-
-void allocate_static_memory(struct domain *d, struct kernel_info *kinfo,
- const struct dt_device_node *node);
-void assign_static_memory_11(struct domain *d, struct kernel_info *kinfo,
- const struct dt_device_node *node);
-void init_staticmem_pages(void);
-
-#else /* !CONFIG_STATIC_MEMORY */
-
-static inline void allocate_static_memory(struct domain *d,
- struct kernel_info *kinfo,
- const struct dt_device_node *node)
-{
- ASSERT_UNREACHABLE();
-}
-
-static inline void assign_static_memory_11(struct domain *d,
- struct kernel_info *kinfo,
- const struct dt_device_node *node)
-{
- ASSERT_UNREACHABLE();
-}
-
-static inline void init_staticmem_pages(void) {};
-
-#endif /* CONFIG_STATIC_MEMORY */
-
-#endif /* __ASM_STATIC_MEMORY_H_ */
-
-/*
- * Local variables:
- * mode: C
- * c-file-style: "BSD"
- * c-basic-offset: 4
- * indent-tabs-mode: nil
- * End:
- */
diff --git a/xen/arch/arm/static-memory.c b/xen/arch/arm/static-memory.c
deleted file mode 100644
index e0f76afcd8..0000000000
--- a/xen/arch/arm/static-memory.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-
-#include <xen/sched.h>
-
-#include <asm/setup.h>
-#include <asm/static-memory.h>
-
-static bool __init append_static_memory_to_bank(struct domain *d,
- struct membank *bank,
- mfn_t smfn,
- paddr_t size)
-{
- int res;
- unsigned int nr_pages = PFN_DOWN(size);
- gfn_t sgfn;
-
- /*
- * For direct-mapped domain, the GFN match the MFN.
- * Otherwise, this is inferred on what has already been allocated
- * in the bank.
- */
- if ( !is_domain_direct_mapped(d) )
- sgfn = gaddr_to_gfn(bank->start + bank->size);
- else
- sgfn = gaddr_to_gfn(mfn_to_maddr(smfn));
-
- res = guest_physmap_add_pages(d, sgfn, smfn, nr_pages);
- if ( res )
- {
- dprintk(XENLOG_ERR, "Failed to map pages to DOMU: %d", res);
- return false;
- }
-
- bank->size = bank->size + size;
-
- return true;
-}
-
-static mfn_t __init acquire_static_memory_bank(struct domain *d,
- const __be32 **cell,
- u32 addr_cells, u32 size_cells,
- paddr_t *pbase, paddr_t *psize)
-{
- mfn_t smfn;
- int res;
-
- device_tree_get_reg(cell, addr_cells, size_cells, pbase, psize);
- ASSERT(IS_ALIGNED(*pbase, PAGE_SIZE) && IS_ALIGNED(*psize, PAGE_SIZE));
- if ( PFN_DOWN(*psize) > UINT_MAX )
- {
- printk(XENLOG_ERR "%pd: static memory size too large: %#"PRIpaddr,
- d, *psize);
- return INVALID_MFN;
- }
-
- smfn = maddr_to_mfn(*pbase);
- res = acquire_domstatic_pages(d, smfn, PFN_DOWN(*psize), 0);
- if ( res )
- {
- printk(XENLOG_ERR
- "%pd: failed to acquire static memory: %d.\n", d, res);
- return INVALID_MFN;
- }
-
- return smfn;
-}
-
-static int __init parse_static_mem_prop(const struct dt_device_node *node,
- u32 *addr_cells, u32 *size_cells,
- int *length, const __be32 **cell)
-{
- const struct dt_property *prop;
-
- prop = dt_find_property(node, "xen,static-mem", NULL);
-
- *addr_cells = dt_n_addr_cells(node);
- *size_cells = dt_n_size_cells(node);
-
- *cell = (const __be32 *)prop->value;
- *length = prop->length;
-
- return 0;
-}
-
-/* Allocate memory from static memory as RAM for one specific domain d. */
-void __init allocate_static_memory(struct domain *d, struct kernel_info *kinfo,
- const struct dt_device_node *node)
-{
- struct membanks *mem = kernel_info_get_mem(kinfo);
- u32 addr_cells, size_cells, reg_cells;
- unsigned int nr_banks, gbank, bank = 0;
- const uint64_t rambase[] = GUEST_RAM_BANK_BASES;
- const uint64_t ramsize[] = GUEST_RAM_BANK_SIZES;
- const __be32 *cell;
- u64 tot_size = 0;
- paddr_t pbase, psize, gsize;
- mfn_t smfn;
- int length;
-
- if ( parse_static_mem_prop(node, &addr_cells, &size_cells, &length, &cell)
)
- goto fail;
- reg_cells = addr_cells + size_cells;
-
- /*
- * The static memory will be mapped in the guest at the usual guest memory
- * addresses (GUEST_RAM0_BASE, GUEST_RAM1_BASE) defined by
- * xen/include/public/arch-arm.h.
- */
- gbank = 0;
- gsize = ramsize[gbank];
- mem->bank[gbank].start = rambase[gbank];
- nr_banks = length / (reg_cells * sizeof (u32));
-
- for ( ; bank < nr_banks; bank++ )
- {
- smfn = acquire_static_memory_bank(d, &cell, addr_cells, size_cells,
- &pbase, &psize);
- if ( mfn_eq(smfn, INVALID_MFN) )
- goto fail;
-
- printk(XENLOG_INFO "%pd: STATIC BANK[%u] %#"PRIpaddr"-%#"PRIpaddr"\n",
- d, bank, pbase, pbase + psize);
-
- while ( 1 )
- {
- /* Map as much as possible the static range to the guest bank */
- if ( !append_static_memory_to_bank(d, &mem->bank[gbank], smfn,
- min(psize, gsize)) )
- goto fail;
-
- /*
- * The current physical bank is fully mapped.
- * Handle the next physical bank.
- */
- if ( gsize >= psize )
- {
- gsize = gsize - psize;
- break;
- }
- /*
- * When current guest bank is not enough to map, exhaust
- * the current one and seek to the next.
- * Before seeking to the next, check if we still have available
- * guest bank.
- */
- else if ( (gbank + 1) >= GUEST_RAM_BANKS )
- {
- printk(XENLOG_ERR "Exhausted all possible guest banks.\n");
- goto fail;
- }
- else
- {
- psize = psize - gsize;
- smfn = mfn_add(smfn, gsize >> PAGE_SHIFT);
- /* Update to the next guest bank. */
- gbank++;
- gsize = ramsize[gbank];
- mem->bank[gbank].start = rambase[gbank];
- }
- }
-
- tot_size += psize;
- }
-
- mem->nr_banks = ++gbank;
-
- kinfo->unassigned_mem -= tot_size;
- /*
- * The property 'memory' should match the amount of memory given to the
- * guest.
- * Currently, it is only possible to either acquire static memory or let
- * Xen allocate. *Mixing* is not supported.
- */
- if ( kinfo->unassigned_mem )
- {
- printk(XENLOG_ERR
- "Size of \"memory\" property doesn't match up with the sum-up
of \"xen,static-mem\". Unsupported configuration.\n");
- goto fail;
- }
-
- return;
-
- fail:
- panic("Failed to allocate requested static memory for domain %pd.\n", d);
-}
-
-/*
- * Allocate static memory as RAM for one specific domain d.
- * The static memory will be directly mapped in the guest(Guest Physical
- * Address == Physical Address).
- */
-void __init assign_static_memory_11(struct domain *d, struct kernel_info
*kinfo,
- const struct dt_device_node *node)
-{
- struct membanks *mem = kernel_info_get_mem(kinfo);
- u32 addr_cells, size_cells, reg_cells;
- unsigned int nr_banks, bank = 0;
- const __be32 *cell;
- paddr_t pbase, psize;
- mfn_t smfn;
- int length;
-
- if ( parse_static_mem_prop(node, &addr_cells, &size_cells, &length, &cell)
)
- {
- printk(XENLOG_ERR
- "%pd: failed to parse \"xen,static-mem\" property.\n", d);
- goto fail;
- }
- reg_cells = addr_cells + size_cells;
- nr_banks = length / (reg_cells * sizeof(u32));
-
- if ( nr_banks > mem->max_banks )
- {
- printk(XENLOG_ERR
- "%pd: exceed max number of supported guest memory banks.\n", d);
- goto fail;
- }
-
- for ( ; bank < nr_banks; bank++ )
- {
- smfn = acquire_static_memory_bank(d, &cell, addr_cells, size_cells,
- &pbase, &psize);
- if ( mfn_eq(smfn, INVALID_MFN) )
- goto fail;
-
- printk(XENLOG_INFO "%pd: STATIC BANK[%u] %#"PRIpaddr"-%#"PRIpaddr"\n",
- d, bank, pbase, pbase + psize);
-
- /* One guest memory bank is matched with one physical memory bank. */
- mem->bank[bank].start = pbase;
- if ( !append_static_memory_to_bank(d, &mem->bank[bank],
- smfn, psize) )
- goto fail;
-
- kinfo->unassigned_mem -= psize;
- }
-
- mem->nr_banks = nr_banks;
-
- /*
- * The property 'memory' should match the amount of memory given to
- * the guest.
- * Currently, it is only possible to either acquire static memory or
- * let Xen allocate. *Mixing* is not supported.
- */
- if ( kinfo->unassigned_mem != 0 )
- {
- printk(XENLOG_ERR
- "Size of \"memory\" property doesn't match up with the sum-up
of \"xen,static-mem\".\n");
- goto fail;
- }
-
- return;
-
- fail:
- panic("Failed to assign requested static memory for direct-map domain
%pd.\n",
- d);
-}
-
-/* Static memory initialization */
-void __init init_staticmem_pages(void)
-{
- const struct membanks *reserved_mem = bootinfo_get_reserved_mem();
- unsigned int bank;
-
- for ( bank = 0 ; bank < reserved_mem->nr_banks; bank++ )
- {
- if ( reserved_mem->bank[bank].type == MEMBANK_STATIC_DOMAIN )
- init_staticmem_bank(&reserved_mem->bank[bank]);
- }
-}
-
-/*
- * Local variables:
- * mode: C
- * c-file-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c
index 21fd2c3cd4..2055b7be0f 100644
--- a/xen/arch/arm/static-shmem.c
+++ b/xen/arch/arm/static-shmem.c
@@ -5,9 +5,9 @@
#include <xen/libfdt/libfdt.h>
#include <xen/rangeset.h>
#include <xen/sched.h>
+#include <xen/static-memory.h>
#include <asm/setup.h>
-#include <asm/static-memory.h>
#include <asm/static-shmem.h>
typedef struct {
diff --git a/xen/common/device-tree/Makefile b/xen/common/device-tree/Makefile
index 57b9e6ca00..ed11f2c3b4 100644
--- a/xen/common/device-tree/Makefile
+++ b/xen/common/device-tree/Makefile
@@ -7,3 +7,4 @@ obj-$(CONFIG_OVERLAY_DTB) += dt-overlay.o
obj-y += intc.o
obj-$(CONFIG_DOMAIN_BUILD_HELPERS) += kernel.o
obj-$(CONFIG_STATIC_EVTCHN) += static-evtchn.init.o
+obj-$(CONFIG_STATIC_MEMORY) += static-memory.init.o
diff --git a/xen/common/device-tree/dom0less-build.c
b/xen/common/device-tree/dom0less-build.c
index 39cb2cd5c7..c8c5a04f24 100644
--- a/xen/common/device-tree/dom0less-build.c
+++ b/xen/common/device-tree/dom0less-build.c
@@ -28,9 +28,7 @@
#include <asm/dom0less-build.h>
#include <asm/setup.h>
-#if __has_include(<asm/static-memory.h>)
-# include <asm/static-memory.h>
-#endif
+#include <xen/static-memory.h>
#if __has_include(<asm/static-shmem.h>)
# include <asm/static-shmem.h>
@@ -799,12 +797,10 @@ static int __init construct_domU(struct domain *d,
{
if ( !dt_find_property(node, "xen,static-mem", NULL) )
allocate_memory(d, &kinfo);
-#ifdef CONFIG_STATIC_MEMORY
else if ( !is_domain_direct_mapped(d) )
allocate_static_memory(d, &kinfo, node);
else
assign_static_memory_11(d, &kinfo, node);
-#endif
#ifdef CONFIG_STATIC_SHM
rc = process_shm(d, &kinfo, node);
diff --git a/xen/common/device-tree/static-memory.c
b/xen/common/device-tree/static-memory.c
new file mode 100644
index 0000000000..0774d06806
--- /dev/null
+++ b/xen/common/device-tree/static-memory.c
@@ -0,0 +1,281 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <xen/sched.h>
+#include <xen/static-memory.h>
+
+#include <asm/setup.h>
+
+static bool __init append_static_memory_to_bank(struct domain *d,
+ struct membank *bank,
+ mfn_t smfn,
+ paddr_t size)
+{
+ int res;
+ unsigned int nr_pages = PFN_DOWN(size);
+ gfn_t sgfn;
+
+ /*
+ * For direct-mapped domain, the GFN match the MFN.
+ * Otherwise, this is inferred on what has already been allocated
+ * in the bank.
+ */
+ if ( !is_domain_direct_mapped(d) )
+ sgfn = gaddr_to_gfn(bank->start + bank->size);
+ else
+ sgfn = gaddr_to_gfn(mfn_to_maddr(smfn));
+
+ res = guest_physmap_add_pages(d, sgfn, smfn, nr_pages);
+ if ( res )
+ {
+ dprintk(XENLOG_ERR, "Failed to map pages to DOMU: %d", res);
+ return false;
+ }
+
+ bank->size = bank->size + size;
+
+ return true;
+}
+
+static mfn_t __init acquire_static_memory_bank(struct domain *d,
+ const __be32 **cell,
+ u32 addr_cells, u32 size_cells,
+ paddr_t *pbase, paddr_t *psize)
+{
+ mfn_t smfn;
+ int res;
+
+ device_tree_get_reg(cell, addr_cells, size_cells, pbase, psize);
+ ASSERT(IS_ALIGNED(*pbase, PAGE_SIZE) && IS_ALIGNED(*psize, PAGE_SIZE));
+ if ( PFN_DOWN(*psize) > UINT_MAX )
+ {
+ printk(XENLOG_ERR "%pd: static memory size too large: %#"PRIpaddr,
+ d, *psize);
+ return INVALID_MFN;
+ }
+
+ smfn = maddr_to_mfn(*pbase);
+ res = acquire_domstatic_pages(d, smfn, PFN_DOWN(*psize), 0);
+ if ( res )
+ {
+ printk(XENLOG_ERR
+ "%pd: failed to acquire static memory: %d.\n", d, res);
+ return INVALID_MFN;
+ }
+
+ return smfn;
+}
+
+static int __init parse_static_mem_prop(const struct dt_device_node *node,
+ u32 *addr_cells, u32 *size_cells,
+ int *length, const __be32 **cell)
+{
+ const struct dt_property *prop;
+
+ prop = dt_find_property(node, "xen,static-mem", NULL);
+
+ *addr_cells = dt_n_addr_cells(node);
+ *size_cells = dt_n_size_cells(node);
+
+ *cell = (const __be32 *)prop->value;
+ *length = prop->length;
+
+ return 0;
+}
+
+/* Allocate memory from static memory as RAM for one specific domain d. */
+void __init allocate_static_memory(struct domain *d, struct kernel_info *kinfo,
+ const struct dt_device_node *node)
+{
+ struct membanks *mem = kernel_info_get_mem(kinfo);
+ u32 addr_cells, size_cells, reg_cells;
+ unsigned int nr_banks, gbank, bank = 0;
+ const uint64_t rambase[] = GUEST_RAM_BANK_BASES;
+ const uint64_t ramsize[] = GUEST_RAM_BANK_SIZES;
+ const __be32 *cell;
+ u64 tot_size = 0;
+ paddr_t pbase, psize, gsize;
+ mfn_t smfn;
+ int length;
+
+ if ( parse_static_mem_prop(node, &addr_cells, &size_cells, &length, &cell)
)
+ goto fail;
+ reg_cells = addr_cells + size_cells;
+
+ /*
+ * The static memory will be mapped in the guest at the usual guest memory
+ * addresses (GUEST_RAM0_BASE, GUEST_RAM1_BASE) defined by
+ * xen/include/public/arch-arm.h.
+ */
+ gbank = 0;
+ gsize = ramsize[gbank];
+ mem->bank[gbank].start = rambase[gbank];
+ nr_banks = length / (reg_cells * sizeof (u32));
+
+ for ( ; bank < nr_banks; bank++ )
+ {
+ smfn = acquire_static_memory_bank(d, &cell, addr_cells, size_cells,
+ &pbase, &psize);
+ if ( mfn_eq(smfn, INVALID_MFN) )
+ goto fail;
+
+ printk(XENLOG_INFO "%pd: STATIC BANK[%u] %#"PRIpaddr"-%#"PRIpaddr"\n",
+ d, bank, pbase, pbase + psize);
+
+ while ( 1 )
+ {
+ /* Map as much as possible the static range to the guest bank */
+ if ( !append_static_memory_to_bank(d, &mem->bank[gbank], smfn,
+ min(psize, gsize)) )
+ goto fail;
+
+ /*
+ * The current physical bank is fully mapped.
+ * Handle the next physical bank.
+ */
+ if ( gsize >= psize )
+ {
+ gsize = gsize - psize;
+ break;
+ }
+ /*
+ * When current guest bank is not enough to map, exhaust
+ * the current one and seek to the next.
+ * Before seeking to the next, check if we still have available
+ * guest bank.
+ */
+ else if ( (gbank + 1) >= GUEST_RAM_BANKS )
+ {
+ printk(XENLOG_ERR "Exhausted all possible guest banks.\n");
+ goto fail;
+ }
+ else
+ {
+ psize = psize - gsize;
+ smfn = mfn_add(smfn, gsize >> PAGE_SHIFT);
+ /* Update to the next guest bank. */
+ gbank++;
+ gsize = ramsize[gbank];
+ mem->bank[gbank].start = rambase[gbank];
+ }
+ }
+
+ tot_size += psize;
+ }
+
+ mem->nr_banks = ++gbank;
+
+ kinfo->unassigned_mem -= tot_size;
+ /*
+ * The property 'memory' should match the amount of memory given to the
+ * guest.
+ * Currently, it is only possible to either acquire static memory or let
+ * Xen allocate. *Mixing* is not supported.
+ */
+ if ( kinfo->unassigned_mem )
+ {
+ printk(XENLOG_ERR
+ "Size of \"memory\" property doesn't match up with the sum-up
of \"xen,static-mem\". Unsupported configuration.\n");
+ goto fail;
+ }
+
+ return;
+
+ fail:
+ panic("Failed to allocate requested static memory for domain %pd.\n", d);
+}
+
+/*
+ * Allocate static memory as RAM for one specific domain d.
+ * The static memory will be directly mapped in the guest(Guest Physical
+ * Address == Physical Address).
+ */
+void __init assign_static_memory_11(struct domain *d, struct kernel_info
*kinfo,
+ const struct dt_device_node *node)
+{
+ struct membanks *mem = kernel_info_get_mem(kinfo);
+ u32 addr_cells, size_cells, reg_cells;
+ unsigned int nr_banks, bank = 0;
+ const __be32 *cell;
+ paddr_t pbase, psize;
+ mfn_t smfn;
+ int length;
+
+ if ( parse_static_mem_prop(node, &addr_cells, &size_cells, &length, &cell)
)
+ {
+ printk(XENLOG_ERR
+ "%pd: failed to parse \"xen,static-mem\" property.\n", d);
+ goto fail;
+ }
+ reg_cells = addr_cells + size_cells;
+ nr_banks = length / (reg_cells * sizeof(u32));
+
+ if ( nr_banks > mem->max_banks )
+ {
+ printk(XENLOG_ERR
+ "%pd: exceed max number of supported guest memory banks.\n", d);
+ goto fail;
+ }
+
+ for ( ; bank < nr_banks; bank++ )
+ {
+ smfn = acquire_static_memory_bank(d, &cell, addr_cells, size_cells,
+ &pbase, &psize);
+ if ( mfn_eq(smfn, INVALID_MFN) )
+ goto fail;
+
+ printk(XENLOG_INFO "%pd: STATIC BANK[%u] %#"PRIpaddr"-%#"PRIpaddr"\n",
+ d, bank, pbase, pbase + psize);
+
+ /* One guest memory bank is matched with one physical memory bank. */
+ mem->bank[bank].start = pbase;
+ if ( !append_static_memory_to_bank(d, &mem->bank[bank],
+ smfn, psize) )
+ goto fail;
+
+ kinfo->unassigned_mem -= psize;
+ }
+
+ mem->nr_banks = nr_banks;
+
+ /*
+ * The property 'memory' should match the amount of memory given to
+ * the guest.
+ * Currently, it is only possible to either acquire static memory or
+ * let Xen allocate. *Mixing* is not supported.
+ */
+ if ( kinfo->unassigned_mem != 0 )
+ {
+ printk(XENLOG_ERR
+ "Size of \"memory\" property doesn't match up with the sum-up
of \"xen,static-mem\".\n");
+ goto fail;
+ }
+
+ return;
+
+ fail:
+ panic("Failed to assign requested static memory for direct-map domain
%pd.\n",
+ d);
+}
+
+/* Static memory initialization */
+void __init init_staticmem_pages(void)
+{
+ const struct membanks *reserved_mem = bootinfo_get_reserved_mem();
+ unsigned int bank;
+
+ for ( bank = 0 ; bank < reserved_mem->nr_banks; bank++ )
+ {
+ if ( reserved_mem->bank[bank].type == MEMBANK_STATIC_DOMAIN )
+ init_staticmem_bank(&reserved_mem->bank[bank]);
+ }
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/xen/static-memory.h b/xen/include/xen/static-memory.h
new file mode 100644
index 0000000000..e445aa8057
--- /dev/null
+++ b/xen/include/xen/static-memory.h
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef XEN_STATIC_MEMORY_H
+#define XEN_STATIC_MEMORY_H
+
+#include <xen/fdt-kernel.h>
+
+#ifdef CONFIG_STATIC_MEMORY
+
+#include <xen/pfn.h>
+
+static inline void init_staticmem_bank(const struct membank *bank)
+{
+ mfn_t bank_start = _mfn(PFN_UP(bank->start));
+ unsigned long bank_pages = PFN_DOWN(bank->size);
+ mfn_t bank_end = mfn_add(bank_start, bank_pages);
+
+ if ( mfn_x(bank_end) <= mfn_x(bank_start) )
+ return;
+
+ unprepare_staticmem_pages(mfn_to_page(bank_start), bank_pages, false);
+}
+
+void allocate_static_memory(struct domain *d, struct kernel_info *kinfo,
+ const struct dt_device_node *node);
+void assign_static_memory_11(struct domain *d, struct kernel_info *kinfo,
+ const struct dt_device_node *node);
+void init_staticmem_pages(void);
+
+#else /* !CONFIG_STATIC_MEMORY */
+
+static inline void allocate_static_memory(struct domain *d,
+ struct kernel_info *kinfo,
+ const struct dt_device_node *node)
+{
+ ASSERT_UNREACHABLE();
+}
+
+static inline void assign_static_memory_11(struct domain *d,
+ struct kernel_info *kinfo,
+ const struct dt_device_node *node)
+{
+ ASSERT_UNREACHABLE();
+}
+
+static inline void init_staticmem_pages(void) {};
+
+#endif /* CONFIG_STATIC_MEMORY */
+
+#endif /* XEN_STATIC_MEMORY_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |