Copying the bpf code parsing result to the proper place: image->kernel_buf, initrd_buf, cmdline_buf.
Signed-off-by: Pingfan Liu <[email protected]> Cc: Baoquan He <[email protected]> Cc: Dave Young <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Philipp Rudo <[email protected]> To: [email protected] --- kernel/kexec_bpf_loader.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/kernel/kexec_bpf_loader.c b/kernel/kexec_bpf_loader.c index bd6a47fc53ed3..5ad67672dead1 100644 --- a/kernel/kexec_bpf_loader.c +++ b/kernel/kexec_bpf_loader.c @@ -82,6 +82,7 @@ static int __init kexec_bpf_prog_run_init(void) late_initcall(kexec_bpf_prog_run_init); #define KEXEC_BPF_CMD_DECOMPRESS 0x1 +#define KEXEC_BPF_CMD_COPY 0x2 #define KEXEC_BPF_SUBCMD_KERNEL 0x1 #define KEXEC_BPF_SUBCMD_INITRD 0x2 @@ -281,6 +282,32 @@ static int kexec_buff_parser(struct bpf_parser_context *parser) } } break; + case KEXEC_BPF_CMD_COPY: + p = __vmalloc(cmd->payload_len, GFP_KERNEL | __GFP_ACCOUNT); + if (!p) + return -ENOMEM; + memcpy(p, buf, cmd->payload_len); + switch (cmd->subcmd) { + case KEXEC_BPF_SUBCMD_KERNEL: + vfree(ctx->kernel); + ctx->kernel = p; + ctx->kernel_sz = cmd->payload_len; + break; + case KEXEC_BPF_SUBCMD_INITRD: + vfree(ctx->initrd); + ctx->initrd = p; + ctx->initrd_sz = cmd->payload_len; + break; + case KEXEC_BPF_SUBCMD_CMDLINE: + vfree(ctx->cmdline); + ctx->cmdline = p; + ctx->cmdline_sz = cmd->payload_len; + break; + default: + vfree(p); + break; + } + break; default: break; } -- 2.49.0
