summaryrefslogtreecommitdiffstats
path: root/Documentation
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-08-04 15:31:53 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-08-04 15:31:53 -0400
commit5167d09ffad5b16b574d35ce3047ed34caf1e837 (patch)
treefc45dd9cbd578f5010e7b8208ecdfc6534547989 /Documentation
parent8533ce72718871fb528d853391746f36243273af (diff)
parentea1719672f59eeb85829073b567495c4f472ac9f (diff)
Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pull arm64 updates from Will Deacon: "Once again, Catalin's off on holiday and I'm looking after the arm64 tree. Please can you pull the following arm64 updates for 3.17? Note that this branch also includes the new GICv3 driver (merged via a stable tag from Jason's irqchip tree), since there is a fix for older binutils on top. Changes include: - context tracking support (NO_HZ_FULL) which narrowly missed 3.16 - vDSO layout rework following Andy's work on x86 - TEXT_OFFSET fuzzing for bootloader testing - /proc/cpuinfo tidy-up - preliminary work to support 48-bit virtual addresses, but this is currently disabled until KVM has been ported to use it (the patches do, however, bring some nice clean-up) - boot-time CPU sanity checks (especially useful on heterogenous systems) - support for syscall auditing - support for CC_STACKPROTECTOR - defconfig updates" * tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: (55 commits) arm64: add newline to I-cache policy string Revert "arm64: dmi: Add SMBIOS/DMI support" arm64: fpsimd: fix a typo in fpsimd_save_partial_state ENDPROC arm64: don't call break hooks for BRK exceptions from EL0 arm64: defconfig: enable devtmpfs mount option arm64: vdso: fix build error when switching from LE to BE arm64: defconfig: add virtio support for running as a kvm guest arm64: gicv3: Allow GICv3 compilation with older binutils arm64: fix soft lockup due to large tlb flush range arm64/crypto: fix makefile rule for aes-glue-%.o arm64: Do not invoke audit_syscall_* functions if !CONFIG_AUDIT_SYSCALL arm64: Fix barriers used for page table modifications arm64: Add support for 48-bit VA space with 64KB page configuration arm64: asm/pgtable.h pmd/pud definitions clean-up arm64: Determine the vmalloc/vmemmap space at build time based on VA_BITS arm64: Clean up the initial page table creation in head.S arm64: Remove asm/pgtable-*level-types.h files arm64: Remove asm/pgtable-*level-hwdef.h files arm64: Convert bool ARM64_x_LEVELS to int ARM64_PGTABLE_LEVELS arm64: mm: Implement 4 levels of translation tables ...
Diffstat (limited to 'Documentation')
-rw-r--r--Documentation/arm64/booting.txt43
-rw-r--r--Documentation/arm64/memory.txt69
2 files changed, 61 insertions, 51 deletions
diff --git a/Documentation/arm64/booting.txt b/Documentation/arm64/booting.txt
index 37fc4f632176..85af34d55cee 100644
--- a/Documentation/arm64/booting.txt
+++ b/Documentation/arm64/booting.txt
@@ -72,27 +72,54 @@ The decompressed kernel image contains a 64-byte header as follows:
72 72
73 u32 code0; /* Executable code */ 73 u32 code0; /* Executable code */
74 u32 code1; /* Executable code */ 74 u32 code1; /* Executable code */
75 u64 text_offset; /* Image load offset */ 75 u64 text_offset; /* Image load offset, little endian */
76 u64 res0 = 0; /* reserved */ 76 u64 image_size; /* Effective Image size, little endian */
77 u64 res1 = 0; /* reserved */ 77 u64 flags; /* kernel flags, little endian */
78 u64 res2 = 0; /* reserved */ 78 u64 res2 = 0; /* reserved */
79 u64 res3 = 0; /* reserved */ 79 u64 res3 = 0; /* reserved */
80 u64 res4 = 0; /* reserved */ 80 u64 res4 = 0; /* reserved */
81 u32 magic = 0x644d5241; /* Magic number, little endian, "ARM\x64" */ 81 u32 magic = 0x644d5241; /* Magic number, little endian, "ARM\x64" */
82 u32 res5 = 0; /* reserved */ 82 u32 res5; /* reserved (used for PE COFF offset) */
83 83
84 84
85Header notes: 85Header notes:
86 86
87- As of v3.17, all fields are little endian unless stated otherwise.
88
87- code0/code1 are responsible for branching to stext. 89- code0/code1 are responsible for branching to stext.
90
88- when booting through EFI, code0/code1 are initially skipped. 91- when booting through EFI, code0/code1 are initially skipped.
89 res5 is an offset to the PE header and the PE header has the EFI 92 res5 is an offset to the PE header and the PE header has the EFI
90 entry point (efi_stub_entry). When the stub has done its work, it 93 entry point (efi_stub_entry). When the stub has done its work, it
91 jumps to code0 to resume the normal boot process. 94 jumps to code0 to resume the normal boot process.
92 95
93The image must be placed at the specified offset (currently 0x80000) 96- Prior to v3.17, the endianness of text_offset was not specified. In
94from the start of the system RAM and called there. The start of the 97 these cases image_size is zero and text_offset is 0x80000 in the
95system RAM must be aligned to 2MB. 98 endianness of the kernel. Where image_size is non-zero image_size is
99 little-endian and must be respected. Where image_size is zero,
100 text_offset can be assumed to be 0x80000.
101
102- The flags field (introduced in v3.17) is a little-endian 64-bit field
103 composed as follows:
104 Bit 0: Kernel endianness. 1 if BE, 0 if LE.
105 Bits 1-63: Reserved.
106
107- When image_size is zero, a bootloader should attempt to keep as much
108 memory as possible free for use by the kernel immediately after the
109 end of the kernel image. The amount of space required will vary
110 depending on selected features, and is effectively unbound.
111
112The Image must be placed text_offset bytes from a 2MB aligned base
113address near the start of usable system RAM and called there. Memory
114below that base address is currently unusable by Linux, and therefore it
115is strongly recommended that this location is the start of system RAM.
116At least image_size bytes from the start of the image must be free for
117use by the kernel.
118
119Any memory described to the kernel (even that below the 2MB aligned base
120address) which is not marked as reserved from the kernel e.g. with a
121memreserve region in the device tree) will be considered as available to
122the kernel.
96 123
97Before jumping into the kernel, the following conditions must be met: 124Before jumping into the kernel, the following conditions must be met:
98 125
diff --git a/Documentation/arm64/memory.txt b/Documentation/arm64/memory.txt
index d50fa618371b..344e85cc7323 100644
--- a/Documentation/arm64/memory.txt
+++ b/Documentation/arm64/memory.txt
@@ -2,18 +2,18 @@
2 ============================== 2 ==============================
3 3
4Author: Catalin Marinas <catalin.marinas@arm.com> 4Author: Catalin Marinas <catalin.marinas@arm.com>
5Date : 20 February 2012
6 5
7This document describes the virtual memory layout used by the AArch64 6This document describes the virtual memory layout used by the AArch64
8Linux kernel. The architecture allows up to 4 levels of translation 7Linux kernel. The architecture allows up to 4 levels of translation
9tables with a 4KB page size and up to 3 levels with a 64KB page size. 8tables with a 4KB page size and up to 3 levels with a 64KB page size.
10 9
11AArch64 Linux uses 3 levels of translation tables with the 4KB page 10AArch64 Linux uses either 3 levels or 4 levels of translation tables
12configuration, allowing 39-bit (512GB) virtual addresses for both user 11with the 4KB page configuration, allowing 39-bit (512GB) or 48-bit
13and kernel. With 64KB pages, only 2 levels of translation tables are 12(256TB) virtual addresses, respectively, for both user and kernel. With
14used but the memory layout is the same. 1364KB pages, only 2 levels of translation tables, allowing 42-bit (4TB)
14virtual address, are used but the memory layout is the same.
15 15
16User addresses have bits 63:39 set to 0 while the kernel addresses have 16User addresses have bits 63:48 set to 0 while the kernel addresses have
17the same bits set to 1. TTBRx selection is given by bit 63 of the 17the same bits set to 1. TTBRx selection is given by bit 63 of the
18virtual address. The swapper_pg_dir contains only kernel (global) 18virtual address. The swapper_pg_dir contains only kernel (global)
19mappings while the user pgd contains only user (non-global) mappings. 19mappings while the user pgd contains only user (non-global) mappings.
@@ -21,58 +21,40 @@ The swapper_pgd_dir address is written to TTBR1 and never written to
21TTBR0. 21TTBR0.
22 22
23 23
24AArch64 Linux memory layout with 4KB pages: 24AArch64 Linux memory layout with 4KB pages + 3 levels:
25 25
26Start End Size Use 26Start End Size Use
27----------------------------------------------------------------------- 27-----------------------------------------------------------------------
280000000000000000 0000007fffffffff 512GB user 280000000000000000 0000007fffffffff 512GB user
29ffffff8000000000 ffffffffffffffff 512GB kernel
29 30
30ffffff8000000000 ffffffbbfffeffff ~240GB vmalloc
31 31
32ffffffbbffff0000 ffffffbbffffffff 64KB [guard page] 32AArch64 Linux memory layout with 4KB pages + 4 levels:
33 33
34ffffffbc00000000 ffffffbdffffffff 8GB vmemmap 34Start End Size Use
35 35-----------------------------------------------------------------------
36ffffffbe00000000 ffffffbffbbfffff ~8GB [guard, future vmmemap] 360000000000000000 0000ffffffffffff 256TB user
37 37ffff000000000000 ffffffffffffffff 256TB kernel
38ffffffbffa000000 ffffffbffaffffff 16MB PCI I/O space
39
40ffffffbffb000000 ffffffbffbbfffff 12MB [guard]
41
42ffffffbffbc00000 ffffffbffbdfffff 2MB fixed mappings
43
44ffffffbffbe00000 ffffffbffbffffff 2MB [guard]
45
46ffffffbffc000000 ffffffbfffffffff 64MB modules
47
48ffffffc000000000 ffffffffffffffff 256GB kernel logical memory map
49 38
50 39
51AArch64 Linux memory layout with 64KB pages: 40AArch64 Linux memory layout with 64KB pages + 2 levels:
52 41
53Start End Size Use 42Start End Size Use
54----------------------------------------------------------------------- 43-----------------------------------------------------------------------
550000000000000000 000003ffffffffff 4TB user 440000000000000000 000003ffffffffff 4TB user
45fffffc0000000000 ffffffffffffffff 4TB kernel
56 46
57fffffc0000000000 fffffdfbfffeffff ~2TB vmalloc
58 47
59fffffdfbffff0000 fffffdfbffffffff 64KB [guard page] 48AArch64 Linux memory layout with 64KB pages + 3 levels:
60 49
61fffffdfc00000000 fffffdfdffffffff 8GB vmemmap 50Start End Size Use
62 51-----------------------------------------------------------------------
63fffffdfe00000000 fffffdfffbbfffff ~8GB [guard, future vmmemap] 520000000000000000 0000ffffffffffff 256TB user
64 53ffff000000000000 ffffffffffffffff 256TB kernel
65fffffdfffa000000 fffffdfffaffffff 16MB PCI I/O space
66
67fffffdfffb000000 fffffdfffbbfffff 12MB [guard]
68
69fffffdfffbc00000 fffffdfffbdfffff 2MB fixed mappings
70
71fffffdfffbe00000 fffffdfffbffffff 2MB [guard]
72 54
73fffffdfffc000000 fffffdffffffffff 64MB modules
74 55
75fffffe0000000000 ffffffffffffffff 2TB kernel logical memory map 56For details of the virtual kernel memory layout please see the kernel
57booting log.
76 58
77 59
78Translation table lookup with 4KB pages: 60Translation table lookup with 4KB pages:
@@ -86,7 +68,7 @@ Translation table lookup with 4KB pages:
86 | | | | +-> [20:12] L3 index 68 | | | | +-> [20:12] L3 index
87 | | | +-----------> [29:21] L2 index 69 | | | +-----------> [29:21] L2 index
88 | | +---------------------> [38:30] L1 index 70 | | +---------------------> [38:30] L1 index
89 | +-------------------------------> [47:39] L0 index (not used) 71 | +-------------------------------> [47:39] L0 index
90 +-------------------------------------------------> [63] TTBR0/1 72 +-------------------------------------------------> [63] TTBR0/1
91 73
92 74
@@ -99,10 +81,11 @@ Translation table lookup with 64KB pages:
99 | | | | v 81 | | | | v
100 | | | | [15:0] in-page offset 82 | | | | [15:0] in-page offset
101 | | | +----------> [28:16] L3 index 83 | | | +----------> [28:16] L3 index
102 | | +--------------------------> [41:29] L2 index (only 38:29 used) 84 | | +--------------------------> [41:29] L2 index
103 | +-------------------------------> [47:42] L1 index (not used) 85 | +-------------------------------> [47:42] L1 index
104 +-------------------------------------------------> [63] TTBR0/1 86 +-------------------------------------------------> [63] TTBR0/1
105 87
88
106When using KVM, the hypervisor maps kernel pages in EL2, at a fixed 89When using KVM, the hypervisor maps kernel pages in EL2, at a fixed
107offset from the kernel VA (top 24bits of the kernel VA set to zero): 90offset from the kernel VA (top 24bits of the kernel VA set to zero):
108 91