From 4f4532210a27c852313349f5f451514b23f44e4a Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Mon, 10 Aug 2009 23:47:58 +0300 Subject: [PATCH] Fixed a bug with page_map size by dynamically allocating it. --- src/glue/arm/init.c | 4 ++++ tasks/mm0/src/physmem.c | 30 ++++++++++++++++++------------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/glue/arm/init.c b/src/glue/arm/init.c index 016fe41..db5d6cb 100644 --- a/src/glue/arm/init.c +++ b/src/glue/arm/init.c @@ -404,6 +404,10 @@ void init_finalize(struct kernel_container *kcont) */ free_bootmem(); + /* + * Set up KIP UTCB ref + */ + kip.utcb = (u32)current->utcb_address; /* * Start the scheduler, jumping to task */ diff --git a/tasks/mm0/src/physmem.c b/tasks/mm0/src/physmem.c index 96c418b..88714de 100644 --- a/tasks/mm0/src/physmem.c +++ b/tasks/mm0/src/physmem.c @@ -17,18 +17,18 @@ #include #include #include +#include -struct page_bitmap page_map; /* Bitmap of used/unused pages at bootup */ struct memdesc physmem; /* Initial, primitive memory descriptor */ struct membank membank[1]; /* The memory bank */ struct page *page_array; /* The physical page array based on mem bank */ -static void init_page_map(unsigned long pfn_start, unsigned long pfn_end) +static void init_page_map(struct page_bitmap *pmap, unsigned long pfn_start, unsigned long pfn_end) { - page_map.pfn_start = pfn_start; - page_map.pfn_end = pfn_end; - set_page_map(&page_map, pfn_start, pfn_end - pfn_start, 0); + pmap->pfn_start = pfn_start; + pmap->pfn_end = pfn_end; + set_page_map(pmap, pfn_start, pfn_end - pfn_start, 0); } /* @@ -143,20 +143,26 @@ void init_physmem_primary(struct initdata *initdata) unsigned long pfn_start, pfn_end, pfn_images_end = 0; struct bootdesc *bootdesc = initdata->bootdesc; - /* Initialise page map from physmem capability */ - init_page_map(initdata->physmem->start, - initdata->physmem->end); + /* Allocate page map structure */ + initdata->page_map = alloc_bootmem(sizeof(struct page_bitmap) + + ((initdata->physmem->end - + initdata->physmem->start) + >> 5) + 1, 0); - /* Set initdata pointer to initialized page map */ - initdata->page_map = &page_map; + /* Initialise page map from physmem capability */ + init_page_map(initdata->page_map, + initdata->physmem->start, + initdata->physmem->end); /* Mark pager and other boot task areas as used */ for (int i = 0; i < bootdesc->total_images; i++) { - pfn_start = __pfn(page_align_up(bootdesc->images[i].phys_start)); + pfn_start = + __pfn(page_align_up(bootdesc->images[i].phys_start)); pfn_end = __pfn(page_align_up(bootdesc->images[i].phys_end)); if (pfn_end > pfn_images_end) pfn_images_end = pfn_end; - set_page_map(&page_map, pfn_start, pfn_end - pfn_start, 1); + set_page_map(initdata->page_map, pfn_start, + pfn_end - pfn_start, 1); } physmem.start = initdata->physmem->start;