x86-32: use brk segment for allocating initial kernel pagetable
Impact: use new interface instead of previous ad hoc implementation Rather than having special purpose init_pg_table_start/end variables to delimit the kernel pagetable built by head_32.S, just use the brk mechanism to extend the bss for the new pagetable. This patch removes init_pg_table_start/end and pg0, defines __brk_base (which is page-aligned and immediately follows _end), initializes the brk region to start there, and uses it for the 32-bit pagetable. Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
5368a2be34
commit
ccf3fe02e3
@ -42,9 +42,6 @@ extern void set_pmd_pfn(unsigned long, unsigned long, pgprot_t);
|
||||
*/
|
||||
#undef TEST_ACCESS_OK
|
||||
|
||||
/* The boot page tables (all created as a single array) */
|
||||
extern unsigned long pg0[];
|
||||
|
||||
#ifdef CONFIG_X86_PAE
|
||||
# include <asm/pgtable-3level.h>
|
||||
#else
|
||||
|
@ -109,9 +109,6 @@ void *extend_brk(size_t size, size_t align);
|
||||
void __init i386_start_kernel(void);
|
||||
extern void probe_roms(void);
|
||||
|
||||
extern unsigned long init_pg_tables_start;
|
||||
extern unsigned long init_pg_tables_end;
|
||||
|
||||
#else
|
||||
void __init x86_64_start_kernel(char *real_mode);
|
||||
void __init x86_64_start_reservations(char *real_mode_data);
|
||||
|
@ -29,9 +29,6 @@ void __init i386_start_kernel(void)
|
||||
reserve_early(ramdisk_image, ramdisk_end, "RAMDISK");
|
||||
}
|
||||
#endif
|
||||
reserve_early(init_pg_tables_start, init_pg_tables_end,
|
||||
"INIT_PG_TABLE");
|
||||
|
||||
reserve_ebda_region();
|
||||
|
||||
/*
|
||||
|
@ -167,7 +167,7 @@ num_subarch_entries = (. - subarch_entries) / 4
|
||||
/*
|
||||
* Initialize page tables. This creates a PDE and a set of page
|
||||
* tables, which are located immediately beyond _end. The variable
|
||||
* init_pg_tables_end is set up to point to the first "safe" location.
|
||||
* _brk_end is set up to point to the first "safe" location.
|
||||
* Mappings are created both at virtual address 0 (identity mapping)
|
||||
* and PAGE_OFFSET for up to _end+sizeof(page tables)+INIT_MAP_BEYOND_END.
|
||||
*
|
||||
@ -190,8 +190,7 @@ default_entry:
|
||||
|
||||
xorl %ebx,%ebx /* %ebx is kept at zero */
|
||||
|
||||
movl $pa(pg0), %edi
|
||||
movl %edi, pa(init_pg_tables_start)
|
||||
movl $pa(__brk_base), %edi
|
||||
movl $pa(swapper_pg_pmd), %edx
|
||||
movl $PTE_IDENT_ATTR, %eax
|
||||
10:
|
||||
@ -216,7 +215,8 @@ default_entry:
|
||||
cmpl %ebp,%eax
|
||||
jb 10b
|
||||
1:
|
||||
movl %edi,pa(init_pg_tables_end)
|
||||
addl $__PAGE_OFFSET, %edi
|
||||
movl %edi, pa(_brk_end)
|
||||
shrl $12, %eax
|
||||
movl %eax, pa(max_pfn_mapped)
|
||||
|
||||
@ -227,8 +227,7 @@ default_entry:
|
||||
|
||||
page_pde_offset = (__PAGE_OFFSET >> 20);
|
||||
|
||||
movl $pa(pg0), %edi
|
||||
movl %edi, pa(init_pg_tables_start)
|
||||
movl $pa(__brk_base), %edi
|
||||
movl $pa(swapper_pg_dir), %edx
|
||||
movl $PTE_IDENT_ATTR, %eax
|
||||
10:
|
||||
@ -249,7 +248,8 @@ page_pde_offset = (__PAGE_OFFSET >> 20);
|
||||
leal (INIT_MAP_BEYOND_END+PTE_IDENT_ATTR)(%edi),%ebp
|
||||
cmpl %ebp,%eax
|
||||
jb 10b
|
||||
movl %edi,pa(init_pg_tables_end)
|
||||
addl $__PAGE_OFFSET, %edi
|
||||
movl %edi, pa(_brk_end)
|
||||
shrl $12, %eax
|
||||
movl %eax, pa(max_pfn_mapped)
|
||||
|
||||
|
@ -161,12 +161,6 @@ static struct resource bss_resource = {
|
||||
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
/* This value is set up by the early boot code to point to the value
|
||||
immediately after the boot time page tables. It contains a *physical*
|
||||
address, and must not be in the .bss segment! */
|
||||
unsigned long init_pg_tables_start __initdata = ~0UL;
|
||||
unsigned long init_pg_tables_end __initdata = ~0UL;
|
||||
|
||||
static struct resource video_ram_resource = {
|
||||
.name = "Video RAM area",
|
||||
.start = 0xa0000,
|
||||
|
@ -196,10 +196,6 @@ SECTIONS
|
||||
__brk_limit = . ;
|
||||
|
||||
_end = . ;
|
||||
|
||||
/* This is where the kernel creates the early boot page tables */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
pg0 = . ;
|
||||
}
|
||||
|
||||
/* Sections to be discarded */
|
||||
|
@ -1058,14 +1058,6 @@ __init void lguest_init(void)
|
||||
* lguest_init() where the rest of the fairly chaotic boot setup
|
||||
* occurs. */
|
||||
|
||||
/* The native boot code sets up initial page tables immediately after
|
||||
* the kernel itself, and sets init_pg_tables_end so they're not
|
||||
* clobbered. The Launcher places our initial pagetables somewhere at
|
||||
* the top of our physical memory, so we don't need extra space: set
|
||||
* init_pg_tables_end to the end of the kernel. */
|
||||
init_pg_tables_start = __pa(pg0);
|
||||
init_pg_tables_end = __pa(pg0);
|
||||
|
||||
/* As described in head_32.S, we map the first 128M of memory. */
|
||||
max_pfn_mapped = (128*1024*1024) >> PAGE_SHIFT;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user