|
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, |
@@ -186,11 +207,38 @@ setup_efi_state(struct boot_params *params, unsigned long params_load_addr, |
186 | 207 | } |
187 | 208 | #endif /* CONFIG_EFI */ |
188 | 209 |
|
| 210 | +static void |
| 211 | +setup_ima_state(const struct kimage *image, struct boot_params *params, |
| 212 | + unsigned long params_load_addr, |
| 213 | + unsigned int ima_setup_data_offset) |
| 214 | +{ |
| 215 | +#ifdef CONFIG_IMA_KEXEC |
| 216 | + struct setup_data *sd = (void *)params + ima_setup_data_offset; |
| 217 | + unsigned long setup_data_phys; |
| 218 | + struct ima_setup_data *ima; |
| 219 | + |
| 220 | + if (!image->ima_buffer_size) |
| 221 | + return; |
| 222 | + |
| 223 | + sd->type = SETUP_IMA; |
| 224 | + sd->len = sizeof(*ima); |
| 225 | + |
| 226 | + ima = (void *)sd + sizeof(struct setup_data); |
| 227 | + ima->addr = image->ima_buffer_addr; |
| 228 | + ima->size = image->ima_buffer_size; |
| 229 | + |
| 230 | + /* Add setup data */ |
| 231 | + setup_data_phys = params_load_addr + ima_setup_data_offset; |
| 232 | + sd->next = params->hdr.setup_data; |
| 233 | + params->hdr.setup_data = setup_data_phys; |
| 234 | +#endif /* CONFIG_IMA_KEXEC */ |
| 235 | +} |
| 236 | + |
189 | 237 | static int |
190 | 238 | setup_boot_parameters(struct kimage *image, struct boot_params *params, |
191 | 239 | unsigned long params_load_addr, |
192 | 240 | unsigned int efi_map_offset, unsigned int efi_map_sz, |
193 | | - unsigned int efi_setup_data_offset) |
| 241 | + unsigned int setup_data_offset) |
194 | 242 | { |
195 | 243 | unsigned int nr_e820_entries; |
196 | 244 | unsigned long long mem_k, start, end; |
@@ -245,8 +293,22 @@ setup_boot_parameters(struct kimage *image, struct boot_params *params, |
245 | 293 | #ifdef CONFIG_EFI |
246 | 294 | /* Setup EFI state */ |
247 | 295 | setup_efi_state(params, params_load_addr, efi_map_offset, efi_map_sz, |
248 | | - efi_setup_data_offset); |
| 296 | + setup_data_offset); |
| 297 | + setup_data_offset += sizeof(struct setup_data) + |
| 298 | + sizeof(struct efi_setup_data); |
249 | 299 | #endif |
| 300 | + |
| 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); |
| 311 | + |
250 | 312 | /* Setup EDD info */ |
251 | 313 | memcpy(params->eddbuf, boot_params.eddbuf, |
252 | 314 | EDDMAXNR * sizeof(struct edd_info)); |
@@ -401,7 +463,13 @@ static void *bzImage64_load(struct kimage *image, char *kernel, |
401 | 463 | params_cmdline_sz = ALIGN(params_cmdline_sz, 16); |
402 | 464 | kbuf.bufsz = params_cmdline_sz + ALIGN(efi_map_sz, 16) + |
403 | 465 | sizeof(struct setup_data) + |
404 | | - sizeof(struct efi_setup_data); |
| 466 | + sizeof(struct efi_setup_data) + |
| 467 | + sizeof(struct setup_data) + |
| 468 | + RNG_SEED_LENGTH; |
| 469 | + |
| 470 | + if (IS_ENABLED(CONFIG_IMA_KEXEC)) |
| 471 | + kbuf.bufsz += sizeof(struct setup_data) + |
| 472 | + sizeof(struct ima_setup_data); |
405 | 473 |
|
406 | 474 | params = kzalloc(kbuf.bufsz, GFP_KERNEL); |
407 | 475 | if (!params) |
|
0 commit comments