diff options
| -rw-r--r-- | arch/x86/kernel/vmlinux.lds.S | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index b92e040466c1..3f07c370f761 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S | |||
| @@ -242,6 +242,12 @@ SECTIONS | |||
| 242 | __x86_cpu_dev_end = .; | 242 | __x86_cpu_dev_end = .; |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | /* | ||
| 246 | * start address and size of operations which during runtime | ||
| 247 | * can be patched with virtualization friendly instructions or | ||
| 248 | * baremetal native ones. Think page table operations. | ||
| 249 | * Details in paravirt_types.h | ||
| 250 | */ | ||
| 245 | . = ALIGN(8); | 251 | . = ALIGN(8); |
| 246 | .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { | 252 | .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { |
| 247 | __parainstructions = .; | 253 | __parainstructions = .; |
| @@ -249,6 +255,11 @@ SECTIONS | |||
| 249 | __parainstructions_end = .; | 255 | __parainstructions_end = .; |
| 250 | } | 256 | } |
| 251 | 257 | ||
| 258 | /* | ||
| 259 | * struct alt_inst entries. From the header (alternative.h): | ||
| 260 | * "Alternative instructions for different CPU types or capabilities" | ||
| 261 | * Think locking instructions on spinlocks. | ||
| 262 | */ | ||
| 252 | . = ALIGN(8); | 263 | . = ALIGN(8); |
| 253 | .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) { | 264 | .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) { |
| 254 | __alt_instructions = .; | 265 | __alt_instructions = .; |
| @@ -256,10 +267,21 @@ SECTIONS | |||
| 256 | __alt_instructions_end = .; | 267 | __alt_instructions_end = .; |
| 257 | } | 268 | } |
| 258 | 269 | ||
| 270 | /* | ||
| 271 | * And here are the replacement instructions. The linker sticks | ||
| 272 | * them as binary blobs. The .altinstructions has enough data to | ||
| 273 | * get the address and the length of them to patch the kernel safely. | ||
| 274 | */ | ||
| 259 | .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) { | 275 | .altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) { |
| 260 | *(.altinstr_replacement) | 276 | *(.altinstr_replacement) |
| 261 | } | 277 | } |
| 262 | 278 | ||
| 279 | /* | ||
| 280 | * struct iommu_table_entry entries are injected in this section. | ||
| 281 | * It is an array of IOMMUs which during run time gets sorted depending | ||
| 282 | * on its dependency order. After rootfs_initcall is complete | ||
| 283 | * this section can be safely removed. | ||
| 284 | */ | ||
| 263 | .iommu_table : AT(ADDR(.iommu_table) - LOAD_OFFSET) { | 285 | .iommu_table : AT(ADDR(.iommu_table) - LOAD_OFFSET) { |
| 264 | __iommu_table = .; | 286 | __iommu_table = .; |
| 265 | *(.iommu_table) | 287 | *(.iommu_table) |
