| @@ -16,6 +16,8 @@ · 15 unmodified lines |
| 16 | 16 | #include <linux/kexec.h> |
| 17 | 17 | #include <linux/kernel.h> |
| 18 | 18 | #include <linux/mm.h> |
| 19 | +#include <linux/libfdt.h> |
| 20 | +#include <linux/of_fdt.h> |
| 19 | 21 | #include <linux/efi.h> |
| 20 | 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 | 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 | 239 | static void |
| 216 | 240 | setup_ima_state(const struct kimage *image, struct boot_params *params, |
| 217 | 241 | unsigned long params_load_addr, |
| @@ -336,6 +360,17 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params, · 118 unmodified lines |
| 336 | 360 | sizeof(struct efi_setup_data); |
| 337 | 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 | 374 | if (IS_ENABLED(CONFIG_IMA_KEXEC)) { |
| 340 | 375 | /* Setup IMA log buffer state */ |
| 341 | 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 | 564 | sizeof(struct setup_data) + |
| 530 | 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 | 573 | if (IS_ENABLED(CONFIG_IMA_KEXEC)) |
| 533 | 574 | kbuf.bufsz += sizeof(struct setup_data) + |
| 534 | 575 | sizeof(struct ima_setup_data); |
| @@ -537,7 +578,7 @@ static void *bzImage64_load(struct kimage *image, char *kernel, · 2 unmodified lines |
| 537 | 578 | kbuf.bufsz += sizeof(struct setup_data) + |
| 538 | 579 | sizeof(struct kho_data); |
| 539 | 580 | |
| 540 | | − params = kzalloc(kbuf.bufsz, GFP_KERNEL); |
| 581 | + params = kvzalloc(kbuf.bufsz, GFP_KERNEL); |
| 541 | 582 | if (!params) |
| 542 | 583 | return ERR_PTR(-ENOMEM); |
| 543 | 584 | efi_map_offset = params_cmdline_sz; |
| @@ -647,7 +688,7 @@ static void *bzImage64_load(struct kimage *image, char *kernel, · 103 unmodified lines |
| 647 | 688 | return ldata; |
| 648 | 689 | |
| 649 | 690 | out_free_params: |
| 650 | | − kfree(params); |
| 691 | + kvfree(params); |
| 651 | 692 | return ERR_PTR(ret); |
| 652 | 693 | } |
| 653 | 694 | |
| @@ -659,7 +700,7 @@ static int bzImage64_cleanup(void *loader_data) · 5 unmodified lines |
| 659 | 700 | if (!ldata) |
| 660 | 701 | return 0; |
| 661 | 702 | |
| 662 | | − kfree(ldata->bootparams_buf); |
| 703 | + kvfree(ldata->bootparams_buf); |
| 663 | 704 | ldata->bootparams_buf = NULL; |
| 664 | 705 | |
| 665 | 706 | return 0; |