aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/x86
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-02-21 21:06:55 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-21 21:06:55 -0500
commit2ef14f465b9e096531343f5b734cffc5f759f4a6 (patch)
tree07b504d7105842a4b1a74cf1e153023a02fb9c1e /Documentation/x86
parentcb715a836642e0ec69350670d1c2f800f3e2d2e4 (diff)
parent0da3e7f526fde7a6522a3038b7ce609fc50f6707 (diff)
Merge branch 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 mm changes from Peter Anvin: "This is a huge set of several partly interrelated (and concurrently developed) changes, which is why the branch history is messier than one would like. The *really* big items are two humonguous patchsets mostly developed by Yinghai Lu at my request, which completely revamps the way we create initial page tables. In particular, rather than estimating how much memory we will need for page tables and then build them into that memory -- a calculation that has shown to be incredibly fragile -- we now build them (on 64 bits) with the aid of a "pseudo-linear mode" -- a #PF handler which creates temporary page tables on demand. This has several advantages: 1. It makes it much easier to support things that need access to data very early (a followon patchset uses this to load microcode way early in the kernel startup). 2. It allows the kernel and all the kernel data objects to be invoked from above the 4 GB limit. This allows kdump to work on very large systems. 3. It greatly reduces the difference between Xen and native (Xen's equivalent of the #PF handler are the temporary page tables created by the domain builder), eliminating a bunch of fragile hooks. The patch series also gets us a bit closer to W^X. Additional work in this pull is the 64-bit get_user() work which you were also involved with, and a bunch of cleanups/speedups to __phys_addr()/__pa()." * 'x86-mm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (105 commits) x86, mm: Move reserving low memory later in initialization x86, doc: Clarify the use of asm("%edx") in uaccess.h x86, mm: Redesign get_user with a __builtin_choose_expr hack x86: Be consistent with data size in getuser.S x86, mm: Use a bitfield to mask nuisance get_user() warnings x86/kvm: Fix compile warning in kvm_register_steal_time() x86-32: Add support for 64bit get_user() x86-32, mm: Remove reference to alloc_remap() x86-32, mm: Remove reference to resume_map_numa_kva() x86-32, mm: Rip out x86_32 NUMA remapping code x86/numa: Use __pa_nodebug() instead x86: Don't panic if can not alloc buffer for swiotlb mm: Add alloc_bootmem_low_pages_nopanic() x86, 64bit, mm: hibernate use generic mapping_init x86, 64bit, mm: Mark data/bss/brk to nx x86: Merge early kernel reserve for 32bit and 64bit x86: Add Crash kernel low reservation x86, kdump: Remove crashkernel range find limit for 64bit memblock: Add memblock_mem_size() x86, boot: Not need to check setup_header version for setup_data ...
Diffstat (limited to 'Documentation/x86')
-rw-r--r--Documentation/x86/boot.txt38
1 files changed, 38 insertions, 0 deletions
diff --git a/Documentation/x86/boot.txt b/Documentation/x86/boot.txt
index b443f1de0e5a..3840b6f28afb 100644
--- a/Documentation/x86/boot.txt
+++ b/Documentation/x86/boot.txt
@@ -1055,6 +1055,44 @@ must have read/write permission; CS must be __BOOT_CS and DS, ES, SS
1055must be __BOOT_DS; interrupt must be disabled; %esi must hold the base 1055must be __BOOT_DS; interrupt must be disabled; %esi must hold the base
1056address of the struct boot_params; %ebp, %edi and %ebx must be zero. 1056address of the struct boot_params; %ebp, %edi and %ebx must be zero.
1057 1057
1058**** 64-bit BOOT PROTOCOL
1059
1060For machine with 64bit cpus and 64bit kernel, we could use 64bit bootloader
1061and we need a 64-bit boot protocol.
1062
1063In 64-bit boot protocol, the first step in loading a Linux kernel
1064should be to setup the boot parameters (struct boot_params,
1065traditionally known as "zero page"). The memory for struct boot_params
1066could be allocated anywhere (even above 4G) and initialized to all zero.
1067Then, the setup header at offset 0x01f1 of kernel image on should be
1068loaded into struct boot_params and examined. The end of setup header
1069can be calculated as follows:
1070
1071 0x0202 + byte value at offset 0x0201
1072
1073In addition to read/modify/write the setup header of the struct
1074boot_params as that of 16-bit boot protocol, the boot loader should
1075also fill the additional fields of the struct boot_params as described
1076in zero-page.txt.
1077
1078After setting up the struct boot_params, the boot loader can load
107964-bit kernel in the same way as that of 16-bit boot protocol, but
1080kernel could be loaded above 4G.
1081
1082In 64-bit boot protocol, the kernel is started by jumping to the
108364-bit kernel entry point, which is the start address of loaded
108464-bit kernel plus 0x200.
1085
1086At entry, the CPU must be in 64-bit mode with paging enabled.
1087The range with setup_header.init_size from start address of loaded
1088kernel and zero page and command line buffer get ident mapping;
1089a GDT must be loaded with the descriptors for selectors
1090__BOOT_CS(0x10) and __BOOT_DS(0x18); both descriptors must be 4G flat
1091segment; __BOOT_CS must have execute/read permission, and __BOOT_DS
1092must have read/write permission; CS must be __BOOT_CS and DS, ES, SS
1093must be __BOOT_DS; interrupt must be disabled; %rsi must hold the base
1094address of the struct boot_params.
1095
1058**** EFI HANDOVER PROTOCOL 1096**** EFI HANDOVER PROTOCOL
1059 1097
1060This protocol allows boot loaders to defer initialisation to the EFI 1098This protocol allows boot loaders to defer initialisation to the EFI