From f7b768ee16d24e5ebe80ec2bb79bac1e7145be70 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Sat, 25 Jul 2009 17:44:29 +0300 Subject: [PATCH] More changes for cleaner initialization and support for containers. --- SConstruct | 2 +- include/l4/arch/arm/linker.h | 8 +-- .../l4/arch/arm/{mylink.lds => linker.lds} | 51 +++++++------- include/l4/arch/arm/v5/mm.h | 3 + include/l4/generic/bootmem.h | 13 ++++ include/l4/glue/arm/memory.h | 13 +--- include/l4/platform/pb926/offsets.h | 2 +- src/arch/arm/bootdesc.c | 4 +- src/arch/arm/v5/mm.c | 67 ++++++++++++++++--- src/generic/SConscript | 2 +- src/generic/bootm.c | 52 ++++++++++++++ src/generic/kresource.c | 56 ++++++++++++++++ src/generic/pgalloc.c | 7 +- src/glue/arm/init.c | 57 +++++++--------- src/glue/arm/memory.c | 42 ------------ src/platform/pb926/platform.c | 13 ++-- src/platform/pb926/printascii.S | 4 +- 17 files changed, 247 insertions(+), 149 deletions(-) rename include/l4/arch/arm/{mylink.lds => linker.lds} (64%) create mode 100644 include/l4/generic/bootmem.h create mode 100644 src/generic/bootm.c create mode 100644 src/generic/kresource.c diff --git a/SConstruct b/SConstruct index 27df843..d94da0d 100644 --- a/SConstruct +++ b/SConstruct @@ -27,7 +27,7 @@ import cml2header import cmlconfigure # The linker script to link the final executable -linker_script = join(headers_root, 'l4/arch/arm/mylink.lds') +linker_script = join(headers_root, 'l4/arch/arm/linker.lds') # Environment to build sources #env = None diff --git a/include/l4/arch/arm/linker.h b/include/l4/arch/arm/linker.h index 1ea1495..545817b 100644 --- a/include/l4/arch/arm/linker.h +++ b/include/l4/arch/arm/linker.h @@ -16,14 +16,10 @@ extern unsigned long arm_high_vector[]; extern unsigned long _end_vectors[]; extern unsigned long _start_kip[]; extern unsigned long _end_kip[]; -extern unsigned long _start_ptab[]; -extern unsigned long _end_ptab[]; +extern unsigned long _start_init[]; +extern unsigned long _end_init[]; extern unsigned long _bootstack[]; extern unsigned long _end_kernel[]; -extern unsigned long _start_kspace[]; -extern unsigned long _start_pmd[]; -extern unsigned long _end_pmd[]; -extern unsigned long _end_kspace[]; extern unsigned long _end[]; /* Link markers that get modified at runtime */ diff --git a/include/l4/arch/arm/mylink.lds b/include/l4/arch/arm/linker.lds similarity index 64% rename from include/l4/arch/arm/mylink.lds rename to include/l4/arch/arm/linker.lds index 63060e0..e85b6a0 100644 --- a/include/l4/arch/arm/mylink.lds +++ b/include/l4/arch/arm/linker.lds @@ -1,36 +1,32 @@ /* - * * Simple linker script * * Copyright (C) 2007 Bahadir Balban - * */ /* FIXME: * Currently we can't include cpp #defines in linker script. * Check that below offsets are coherent with offsets.h */ -phys_addr_base = 0x100000; -kern_offset = 0xF0000000; -virt_addr_base = phys_addr_base + kern_offset; +kernel_offset = 0xF0000000; +kernel_physical = 0x8000; +kernel_virtual = kernel_physical + kernel_offset; /* A temporary boot stack is used before a proper kernel stack is set up */ -_bootstack_physical = _bootstack - kern_offset; +_bootstack_physical = _bootstack - kernel_offset; /* The symbols are linked at virtual addresses. So is _start. * We must set the entry point to a physical address, so that * when the image is loaded, it doesn't jump to a non existing * virtual address. */ -_start_physical = phys_addr_base; - -ENTRY(_start_physical) +ENTRY(kernel_physical) SECTIONS { - . = virt_addr_base; + . = kernel_virtual; _start_kernel = .; - .text : AT (ADDR(.text) - kern_offset) + .text : AT (ADDR(.text) - kernel_offset) { _start_text = .; /* Make sure head.S comes first */ @@ -41,9 +37,9 @@ SECTIONS } . = ALIGN(4); /* rodata is needed else your strings will link at physical! */ - .rodata : AT (ADDR(.rodata) - kern_offset) { *(.rodata) } - .rodata1 : AT (ADDR(.rodata1) - kern_offset) { *(.rodata1) } - .data : AT (ADDR(.data) - kern_offset) + .rodata : AT (ADDR(.rodata) - kernel_offset) { *(.rodata) } + .rodata1 : AT (ADDR(.rodata1) - kernel_offset) { *(.rodata1) } + .data : AT (ADDR(.data) - kernel_offset) { _start_data = .; *(.data) @@ -61,7 +57,7 @@ SECTIONS _end_syscalls = .; _end_data = .; } - .bss : AT (ADDR(.bss) - kern_offset) + .bss : AT (ADDR(.bss) - kernel_offset) { *(.bss) } @@ -69,19 +65,20 @@ SECTIONS . += 0x2000; /* This is required as the link counter does not seem * to increment for the bss section * TODO: Change this with PAGE_SIZE */ + + /* Below part is to be discarded after boot */ + _start_init = .; + .init : AT (ADDR(.init) - kernel_offset) + { + . = ALIGN(16K); /* For initial pgd */ + *(.init.pgd) + *(.init.data) + *(.init.bootmem) + } + /* Space for boot stack */ + . += 0x1000; + _end_init = .; _bootstack = .; _end_kernel = .; - . = ALIGN(1M); - .kspace : AT(ADDR(.kspace) - kern_offset) - { - _start_kspace = .; - *(.kspace.pgd) - . = ALIGN(4K); - _start_pmd = .; - *(.kspace.pmd) - _end_pmd = .; - _end_kspace = .; - } _end = .; } - diff --git a/include/l4/arch/arm/v5/mm.h b/include/l4/arch/arm/v5/mm.h index b7e948c..0be59ab 100644 --- a/include/l4/arch/arm/v5/mm.h +++ b/include/l4/arch/arm/v5/mm.h @@ -137,6 +137,9 @@ void arch_hardware_flush(pgd_table_t *pgd); void add_section_mapping_init(unsigned int paddr, unsigned int vaddr, unsigned int size, unsigned int flags); +void add_boot_mapping(unsigned int paddr, unsigned int vaddr, + unsigned int size, unsigned int flags); + struct address_space; int delete_page_tables(struct address_space *space); int copy_user_tables(struct address_space *new, struct address_space *orig); diff --git a/include/l4/generic/bootmem.h b/include/l4/generic/bootmem.h new file mode 100644 index 0000000..7b35373 --- /dev/null +++ b/include/l4/generic/bootmem.h @@ -0,0 +1,13 @@ +/* + * Copyright (C) 2009 Bahadir Balban + */ + +#ifndef __BOOTMEM_H__ +#define __BOOTMEM_H__ + +void *alloc_bootmem(int size, int alignment); +pmd_table_t *alloc_boot_pmd(void); + +extern pgd_table_t init_pgd; + +#endif /* __BOOTMEM_H__ */ diff --git a/include/l4/glue/arm/memory.h b/include/l4/glue/arm/memory.h index bed1db9..ae7cc24 100644 --- a/include/l4/glue/arm/memory.h +++ b/include/l4/glue/arm/memory.h @@ -33,7 +33,7 @@ #define page_align(addr) (((unsigned int)(addr)) & \ (~PAGE_MASK)) -#define is_aligned(val, mask) (!(((unsigned long)(val)) & mask)) +#define is_aligned(val, size) (!(((unsigned long)(val)) & ((size) - 1))) #define is_page_aligned(val) (!(((unsigned long)(val)) & PAGE_MASK)) #define page_boundary(x) is_page_aligned(x) @@ -80,13 +80,6 @@ static inline void be32_to_cpu(unsigned int x) #define TASK_AVERAGE_SIZE SZ_16MB #define TASKS_PER_1MB_GRANT 28 -extern pgd_table_t kspace; -extern pmd_table_t pmd_tables[]; -extern unsigned long pmdtab_i; - -void init_pmd_tables(void); -pmd_table_t *alloc_boot_pmd(void); - /* * Each time a pager grants memory to the kernel, these parameters are called * for in order to distribute the granted memory for different purposes. @@ -104,13 +97,9 @@ typedef struct grant_kmem_usage { } grant_kmem_usage_t; void paging_init(void); -void init_pmd_tables(void); -void init_clear_ptab(void); unsigned int space_flags_to_ptflags(unsigned int flags); -void add_boot_mapping(unsigned int paddr, unsigned int vaddr, - unsigned int size, unsigned int flags); void add_mapping_pgd(unsigned int paddr, unsigned int vaddr, unsigned int size, unsigned int flags, pgd_table_t *pgd); diff --git a/include/l4/platform/pb926/offsets.h b/include/l4/platform/pb926/offsets.h index 4d19453..4a49729 100644 --- a/include/l4/platform/pb926/offsets.h +++ b/include/l4/platform/pb926/offsets.h @@ -33,7 +33,7 @@ #define PB926_SIC_BASE 0x10003000 /* Secondary IC */ #define PB926_UART0_BASE 0x101F1000 /* Console port (UART0) */ -/* +/* * Uart virtual address until a file-based console access * is available for userspace */ diff --git a/src/arch/arm/bootdesc.c b/src/arch/arm/bootdesc.c index 81e145e..3475634 100644 --- a/src/arch/arm/bootdesc.c +++ b/src/arch/arm/bootdesc.c @@ -31,8 +31,8 @@ void read_bootdesc(void) * End of the kernel image is where bootdesc resides. Note this is * not added to the page_map because it's meant to be discarded. */ - add_mapping(virt_to_phys(_end), (unsigned long)_end, PAGE_SIZE, - MAP_USR_DEFAULT_FLAGS); +// add_mapping(virt_to_phys(_end), (unsigned long)_end, PAGE_SIZE, +// MAP_USR_DEFAULT_FLAGS); /* Get original bootdesc */ bootdesc = (struct bootdesc *)_end; diff --git a/src/arch/arm/v5/mm.c b/src/arch/arm/v5/mm.c index a21c3bc..be265e9 100644 --- a/src/arch/arm/v5/mm.c +++ b/src/arch/arm/v5/mm.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include INC_SUBARCH(mm.h) #include INC_SUBARCH(mmu_ops.h) @@ -30,7 +31,7 @@ */ void remove_section_mapping(unsigned long vaddr) { - pgd_table_t *pgd = TASK_PGD(current); + pgd_table_t *pgd = &init_pgd;; pgd_t pgd_i = PGD_INDEX(vaddr); if (!((pgd->entry[pgd_i] & PGD_TYPE_MASK) & PGD_TYPE_SECTION)) @@ -55,7 +56,7 @@ void __add_section_mapping_init(unsigned int paddr, unsigned int l1_offset; /* 1st level page table address */ - l1_ptab = virt_to_phys(&kspace); + l1_ptab = virt_to_phys(&init_pgd); /* Get the section offset for this vaddr */ l1_offset = (vaddr >> 18) & 0x3FFC; @@ -199,6 +200,51 @@ void attach_pmd(pgd_table_t *pgd, pmd_table_t *pmd, unsigned int vaddr) pgd->entry[pgd_i] |= PGD_TYPE_COARSE; } +/* + * Same as normal mapping but with some boot tweaks. + */ +void add_boot_mapping(unsigned int paddr, unsigned int vaddr, + unsigned int size, unsigned int flags) +{ + pmd_table_t *pmd; + pgd_table_t *pgd = &init_pgd; + unsigned int numpages = (size >> PAGE_BITS); + + if (size < PAGE_SIZE) { + printascii("Error: Mapping size must be in bytes not pages.\n"); + while(1); + } + if (size & PAGE_MASK) + numpages++; + + /* Convert generic map flags to pagetable-specific */ + BUG_ON(!(flags = space_flags_to_ptflags(flags))); + + /* Map all consecutive pages that cover given size */ + for (int i = 0; i < numpages; i++) { + /* Check if another mapping already has a pmd attached. */ + pmd = pmd_exists(pgd, vaddr); + if (!pmd) { + /* + * If this is the first vaddr in + * this pmd, allocate new pmd + */ + pmd = alloc_boot_pmd(); + + /* Attach pmd to its entry in pgd */ + attach_pmd(pgd, pmd, vaddr); + } + + /* Attach paddr to this pmd */ + __add_mapping(page_align(paddr), + page_align(vaddr), flags, pmd); + + /* Go to the next page to be mapped */ + paddr += PAGE_SIZE; + vaddr += PAGE_SIZE; + } +} + /* * Maps @paddr to @vaddr, covering @size bytes also allocates new pmd if * necessary. This flavor explicitly supplies the pgd to modify. This is useful @@ -212,6 +258,7 @@ void add_mapping_pgd(unsigned int paddr, unsigned int vaddr, pmd_table_t *pmd; unsigned int numpages = (size >> PAGE_BITS); + if (size < PAGE_SIZE) { printascii("Error: Mapping size must be in bytes not pages.\n"); while(1); @@ -553,6 +600,7 @@ out_error: extern pmd_table_t *pmd_array; +#if 0 /* * Moves the section mapped kspace that resides far apart from kernel as close * as possible to the kernel image, and unmaps the old 1MB kspace section which @@ -611,6 +659,7 @@ void relocate_page_tables(void) __KERNELNAME__, virt_to_phys(&kspace), virt_to_phys(TASK_PGD(current))); } +#endif /* * Useful for upgrading to page-grained control over a section mapping: @@ -629,18 +678,14 @@ void remap_as_pages(void *vstart, void *vend) pgd_table_t *pgd = (pgd_table_t *)TASK_PGD(current); pmd_table_t *pmd = alloc_pmd(); u32 pmd_phys = virt_to_phys(pmd); - int numpages = __pfn(page_align_up(pend) - pstart); - - BUG_ON((unsigned long)vstart & ARM_SECTION_MASK); - BUG_ON(pmd_i); + int numpages = __pfn(pend - pstart); /* Fill in the pmd first */ - while (pmd_i < numpages) { - pmd->entry[pmd_i] = paddr; - pmd->entry[pmd_i] |= PMD_TYPE_SMALL; /* Small page type */ - pmd->entry[pmd_i] |= space_flags_to_ptflags(MAP_SVC_DEFAULT_FLAGS); + for (int n = 0; n < numpages; n++) { + pmd->entry[pmd_i + n] = paddr; + pmd->entry[pmd_i + n] |= PMD_TYPE_SMALL; /* Small page type */ + pmd->entry[pmd_i + n] |= space_flags_to_ptflags(MAP_SVC_DEFAULT_FLAGS); paddr += PAGE_SIZE; - pmd_i++; } /* Fill in the type to produce a complete pmd translator information */ diff --git a/src/generic/SConscript b/src/generic/SConscript index a32433d..ba3615b 100644 --- a/src/generic/SConscript +++ b/src/generic/SConscript @@ -4,7 +4,7 @@ Import('env') # The set of source files associated with this SConscript file. -src_local = ['physmem.c', 'irq.c', 'scheduler.c', 'time.c', 'tcb.c', 'pgalloc.c', 'kmalloc.c', 'space.c'] +src_local = ['physmem.c', 'irq.c', 'scheduler.c', 'time.c', 'tcb.c', 'pgalloc.c', 'kmalloc.c', 'space.c', 'bootm.c'] obj = env.Object(src_local) Return('obj') diff --git a/src/generic/bootm.c b/src/generic/bootm.c new file mode 100644 index 0000000..1472dbe --- /dev/null +++ b/src/generic/bootm.c @@ -0,0 +1,52 @@ +/* + * Boot memory allocator + * + * Copyright (C) 2009 Bahadir Balban + */ + + +#include INC_ARCH(linker.h) +#include INC_GLUE(memory.h) +#include + +/* All memory allocated here is discarded after boot */ + +#define BOOTMEM_SIZE SZ_32K + +SECTION(".init.pgd") pgd_table_t init_pgd; +SECTION(".init.bootmem") char bootmem[BOOTMEM_SIZE]; + +static unsigned long cursor = (unsigned long)&bootmem; + +void *alloc_bootmem(int size, int alignment) +{ + void *ptr; + + /* If alignment is required */ + if (alignment) { + /* And cursor is not aligned */ + if (!is_aligned(cursor, alignment)) + /* Align the cursor to alignment */ + cursor = align_up(cursor, alignment); + } + + /* Allocate from cursor */ + ptr = (void *)cursor; + + /* Update cursor */ + cursor += size; + + /* Check if cursor is passed bootmem area */ + if (cursor >= (unsigned long)&bootmem[BOOTMEM_SIZE]) { + printk("Fatal: Insufficient boot memory.\n"); + BUG(); + } + + return ptr; +} + +pmd_table_t *alloc_boot_pmd(void) +{ + return alloc_bootmem(sizeof(pmd_table_t), sizeof(pmd_table_t)); +} + diff --git a/src/generic/kresource.c b/src/generic/kresource.c new file mode 100644 index 0000000..0582ceb --- /dev/null +++ b/src/generic/kresource.c @@ -0,0 +1,56 @@ +/* + * Initialize system resource management. + * + * Copyright (C) 2009 Bahadir Balban + */ + +/* + * Here are the steps used to initialize system resources: + * + * Check total physical memory + * Check container memory capabilities + * Find biggest unused physical memory region + * Calculate how much memory is used by all containers + * Initialize a slab-like allocator for all resources. + * Copy boot allocations to real allocations accounted to containers and kernel. + * E.g. initial page table may become page table of a container pager. + * First few pmds used belong to kernel usage, etc. + * Delete all boot memory and add it to physical memory pool. + */ + +#define MEM_FLAGS_VIRTUAL (1 << 0) +#define MEM_AREA_CACHED (1 << 1) + +struct mem_area { + struct link list; + l4id_t mid; + unsigned long start; + unsigned long end; + unsigned long npages; + unsigned long flags; +}; + + +void init_system_resources() +{ + struct mem_area *physmem = alloc_bootmem(sizeof(physmem), 4); + struct mem_area *kernel_used = alloc_bootmem(sizeof(physmem), 4); + + /* Initialize the first memory descriptor for total physical memory */ + physmem.start = PHYS_MEM_START; + physmem.end = PHYS_MEM_END; + physmem.mid = 0; + physmem.npages = (physmem.end - physmem.start) >> PAGE_BITS; + + /* Figure out current kernel usage */ + kernel_used.start = virt_to_phys(_kernel_start); + kernel_used.end = virt_to_phys(_kernel_end); + + /* Figure out each container's physical memory usage */ + for (int i = 0; i < containers->total; i++) { + } +} + + + + diff --git a/src/generic/pgalloc.c b/src/generic/pgalloc.c index 6b41bde..018ef55 100644 --- a/src/generic/pgalloc.c +++ b/src/generic/pgalloc.c @@ -152,12 +152,7 @@ void *alloc_page(void) void *alloc_pmd(void) { - pmd_table_t *pmd; - - if (!(pmd = alloc_boot_pmd())) - pmd = pgalloc_from_cache(PGALLOC_PMD_CACHE); - - return pmd; + return pgalloc_from_cache(PGALLOC_PMD_CACHE); } void *alloc_pgd(void) diff --git a/src/glue/arm/init.c b/src/glue/arm/init.c index ed3d40c..5ee86ba 100644 --- a/src/glue/arm/init.c +++ b/src/glue/arm/init.c @@ -13,6 +13,7 @@ #include #include #include +#include #include INC_ARCH(linker.h) #include INC_ARCH(asm.h) #include INC_ARCH(bootdesc.h) @@ -30,27 +31,22 @@ unsigned int kernel_mapping_end; -void init_locks(void) -{ -} - -struct address_space pager_space; - /* Maps the early memory regions needed to bootstrap the system */ void init_kernel_mappings(void) { - init_clear_ptab(); + memset(&init_pgd, 0, sizeof(pgd_table_t)); /* Map kernel area to its virtual region */ - add_section_mapping_init(virt_to_phys(_start_text), - (unsigned int)_start_text, 1, + add_section_mapping_init(align(virt_to_phys(_start_text),SZ_1MB), + align((unsigned int)_start_text, SZ_1MB), 1, cacheable | bufferable); /* Map kernel one-to-one to its physical region */ - add_section_mapping_init(virt_to_phys(_start_text), - virt_to_phys(_start_text), + add_section_mapping_init(align(virt_to_phys(_start_text),SZ_1MB), + align(virt_to_phys(_start_text),SZ_1MB), 1, 0); +#if 0 /* Map page table to its virtual region */ add_section_mapping_init(virt_to_phys(_start_kspace), (unsigned int)_start_kspace, @@ -67,7 +63,8 @@ void init_kernel_mappings(void) current->space = &pager_space; /* Access physical address of pager_space to assign with initial pgd */ - ((struct address_space *)virt_to_phys(current->space))->pgd = &kspace; + ((struct address_space *)virt_to_phys(current->space))->pgd = &init_pgd; +#endif } void print_sections(void) @@ -83,11 +80,9 @@ void print_sections(void) dprintk("_start_kip: ", (unsigned int) _start_kip); dprintk("_end_kip: ", (unsigned int) _end_kip); dprintk("_bootstack: ", (unsigned int)_bootstack); - dprintk("_end_kernel: ", (unsigned int)_end_kernel); - dprintk("_start_kspace: ", (unsigned int)_start_kspace); - dprintk("_start_pmd: ", (unsigned int)_start_pmd); - dprintk("_end_pmd: ", (unsigned int)_end_pmd); - dprintk("_end_kspace: ", (unsigned int)_end_kspace); + dprintk("_end_kernel: ", (unsigned int)_end_kernel); + dprintk("_start_init: ", (unsigned int)_start_init); + dprintk("_end_init: ", (unsigned int)_end_init); dprintk("_end: ", (unsigned int)_end); } @@ -101,11 +96,11 @@ void start_vm() * TTB must be 16K aligned. This is because first level tables are * sized 16K. */ - if ((unsigned int)&kspace & 0x3FFF) + if ((unsigned int)&init_pgd & 0x3FFF) dprintk("kspace not properly aligned for ttb:", - (u32)&kspace); - memset((void *)&kspace, 0, sizeof(pgd_table_t)); - arm_set_ttb(virt_to_phys(&kspace)); + (u32)&init_pgd); + // memset((void *)&kspace, 0, sizeof(pgd_table_t)); + arm_set_ttb(virt_to_phys(&init_pgd)); /* * This sets all 16 domains to zero and domain 0 to 1. The outcome @@ -208,8 +203,8 @@ void vectors_init() unsigned int size = ((u32)_end_vectors - (u32)arm_high_vector); /* Map the vectors in high vector page */ - add_mapping(virt_to_phys(arm_high_vector), - ARM_HIGH_VECTOR, size, 0); + add_boot_mapping(virt_to_phys(arm_high_vector), + ARM_HIGH_VECTOR, size, 0); arm_enable_high_vectors(); /* Kernel memory trapping is enabled at this point. */ @@ -361,8 +356,9 @@ void init_tasks() void start_kernel(void) { printascii("\n"__KERNELNAME__": start kernel...\n"); + /* Print section boundaries for kernel image */ - //print_sections(); + print_sections(); /* Initialise section mappings for the kernel area */ init_kernel_mappings(); @@ -370,9 +366,6 @@ void start_kernel(void) /* Enable virtual memory and jump to virtual addresses */ start_vm(); - /* PMD tables initialised */ - init_pmd_tables(); - /* Initialise platform-specific page mappings, and peripherals */ platform_init(); @@ -382,10 +375,13 @@ void start_kernel(void) vectors_init(); /* Remap 1MB kernel sections as 4Kb pages. */ - remap_as_pages(_start_kernel, _end_kernel); + // remap_as_pages((void *)page_align(_start_kernel), (void *)page_align_up(_end)); /* Move the initial pgd into a more convenient place, mapped as pages. */ - relocate_page_tables(); + // relocate_page_tables(); + + /* Evaluate system resources and set up resource pools */ + init_system_resources(); /* Initialise memory allocators */ paging_init(); @@ -396,9 +392,6 @@ void start_kernel(void) /* Initialise system call page */ syscall_init(); - /* Initialise everything else, e.g. locks, lists... */ - init_locks(); - /* Setup inittask's ktcb and push it to scheduler runqueue */ init_tasks(); diff --git a/src/glue/arm/memory.c b/src/glue/arm/memory.c index c0b506f..b24c399 100644 --- a/src/glue/arm/memory.c +++ b/src/glue/arm/memory.c @@ -39,48 +39,6 @@ unsigned int space_flags_to_ptflags(unsigned int flags) BUG(); return 0; } -#define NUM_PMD_TABLES 7 -//#define NUM_PGD_TABLES 8 - -/* Initial first level page table to provide startup mappings */ -SECTION(".kspace.pgd") pgd_table_t kspace; -SECTION(".kspace.pmd") pmd_table_t pmd_tables[NUM_PMD_TABLES]; - -/* A mini bitmap for boot pmd allocations */ -static int pmd_cnt; -pmd_table_t *pmd_array; - -pmd_table_t *alloc_boot_pmd(void) -{ - pmd_table_t *pt; - - if (pmd_cnt == NUM_PMD_TABLES) - return 0; - - pt = &pmd_array[pmd_cnt++]; - BUG_ON((unsigned long)pt & (sizeof(pmd_table_t) - 1)); - - return pt; -} - -/* - * Initialises pmd allocation cache, this is called before page allocator - * initialises. After this call one can add page mappings via add_mapping(). - * This also sets the alloc_pmd() global function to this boot-time version. - */ -void init_pmd_tables(void) -{ - pmd_cnt = 0; - pmd_array = pmd_tables; - memset(pmd_array, 0, NUM_PMD_TABLES * sizeof(pmd_table_t)); -} - -/* Clears out all entries in the initial page table */ -void init_clear_ptab(void) -{ - memset((void *)virt_to_phys(&kspace), 0, sizeof(pgd_table_t)); -} - /* Sets up struct page array and the physical memory descriptor. */ void paging_init(void) { diff --git a/src/platform/pb926/platform.c b/src/platform/pb926/platform.c index 09dc27d..d59c955 100644 --- a/src/platform/pb926/platform.c +++ b/src/platform/pb926/platform.c @@ -2,7 +2,6 @@ * PB926 platform-specific initialisation and setup * * Copyright (C) 2007 Bahadir Balban - * */ #include @@ -22,7 +21,7 @@ void init_platform_console(void) { - add_mapping(PB926_UART0_BASE, PL011_BASE, PAGE_SIZE, + add_boot_mapping(PB926_UART0_BASE, PL011_BASE, PAGE_SIZE, MAP_IO_DEFAULT_FLAGS); /* @@ -30,7 +29,7 @@ void init_platform_console(void) * userspace printf can work. Note, this raw mapping is to be * removed in the future, when file-based io is implemented. */ - add_mapping(PB926_UART0_BASE, USERSPACE_UART_BASE, PAGE_SIZE, + add_boot_mapping(PB926_UART0_BASE, USERSPACE_UART_BASE, PAGE_SIZE, MAP_USR_IO_FLAGS); uart_init(); @@ -38,18 +37,18 @@ void init_platform_console(void) void init_platform_timer(void) { - add_mapping(PB926_TIMER01_BASE, PLATFORM_TIMER_BASE, PAGE_SIZE, + add_boot_mapping(PB926_TIMER01_BASE, PLATFORM_TIMER_BASE, PAGE_SIZE, MAP_IO_DEFAULT_FLAGS); - add_mapping(PB926_SYSCTRL_BASE, PB926_SYSCTRL_VBASE, PAGE_SIZE, + add_boot_mapping(PB926_SYSCTRL_BASE, PB926_SYSCTRL_VBASE, PAGE_SIZE, MAP_IO_DEFAULT_FLAGS); timer_init(); } void init_platform_irq_controller() { - add_mapping(PB926_VIC_BASE, PLATFORM_IRQCTRL_BASE, PAGE_SIZE, + add_boot_mapping(PB926_VIC_BASE, PLATFORM_IRQCTRL_BASE, PAGE_SIZE, MAP_IO_DEFAULT_FLAGS); - add_mapping(PB926_SIC_BASE, PLATFORM_SIRQCTRL_BASE, PAGE_SIZE, + add_boot_mapping(PB926_SIC_BASE, PLATFORM_SIRQCTRL_BASE, PAGE_SIZE, MAP_IO_DEFAULT_FLAGS); irq_controllers_init(); } diff --git a/src/platform/pb926/printascii.S b/src/platform/pb926/printascii.S index 09f38f7..e727537 100644 --- a/src/platform/pb926/printascii.S +++ b/src/platform/pb926/printascii.S @@ -51,6 +51,7 @@ BEGIN_PROC(printhex4) BEGIN_PROC(printhex2) mov r1, #2 printhex: adr r2, hexbuf +@printhex: ldr r2, =hexbuf add r3, r2, r1 mov r1, #0 strb r1, [r3] @@ -77,8 +78,9 @@ printhex: adr r2, hexbuf .macro get_straddr rs, rm mrc p15, 0, \rm, c1, c0 @ Get MMU bits. tst \rm, #1 @ MMU enabled? + @subeq \rs, \rs, #KERNEL_AREA_START biceq \rs, \rs, #KERNEL_AREA_START @ Clear Virtual mem offset. - orreq \rs, \rs, #PHYS_ADDR_BASE @ Add Phy mem offset. + @orreq \rs, \rs, #PHYS_ADDR_BASE @ Add Phy mem offset. .endm BEGIN_PROC(printascii)