|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC 21/29] xen/arm: WORKAROUND 1:1 memory mapping for dom0
Currently xen doesn't implement SYS MMU. When a device will talk with dom0
with DMA request the domain will use GFN instead of MFN.
For instance on the arndale board, without this patch the network doesn't
work.
The 1:1 mapping is a workaround and MUST be remove as soon as a SYS MMU is
implemented in XEN.
Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
---
xen/arch/arm/domain_build.c | 51 ++++++++++++++++++++++++-------------------
xen/arch/arm/kernel.h | 1 -
2 files changed, 28 insertions(+), 24 deletions(-)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index ced73a7..11298e1 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -66,29 +66,36 @@ static int set_memory_reg(struct domain *d, struct
kernel_info *kinfo,
int address_cells, int size_cells, u32 *new_cell)
{
int reg_size = (address_cells + size_cells) * sizeof(*cell);
- int l = 0;
- u64 start;
- u64 size;
+ paddr_t start;
+ paddr_t size;
+ struct page_info *pg;
+ unsigned int order = get_order_from_bytes(dom0_mem);
+ int res;
+ paddr_t spfn;
- while ( kinfo->unassigned_mem > 0 && l + reg_size <= len
- && kinfo->mem.nr_banks < NR_MEM_BANKS )
- {
- device_tree_get_reg(&cell, address_cells, size_cells, &start, &size);
- if ( size > kinfo->unassigned_mem )
- size = kinfo->unassigned_mem;
- device_tree_set_reg(&new_cell, address_cells, size_cells, start, size);
-
- printk("Populate P2M %#"PRIx64"->%#"PRIx64"\n", start, start + size);
- p2m_populate_ram(d, start, start + size);
- kinfo->mem.bank[kinfo->mem.nr_banks].start = start;
- kinfo->mem.bank[kinfo->mem.nr_banks].size = size;
- kinfo->mem.nr_banks++;
- kinfo->unassigned_mem -= size;
-
- l += reg_size;
- }
+ pg = alloc_domheap_pages(d, order, 0);
+ if ( !pg )
+ panic("Failed to allocate contiguous memory for dom0\n");
+
+ spfn = page_to_mfn(pg);
+ start = spfn << PAGE_SHIFT;
+ size = (1 << order) << PAGE_SHIFT;
+
+ // 1:1 mapping
+ printk("Populate P2M %#"PRIx64"->%#"PRIx64" (1:1 mapping for dom0)\n",
+ start, start + size);
+ res = guest_physmap_add_page(d, spfn, spfn, order);
- return l;
+ if ( res )
+ panic("Unable to add pages in DOM0: %d\n", res);
+
+ device_tree_set_reg(&new_cell, address_cells, size_cells, start, size);
+
+ kinfo->mem.bank[0].start = start;
+ kinfo->mem.bank[0].size = size;
+ kinfo->mem.nr_banks = 1;
+
+ return reg_size;
}
static int write_properties(struct domain *d, struct kernel_info *kinfo,
@@ -434,8 +441,6 @@ static int prepare_dtb(struct domain *d, struct kernel_info
*kinfo)
int new_size;
int ret;
- kinfo->unassigned_mem = dom0_mem;
-
fdt = device_tree_flattened;
new_size = fdt_totalsize(fdt) + DOM0_FDT_EXTRA_SIZE;
diff --git a/xen/arch/arm/kernel.h b/xen/arch/arm/kernel.h
index 1776a4d..687f6c4 100644
--- a/xen/arch/arm/kernel.h
+++ b/xen/arch/arm/kernel.h
@@ -15,7 +15,6 @@ struct kernel_info {
#endif
void *fdt; /* flat device tree */
- paddr_t unassigned_mem; /* RAM not (yet) assigned to a bank */
struct dt_mem_info mem;
paddr_t dtb_paddr;
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |