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

Reply via email to