[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH ARM v4 12/12] mini-os: added ARM grant table initialisation
On x86, we get told which pages to use, but on ARM we get the base address in the FDT and have to map each page. Signed-off-by: Thomas Leonard <talex5@xxxxxxxxx> --- extras/mini-os/ARM-TODO.txt | 1 - extras/mini-os/arch/arm/mm.c | 58 +++++++++++++++++++++++++++++++++++++++++ extras/mini-os/arch/x86/mm.c | 13 +++++++++ extras/mini-os/gnttab.c | 11 ++------ extras/mini-os/include/gnttab.h | 1 + 5 files changed, 74 insertions(+), 10 deletions(-) diff --git a/extras/mini-os/ARM-TODO.txt b/extras/mini-os/ARM-TODO.txt index 8f4f1da..e30760a 100644 --- a/extras/mini-os/ARM-TODO.txt +++ b/extras/mini-os/ARM-TODO.txt @@ -1,6 +1,5 @@ * scheduling! * gic request_irq implementation, currently all IRQs all hardcoded in gic irq handler. -* use device tree instead of the currently hardcoded values * Add virtual memory support and make vstart = 0 ( use 4k descriptors instead of 1M descriptors ) * sched * fini_gnttab diff --git a/extras/mini-os/arch/arm/mm.c b/extras/mini-os/arch/arm/mm.c index be8e747..050e845 100644 --- a/extras/mini-os/arch/arm/mm.c +++ b/extras/mini-os/arch/arm/mm.c @@ -1,5 +1,7 @@ #include <console.h> +#include <xen/memory.h> #include <arch_mm.h> +#include <mini-os/hypervisor.h> #include <libfdt.h> #include <lib.h> @@ -102,3 +104,59 @@ void arch_init_p2m(unsigned long max_pfn) void arch_init_demand_mapping_area(unsigned long cur_pfn) { } + +/* Get Xen's sugggested physical page assignments for the grant table. */ +static grant_entry_t *get_gnttab_base(void) +{ + int hypervisor; + + hypervisor = fdt_path_offset(device_tree, "/hypervisor"); + BUG_ON(hypervisor < 0); + + int len = 0; + const uint64_t *regs = fdt_getprop(device_tree, hypervisor, "reg", &len); + if (regs == NULL || len != 16) { + printk("Bad 'reg' property: %p %d\n", regs, len); + BUG(); + } + + unsigned int gnttab_base = fdt64_to_cpu(regs[0]); + + printk("FDT suggests grant table base %lx\n", gnttab_base); + + return (grant_entry_t *) gnttab_base; +} + +grant_entry_t *arch_init_gnttab(int nr_grant_frames) +{ + struct xen_add_to_physmap xatp; + struct gnttab_setup_table setup; + xen_pfn_t frames[nr_grant_frames]; + grant_entry_t *gnttab_table; + int i, rc; + + gnttab_table = get_gnttab_base(); + + for (i = 0; i < nr_grant_frames; i++) + { + xatp.domid = DOMID_SELF; + xatp.size = 0; /* Seems to be unused */ + xatp.space = XENMAPSPACE_grant_table; + xatp.idx = i; + xatp.gpfn = (((unsigned long) gnttab_table) >> PAGE_SHIFT) + i; + rc = HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp); + BUG_ON(rc != 0); + } + + setup.dom = DOMID_SELF; + setup.nr_frames = nr_grant_frames; + set_xen_guest_handle(setup.frame_list, frames); + HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1); + if (setup.status != 0) + { + printk("GNTTABOP_setup_table failed; status = %d\n", setup.status); + BUG(); + } + + return gnttab_table; +} diff --git a/extras/mini-os/arch/x86/mm.c b/extras/mini-os/arch/x86/mm.c index 35df15b..9c6d1b8 100644 --- a/extras/mini-os/arch/x86/mm.c +++ b/extras/mini-os/arch/x86/mm.c @@ -942,3 +942,16 @@ void arch_init_mm(unsigned long* start_pfn_p, unsigned long* max_pfn_p) *start_pfn_p = start_pfn; *max_pfn_p = max_pfn; } + +grant_entry_t *arch_init_gnttab(int nr_grant_frames) +{ + struct gnttab_setup_table setup; + unsigned long frames[nr_grant_frames]; + + setup.dom = DOMID_SELF; + setup.nr_frames = nr_grant_frames; + set_xen_guest_handle(setup.frame_list, frames); + + HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1); + return map_frames(frames, nr_grant_frames); +} diff --git a/extras/mini-os/gnttab.c b/extras/mini-os/gnttab.c index 2f1b3d7..f395d12 100644 --- a/extras/mini-os/gnttab.c +++ b/extras/mini-os/gnttab.c @@ -164,7 +164,7 @@ gnttabop_error(int16_t status) { status = -status; if (status < 0 || status >= ARRAY_SIZE(gnttabop_error_msgs)) - return "bad status"; + return "bad status"; else return gnttabop_error_msgs[status]; } @@ -172,8 +172,6 @@ gnttabop_error(int16_t status) void init_gnttab(void) { - struct gnttab_setup_table setup; - unsigned long frames[NR_GRANT_FRAMES]; int i; #ifdef GNT_DEBUG @@ -182,12 +180,7 @@ init_gnttab(void) for (i = NR_RESERVED_ENTRIES; i < NR_GRANT_ENTRIES; i++) put_free_entry(i); - setup.dom = DOMID_SELF; - setup.nr_frames = NR_GRANT_FRAMES; - set_xen_guest_handle(setup.frame_list, frames); - - HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1); - gnttab_table = map_frames(frames, NR_GRANT_FRAMES); + gnttab_table = arch_init_gnttab(NR_GRANT_FRAMES); printk("gnttab_table mapped at %p.\n", gnttab_table); } diff --git a/extras/mini-os/include/gnttab.h b/extras/mini-os/include/gnttab.h index acd6c39..c43ad42 100644 --- a/extras/mini-os/include/gnttab.h +++ b/extras/mini-os/include/gnttab.h @@ -12,5 +12,6 @@ unsigned long gnttab_end_transfer(grant_ref_t gref); int gnttab_end_access(grant_ref_t ref); const char *gnttabop_error(int16_t status); void fini_gnttab(void); +grant_entry_t *arch_init_gnttab(int nr_grant_frames); #endif /* !__GNTTAB_H__ */ -- 2.0.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |