|
18 | 18 | #include <linux/mm.h>
|
19 | 19 | #include <linux/efi.h>
|
20 | 20 | #include <linux/verification.h>
|
| 21 | +#include <linux/random.h> |
21 | 22 |
|
22 | 23 | #include <asm/bootparam.h>
|
23 | 24 | #include <asm/setup.h>
|
@@ -110,6 +111,26 @@ static int setup_e820_entries(struct boot_params *params)
|
110 | 111 | return 0;
|
111 | 112 | }
|
112 | 113 |
|
| 114 | +enum { RNG_SEED_LENGTH = 32 }; |
| 115 | + |
| 116 | +static void |
| 117 | +setup_rng_seed(struct boot_params *params, unsigned long params_load_addr, |
| 118 | + unsigned int rng_seed_setup_data_offset) |
| 119 | +{ |
| 120 | + struct setup_data *sd = (void *)params + rng_seed_setup_data_offset; |
| 121 | + unsigned long setup_data_phys; |
| 122 | + |
| 123 | + if (!rng_is_initialized()) |
| 124 | + return; |
| 125 | + |
| 126 | + sd->type = SETUP_RNG_SEED; |
| 127 | + sd->len = RNG_SEED_LENGTH; |
| 128 | + get_random_bytes(sd->data, RNG_SEED_LENGTH); |
| 129 | + setup_data_phys = params_load_addr + rng_seed_setup_data_offset; |
| 130 | + sd->next = params->hdr.setup_data; |
| 131 | + params->hdr.setup_data = setup_data_phys; |
| 132 | +} |
| 133 | + |
113 | 134 | #ifdef CONFIG_EFI
|
114 | 135 | static int setup_efi_info_memmap(struct boot_params *params,
|
115 | 136 | unsigned long params_load_addr,
|
@@ -277,9 +298,16 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params,
|
277 | 298 | sizeof(struct efi_setup_data);
|
278 | 299 | #endif
|
279 | 300 |
|
280 |
| - /* Setup IMA log buffer state */ |
281 |
| - setup_ima_state(image, params, params_load_addr, |
282 |
| - setup_data_offset); |
| 301 | + if (IS_ENABLED(CONFIG_IMA_KEXEC)) { |
| 302 | + /* Setup IMA log buffer state */ |
| 303 | + setup_ima_state(image, params, params_load_addr, |
| 304 | + setup_data_offset); |
| 305 | + setup_data_offset += sizeof(struct setup_data) + |
| 306 | + sizeof(struct ima_setup_data); |
| 307 | + } |
| 308 | + |
| 309 | + /* Setup RNG seed */ |
| 310 | + setup_rng_seed(params, params_load_addr, setup_data_offset); |
283 | 311 |
|
284 | 312 | /* Setup EDD info */
|
285 | 313 | memcpy(params->eddbuf, boot_params.eddbuf,
|
@@ -435,7 +463,9 @@ static void *bzImage64_load(struct kimage *image, char *kernel,
|
435 | 463 | params_cmdline_sz = ALIGN(params_cmdline_sz, 16);
|
436 | 464 | kbuf.bufsz = params_cmdline_sz + ALIGN(efi_map_sz, 16) +
|
437 | 465 | sizeof(struct setup_data) +
|
438 |
| - sizeof(struct efi_setup_data); |
| 466 | + sizeof(struct efi_setup_data) + |
| 467 | + sizeof(struct setup_data) + |
| 468 | + RNG_SEED_LENGTH; |
439 | 469 |
|
440 | 470 | if (IS_ENABLED(CONFIG_IMA_KEXEC))
|
441 | 471 | kbuf.bufsz += sizeof(struct setup_data) +
|
|
0 commit comments