| @@ -16,6 +16,8 @@ · 15 unmodified lines |
| 16 | #include <linux/kexec.h> | 16 | #include <linux/kexec.h> |
| 17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
| 18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
| | 19 | #include <linux/libfdt.h> |
| | 20 | #include <linux/of_fdt.h> |
| 19 | #include <linux/efi.h> | 21 | #include <linux/efi.h> |
| 20 | #include <linux/random.h> | 22 | #include <linux/random.h> |
| 21 | | 23 | |
| @@ -212,6 +214,28 @@ setup_efi_state(struct boot_params *params, unsigned long params_load_addr, · 190 unmodified lines |
| 212 | } | 214 | } |
| 213 | #endif /* CONFIG_EFI */ | 215 | #endif /* CONFIG_EFI */ |
| 214 | | 216 | |
| | 217 | #ifdef CONFIG_OF_FLATTREE |
| | 218 | static void setup_dtb(struct boot_params *params, |
| | 219 | unsigned long params_load_addr, |
| | 220 | unsigned int dtb_setup_data_offset) |
| | 221 | { |
| | 222 | struct setup_data *sd = (void *)params + dtb_setup_data_offset; |
| | 223 | unsigned long setup_data_phys, dtb_len; |
| | 224 | |
| | 225 | dtb_len = fdt_totalsize(initial_boot_params); |
| | 226 | sd->type = SETUP_DTB; |
| | 227 | sd->len = dtb_len; |
| | 228 | |
| | 229 | /* Carry over current boot DTB with setup_data */ |
| | 230 | memcpy(sd->data, initial_boot_params, dtb_len); |
| | 231 | |
| | 232 | /* Add setup data */ |
| | 233 | setup_data_phys = params_load_addr + dtb_setup_data_offset; |
| | 234 | sd->next = params->hdr.setup_data; |
| | 235 | params->hdr.setup_data = setup_data_phys; |
| | 236 | } |
| | 237 | #endif /* CONFIG_OF_FLATTREE */ |
| | 238 | |
| 215 | static void | 239 | static void |
| 216 | setup_ima_state(const struct kimage *image, struct boot_params *params, | 240 | setup_ima_state(const struct kimage *image, struct boot_params *params, |
| 217 | unsigned long params_load_addr, | 241 | unsigned long params_load_addr, |
| @@ -336,6 +360,17 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params, · 118 unmodified lines |
| 336 | sizeof(struct efi_setup_data); | 360 | sizeof(struct efi_setup_data); |
| 337 | #endif | 361 | #endif |
| 338 | | 362 | |
| | 363 | #ifdef CONFIG_OF_FLATTREE |
| | 364 | if (image->force_dtb && initial_boot_params) { |
| | 365 | setup_dtb(params, params_load_addr, setup_data_offset); |
| | 366 | setup_data_offset += sizeof(struct setup_data) + |
| | 367 | fdt_totalsize(initial_boot_params); |
| | 368 | } else { |
| | 369 | pr_debug("Not carrying over DTB, force_dtb = %d\n", |
| | 370 | image->force_dtb); |
| | 371 | } |
| | 372 | #endif |
| | 373 | |
| 339 | if (IS_ENABLED(CONFIG_IMA_KEXEC)) { | 374 | if (IS_ENABLED(CONFIG_IMA_KEXEC)) { |
| 340 | /* Setup IMA log buffer state */ | 375 | /* Setup IMA log buffer state */ |
| 341 | setup_ima_state(image, params, params_load_addr, | 376 | setup_ima_state(image, params, params_load_addr, |
| @@ -529,6 +564,12 @@ static void *bzImage64_load(struct kimage *image, char *kernel, · 187 unmodified lines |
| 529 | sizeof(struct setup_data) + | 564 | sizeof(struct setup_data) + |
| 530 | RNG_SEED_LENGTH; | 565 | RNG_SEED_LENGTH; |
| 531 | | 566 | |
| | 567 | #ifdef CONFIG_OF_FLATTREE |
| | 568 | if (image->force_dtb && initial_boot_params) |
| | 569 | kbuf.bufsz += sizeof(struct setup_data) + |
| | 570 | fdt_totalsize(initial_boot_params); |
| | 571 | #endif |
| | 572 | |
| 532 | if (IS_ENABLED(CONFIG_IMA_KEXEC)) | 573 | if (IS_ENABLED(CONFIG_IMA_KEXEC)) |
| 533 | kbuf.bufsz += sizeof(struct setup_data) + | 574 | kbuf.bufsz += sizeof(struct setup_data) + |
| 534 | sizeof(struct ima_setup_data); | 575 | sizeof(struct ima_setup_data); |
| @@ -537,7 +578,7 @@ static void *bzImage64_load(struct kimage *image, char *kernel, · 2 unmodified lines |
| 537 | kbuf.bufsz += sizeof(struct setup_data) + | 578 | kbuf.bufsz += sizeof(struct setup_data) + |
| 538 | sizeof(struct kho_data); | 579 | sizeof(struct kho_data); |
| 539 | | 580 | |
| 540 | params = kzalloc(kbuf.bufsz, GFP_KERNEL); | 581 | params = kvzalloc(kbuf.bufsz, GFP_KERNEL); |
| 541 | if (!params) | 582 | if (!params) |
| 542 | return ERR_PTR(-ENOMEM); | 583 | return ERR_PTR(-ENOMEM); |
| 543 | efi_map_offset = params_cmdline_sz; | 584 | efi_map_offset = params_cmdline_sz; |
| @@ -647,7 +688,7 @@ static void *bzImage64_load(struct kimage *image, char *kernel, · 103 unmodified lines |
| 647 | return ldata; | 688 | return ldata; |
| 648 | | 689 | |
| 649 | out_free_params: | 690 | out_free_params: |
| 650 | kfree(params); | 691 | kvfree(params); |
| 651 | return ERR_PTR(ret); | 692 | return ERR_PTR(ret); |
| 652 | } | 693 | } |
| 653 | | 694 | |
| @@ -659,7 +700,7 @@ static int bzImage64_cleanup(void *loader_data) · 5 unmodified lines |
| 659 | if (!ldata) | 700 | if (!ldata) |
| 660 | return 0; | 701 | return 0; |
| 661 | | 702 | |
| 662 | kfree(ldata->bootparams_buf); | 703 | kvfree(ldata->bootparams_buf); |
| 663 | ldata->bootparams_buf = NULL; | 704 | ldata->bootparams_buf = NULL; |
| 664 | | 705 | |
| 665 | return 0; | 706 | return 0; |