mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
paravirt/x86, 64-bit: move __PAGE_OFFSET to leave a space for hypervisor
Set __PAGE_OFFSET to the most negative possible address + 16*PGDIR_SIZE. The gap is to allow a space for a hypervisor to fit. The gap is more or less arbitrary, but it's what Xen needs. When booting native, kernel/head_64.S has a set of compile-time generated pagetables used at boot time. This patch removes their absolutely hard-coded layout, and makes it parameterised on __PAGE_OFFSET (and __START_KERNEL_map). Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Cc: xen-devel <xen-devel@lists.xensource.com> Cc: Stephen Tweedie <sct@redhat.com> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
491eccb721
commit
a6523748bd
2 changed files with 19 additions and 6 deletions
|
@ -32,6 +32,13 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define pud_index(x) (((x) >> PUD_SHIFT) & (PTRS_PER_PUD-1))
|
||||||
|
|
||||||
|
L4_PAGE_OFFSET = pgd_index(__PAGE_OFFSET)
|
||||||
|
L3_PAGE_OFFSET = pud_index(__PAGE_OFFSET)
|
||||||
|
L4_START_KERNEL = pgd_index(__START_KERNEL_map)
|
||||||
|
L3_START_KERNEL = pud_index(__START_KERNEL_map)
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.section .text.head
|
.section .text.head
|
||||||
.code64
|
.code64
|
||||||
|
@ -77,8 +84,8 @@ startup_64:
|
||||||
/* Fixup the physical addresses in the page table
|
/* Fixup the physical addresses in the page table
|
||||||
*/
|
*/
|
||||||
addq %rbp, init_level4_pgt + 0(%rip)
|
addq %rbp, init_level4_pgt + 0(%rip)
|
||||||
addq %rbp, init_level4_pgt + (258*8)(%rip)
|
addq %rbp, init_level4_pgt + (L4_PAGE_OFFSET*8)(%rip)
|
||||||
addq %rbp, init_level4_pgt + (511*8)(%rip)
|
addq %rbp, init_level4_pgt + (L4_START_KERNEL*8)(%rip)
|
||||||
|
|
||||||
addq %rbp, level3_ident_pgt + 0(%rip)
|
addq %rbp, level3_ident_pgt + 0(%rip)
|
||||||
|
|
||||||
|
@ -338,9 +345,9 @@ ENTRY(name)
|
||||||
*/
|
*/
|
||||||
NEXT_PAGE(init_level4_pgt)
|
NEXT_PAGE(init_level4_pgt)
|
||||||
.quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE
|
.quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE
|
||||||
.fill 257,8,0
|
.org init_level4_pgt + L4_PAGE_OFFSET*8, 0
|
||||||
.quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE
|
.quad level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE
|
||||||
.fill 252,8,0
|
.org init_level4_pgt + L4_START_KERNEL*8, 0
|
||||||
/* (2^48-(2*1024*1024*1024))/(2^39) = 511 */
|
/* (2^48-(2*1024*1024*1024))/(2^39) = 511 */
|
||||||
.quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE
|
.quad level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE
|
||||||
|
|
||||||
|
@ -349,7 +356,7 @@ NEXT_PAGE(level3_ident_pgt)
|
||||||
.fill 511,8,0
|
.fill 511,8,0
|
||||||
|
|
||||||
NEXT_PAGE(level3_kernel_pgt)
|
NEXT_PAGE(level3_kernel_pgt)
|
||||||
.fill 510,8,0
|
.fill L3_START_KERNEL,8,0
|
||||||
/* (2^48-(2*1024*1024*1024)-((2^39)*511))/(2^30) = 510 */
|
/* (2^48-(2*1024*1024*1024)-((2^39)*511))/(2^30) = 510 */
|
||||||
.quad level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE
|
.quad level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE
|
||||||
.quad level2_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE
|
.quad level2_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE
|
||||||
|
|
|
@ -26,7 +26,13 @@
|
||||||
#define PUD_PAGE_SIZE (_AC(1, UL) << PUD_SHIFT)
|
#define PUD_PAGE_SIZE (_AC(1, UL) << PUD_SHIFT)
|
||||||
#define PUD_PAGE_MASK (~(PUD_PAGE_SIZE-1))
|
#define PUD_PAGE_MASK (~(PUD_PAGE_SIZE-1))
|
||||||
|
|
||||||
#define __PAGE_OFFSET _AC(0xffff810000000000, UL)
|
/*
|
||||||
|
* Set __PAGE_OFFSET to the most negative possible address +
|
||||||
|
* PGDIR_SIZE*16 (pgd slot 272). The gap is to allow a space for a
|
||||||
|
* hypervisor to fit. Choosing 16 slots here is arbitrary, but it's
|
||||||
|
* what Xen requires.
|
||||||
|
*/
|
||||||
|
#define __PAGE_OFFSET _AC(0xffff880000000000, UL)
|
||||||
|
|
||||||
#define __PHYSICAL_START CONFIG_PHYSICAL_START
|
#define __PHYSICAL_START CONFIG_PHYSICAL_START
|
||||||
#define __KERNEL_ALIGN 0x200000
|
#define __KERNEL_ALIGN 0x200000
|
||||||
|
|
Loading…
Reference in a new issue