kexec_file: Change kexec_add_buffer to take kexec_buf as argument.
This is done to simplify the kexec_add_buffer argument list. Adapt all callers to set up a kexec_buf to pass to kexec_add_buffer. In addition, change the type of kexec_buf.buffer from char * to void *. There is no particular reason for it to be a char *, and the change allows us to get rid of 3 existing casts to char * in the code. Signed-off-by: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com> Acked-by: Dave Young <dyoung@redhat.com> Acked-by: Balbir Singh <bsingharora@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:

committed by
Michael Ellerman

parent
60fe3910bb
commit
ec2b9bfaac
@@ -631,9 +631,9 @@ static int determine_backup_region(u64 start, u64 end, void *arg)
|
||||
|
||||
int crash_load_segments(struct kimage *image)
|
||||
{
|
||||
unsigned long src_start, src_sz, elf_sz;
|
||||
void *elf_addr;
|
||||
int ret;
|
||||
struct kexec_buf kbuf = { .image = image, .buf_min = 0,
|
||||
.buf_max = ULONG_MAX, .top_down = false };
|
||||
|
||||
/*
|
||||
* Determine and load a segment for backup area. First 640K RAM
|
||||
@@ -647,43 +647,44 @@ int crash_load_segments(struct kimage *image)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
src_start = image->arch.backup_src_start;
|
||||
src_sz = image->arch.backup_src_sz;
|
||||
|
||||
/* Add backup segment. */
|
||||
if (src_sz) {
|
||||
if (image->arch.backup_src_sz) {
|
||||
kbuf.buffer = &crash_zero_bytes;
|
||||
kbuf.bufsz = sizeof(crash_zero_bytes);
|
||||
kbuf.memsz = image->arch.backup_src_sz;
|
||||
kbuf.buf_align = PAGE_SIZE;
|
||||
/*
|
||||
* Ideally there is no source for backup segment. This is
|
||||
* copied in purgatory after crash. Just add a zero filled
|
||||
* segment for now to make sure checksum logic works fine.
|
||||
*/
|
||||
ret = kexec_add_buffer(image, (char *)&crash_zero_bytes,
|
||||
sizeof(crash_zero_bytes), src_sz,
|
||||
PAGE_SIZE, 0, -1, 0,
|
||||
&image->arch.backup_load_addr);
|
||||
ret = kexec_add_buffer(&kbuf);
|
||||
if (ret)
|
||||
return ret;
|
||||
image->arch.backup_load_addr = kbuf.mem;
|
||||
pr_debug("Loaded backup region at 0x%lx backup_start=0x%lx memsz=0x%lx\n",
|
||||
image->arch.backup_load_addr, src_start, src_sz);
|
||||
image->arch.backup_load_addr,
|
||||
image->arch.backup_src_start, kbuf.memsz);
|
||||
}
|
||||
|
||||
/* Prepare elf headers and add a segment */
|
||||
ret = prepare_elf_headers(image, &elf_addr, &elf_sz);
|
||||
ret = prepare_elf_headers(image, &kbuf.buffer, &kbuf.bufsz);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
image->arch.elf_headers = elf_addr;
|
||||
image->arch.elf_headers_sz = elf_sz;
|
||||
image->arch.elf_headers = kbuf.buffer;
|
||||
image->arch.elf_headers_sz = kbuf.bufsz;
|
||||
|
||||
ret = kexec_add_buffer(image, (char *)elf_addr, elf_sz, elf_sz,
|
||||
ELF_CORE_HEADER_ALIGN, 0, -1, 0,
|
||||
&image->arch.elf_load_addr);
|
||||
kbuf.memsz = kbuf.bufsz;
|
||||
kbuf.buf_align = ELF_CORE_HEADER_ALIGN;
|
||||
ret = kexec_add_buffer(&kbuf);
|
||||
if (ret) {
|
||||
vfree((void *)image->arch.elf_headers);
|
||||
return ret;
|
||||
}
|
||||
image->arch.elf_load_addr = kbuf.mem;
|
||||
pr_debug("Loaded ELF headers at 0x%lx bufsz=0x%lx memsz=0x%lx\n",
|
||||
image->arch.elf_load_addr, elf_sz, elf_sz);
|
||||
image->arch.elf_load_addr, kbuf.bufsz, kbuf.bufsz);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@@ -331,17 +331,17 @@ static void *bzImage64_load(struct kimage *image, char *kernel,
|
||||
|
||||
struct setup_header *header;
|
||||
int setup_sects, kern16_size, ret = 0;
|
||||
unsigned long setup_header_size, params_cmdline_sz, params_misc_sz;
|
||||
unsigned long setup_header_size, params_cmdline_sz;
|
||||
struct boot_params *params;
|
||||
unsigned long bootparam_load_addr, kernel_load_addr, initrd_load_addr;
|
||||
unsigned long purgatory_load_addr;
|
||||
unsigned long kernel_bufsz, kernel_memsz, kernel_align;
|
||||
char *kernel_buf;
|
||||
struct bzimage64_data *ldata;
|
||||
struct kexec_entry64_regs regs64;
|
||||
void *stack;
|
||||
unsigned int setup_hdr_offset = offsetof(struct boot_params, hdr);
|
||||
unsigned int efi_map_offset, efi_map_sz, efi_setup_data_offset;
|
||||
struct kexec_buf kbuf = { .image = image, .buf_max = ULONG_MAX,
|
||||
.top_down = true };
|
||||
|
||||
header = (struct setup_header *)(kernel + setup_hdr_offset);
|
||||
setup_sects = header->setup_sects;
|
||||
@@ -402,11 +402,11 @@ static void *bzImage64_load(struct kimage *image, char *kernel,
|
||||
params_cmdline_sz = sizeof(struct boot_params) + cmdline_len +
|
||||
MAX_ELFCOREHDR_STR_LEN;
|
||||
params_cmdline_sz = ALIGN(params_cmdline_sz, 16);
|
||||
params_misc_sz = params_cmdline_sz + efi_map_sz +
|
||||
kbuf.bufsz = params_cmdline_sz + efi_map_sz +
|
||||
sizeof(struct setup_data) +
|
||||
sizeof(struct efi_setup_data);
|
||||
|
||||
params = kzalloc(params_misc_sz, GFP_KERNEL);
|
||||
params = kzalloc(kbuf.bufsz, GFP_KERNEL);
|
||||
if (!params)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
efi_map_offset = params_cmdline_sz;
|
||||
@@ -418,37 +418,41 @@ static void *bzImage64_load(struct kimage *image, char *kernel,
|
||||
/* Is there a limit on setup header size? */
|
||||
memcpy(¶ms->hdr, (kernel + setup_hdr_offset), setup_header_size);
|
||||
|
||||
ret = kexec_add_buffer(image, (char *)params, params_misc_sz,
|
||||
params_misc_sz, 16, MIN_BOOTPARAM_ADDR,
|
||||
ULONG_MAX, 1, &bootparam_load_addr);
|
||||
kbuf.buffer = params;
|
||||
kbuf.memsz = kbuf.bufsz;
|
||||
kbuf.buf_align = 16;
|
||||
kbuf.buf_min = MIN_BOOTPARAM_ADDR;
|
||||
ret = kexec_add_buffer(&kbuf);
|
||||
if (ret)
|
||||
goto out_free_params;
|
||||
bootparam_load_addr = kbuf.mem;
|
||||
pr_debug("Loaded boot_param, command line and misc at 0x%lx bufsz=0x%lx memsz=0x%lx\n",
|
||||
bootparam_load_addr, params_misc_sz, params_misc_sz);
|
||||
bootparam_load_addr, kbuf.bufsz, kbuf.bufsz);
|
||||
|
||||
/* Load kernel */
|
||||
kernel_buf = kernel + kern16_size;
|
||||
kernel_bufsz = kernel_len - kern16_size;
|
||||
kernel_memsz = PAGE_ALIGN(header->init_size);
|
||||
kernel_align = header->kernel_alignment;
|
||||
|
||||
ret = kexec_add_buffer(image, kernel_buf,
|
||||
kernel_bufsz, kernel_memsz, kernel_align,
|
||||
MIN_KERNEL_LOAD_ADDR, ULONG_MAX, 1,
|
||||
&kernel_load_addr);
|
||||
kbuf.buffer = kernel + kern16_size;
|
||||
kbuf.bufsz = kernel_len - kern16_size;
|
||||
kbuf.memsz = PAGE_ALIGN(header->init_size);
|
||||
kbuf.buf_align = header->kernel_alignment;
|
||||
kbuf.buf_min = MIN_KERNEL_LOAD_ADDR;
|
||||
ret = kexec_add_buffer(&kbuf);
|
||||
if (ret)
|
||||
goto out_free_params;
|
||||
kernel_load_addr = kbuf.mem;
|
||||
|
||||
pr_debug("Loaded 64bit kernel at 0x%lx bufsz=0x%lx memsz=0x%lx\n",
|
||||
kernel_load_addr, kernel_memsz, kernel_memsz);
|
||||
kernel_load_addr, kbuf.bufsz, kbuf.memsz);
|
||||
|
||||
/* Load initrd high */
|
||||
if (initrd) {
|
||||
ret = kexec_add_buffer(image, initrd, initrd_len, initrd_len,
|
||||
PAGE_SIZE, MIN_INITRD_LOAD_ADDR,
|
||||
ULONG_MAX, 1, &initrd_load_addr);
|
||||
kbuf.buffer = initrd;
|
||||
kbuf.bufsz = kbuf.memsz = initrd_len;
|
||||
kbuf.buf_align = PAGE_SIZE;
|
||||
kbuf.buf_min = MIN_INITRD_LOAD_ADDR;
|
||||
ret = kexec_add_buffer(&kbuf);
|
||||
if (ret)
|
||||
goto out_free_params;
|
||||
initrd_load_addr = kbuf.mem;
|
||||
|
||||
pr_debug("Loaded initrd at 0x%lx bufsz=0x%lx memsz=0x%lx\n",
|
||||
initrd_load_addr, initrd_len, initrd_len);
|
||||
|
Reference in New Issue
Block a user