diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2022-07-11 17:41:10 +0200 |
---|---|---|
committer | Simon Horman <horms@kernel.org> | 2022-07-15 11:24:12 +0200 |
commit | 6cd3e94813f71bc45756fd4e3ca3beec19039c40 (patch) | |
tree | 370f30653de42a329dd61d7c3129470001c41a94 /kexec | |
parent | db26ac7f6a9c01f3df3d0c73325c9d1730e2bed0 (diff) |
i386: pass rng seed via setup_data
Linux ≥5.20 expects a RNG seed via setup_data as of the upstream commit
in the link below. That commit adjusts kexec_file_load to pass
SETUP_RNG_SEED. kexec-tools should follow suite, so add more or less the
same code here.
Link: https://git.kernel.org/tip/tip/c/68b8e9713c8
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Simon Horman <horms@kernel.org>
Diffstat (limited to 'kexec')
-rw-r--r-- | kexec/arch/i386/x86-linux-setup.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/kexec/arch/i386/x86-linux-setup.c b/kexec/arch/i386/x86-linux-setup.c index ab54a4a..14263b0 100644 --- a/kexec/arch/i386/x86-linux-setup.c +++ b/kexec/arch/i386/x86-linux-setup.c @@ -24,6 +24,7 @@ #include <limits.h> #include <sys/types.h> #include <sys/stat.h> +#include <sys/random.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/fb.h> @@ -544,6 +545,7 @@ struct setup_data { #define SETUP_DTB 2 #define SETUP_PCI 3 #define SETUP_EFI 4 +#define SETUP_RNG_SEED 9 uint32_t len; uint8_t data[0]; } __attribute__((packed)); @@ -824,6 +826,26 @@ static void setup_e820(struct kexec_info *info, struct x86_linux_param_header *r } } +static void setup_rng_seed(struct kexec_info *info, + struct x86_linux_param_header *real_mode) +{ + struct { + struct setup_data header; + uint8_t rng_seed[32]; + } *sd; + + sd = xmalloc(sizeof(*sd)); + sd->header.next = 0; + sd->header.len = sizeof(sd->rng_seed); + sd->header.type = SETUP_RNG_SEED; + + if (getrandom(sd->rng_seed, sizeof(sd->rng_seed), GRND_NONBLOCK) != + sizeof(sd->rng_seed)) + return; /* Not initialized, so don't pass a seed. */ + + add_setup_data(info, real_mode, &sd->header); +} + static int get_efi_mem_desc_version(struct x86_linux_param_header *real_mode) { @@ -923,6 +945,9 @@ void setup_linux_system_parameters(struct kexec_info *info, setup_e820(info, real_mode); + /* pass RNG seed */ + setup_rng_seed(info, real_mode); + /* fill the EDD information */ setup_edd_info(real_mode); |