diff options
Diffstat (limited to 'i386/i386at/biosmem.c')
-rw-r--r-- | i386/i386at/biosmem.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/i386/i386at/biosmem.c b/i386/i386at/biosmem.c index 78e7bb21..937c0e3d 100644 --- a/i386/i386at/biosmem.c +++ b/i386/i386at/biosmem.c @@ -637,10 +637,8 @@ biosmem_setup_allocator(const struct multiboot_raw_info *mbi) */ end = vm_page_trunc((mbi->mem_upper + 1024) << 10); -#ifndef __LP64__ if (end > VM_PAGE_DIRECTMAP_LIMIT) end = VM_PAGE_DIRECTMAP_LIMIT; -#endif /* __LP64__ */ max_heap_start = 0; max_heap_end = 0; @@ -691,10 +689,21 @@ biosmem_bootstrap_common(void) if (error) boot_panic(biosmem_panic_noseg_msg); +#if !defined(MACH_HYP) && NCPUS > 1 + /* + * Grab an early page for AP boot code which needs to be below 1MB. + */ + assert (phys_start < 0x100000); + apboot_addr = phys_start; + phys_start += PAGE_SIZE; +#endif + biosmem_set_segment(VM_PAGE_SEG_DMA, phys_start, phys_end); phys_start = VM_PAGE_DMA_LIMIT; + #ifdef VM_PAGE_DMA32_LIMIT +#if VM_PAGE_DMA32_LIMIT < VM_PAGE_DIRECTMAP_LIMIT phys_end = VM_PAGE_DMA32_LIMIT; error = biosmem_map_find_avail(&phys_start, &phys_end); @@ -704,7 +713,9 @@ biosmem_bootstrap_common(void) biosmem_set_segment(VM_PAGE_SEG_DMA32, phys_start, phys_end); phys_start = VM_PAGE_DMA32_LIMIT; +#endif #endif /* VM_PAGE_DMA32_LIMIT */ + phys_end = VM_PAGE_DIRECTMAP_LIMIT; error = biosmem_map_find_avail(&phys_start, &phys_end); @@ -714,6 +725,21 @@ biosmem_bootstrap_common(void) biosmem_set_segment(VM_PAGE_SEG_DIRECTMAP, phys_start, phys_end); phys_start = VM_PAGE_DIRECTMAP_LIMIT; + +#ifdef VM_PAGE_DMA32_LIMIT +#if VM_PAGE_DMA32_LIMIT > VM_PAGE_DIRECTMAP_LIMIT + phys_end = VM_PAGE_DMA32_LIMIT; + error = biosmem_map_find_avail(&phys_start, &phys_end); + + if (error) + return; + + biosmem_set_segment(VM_PAGE_SEG_DMA32, phys_start, phys_end); + + phys_start = VM_PAGE_DMA32_LIMIT; +#endif +#endif /* VM_PAGE_DMA32_LIMIT */ + phys_end = VM_PAGE_HIGHMEM_LIMIT; error = biosmem_map_find_avail(&phys_start, &phys_end); @@ -823,10 +849,11 @@ biosmem_directmap_end(void) { if (biosmem_segment_size(VM_PAGE_SEG_DIRECTMAP) != 0) return biosmem_segment_end(VM_PAGE_SEG_DIRECTMAP); - else if (biosmem_segment_size(VM_PAGE_SEG_DMA32) != 0) +#if defined(VM_PAGE_DMA32_LIMIT) && (VM_PAGE_DMA32_LIMIT < VM_PAGE_DIRECTMAP_LIMIT) + if (biosmem_segment_size(VM_PAGE_SEG_DMA32) != 0) return biosmem_segment_end(VM_PAGE_SEG_DMA32); - else - return biosmem_segment_end(VM_PAGE_SEG_DMA); +#endif + return biosmem_segment_end(VM_PAGE_SEG_DMA); } static const char * __init |