linux/arch/x86/kernel/crash.c
<<
>>
Prefs
   1/*
   2 * Architecture specific (i386/x86_64) functions for kexec based crash dumps.
   3 *
   4 * Created by: Hariprasad Nellitheertha (hari@in.ibm.com)
   5 *
   6 * Copyright (C) IBM Corporation, 2004. All rights reserved.
   7 * Copyright (C) Red Hat Inc., 2014. All rights reserved.
   8 * Authors:
   9 *      Vivek Goyal <vgoyal@redhat.com>
  10 *
  11 */
  12
  13#define pr_fmt(fmt)     "kexec: " fmt
  14
  15#include <linux/types.h>
  16#include <linux/kernel.h>
  17#include <linux/smp.h>
  18#include <linux/reboot.h>
  19#include <linux/kexec.h>
  20#include <linux/delay.h>
  21#include <linux/elf.h>
  22#include <linux/elfcore.h>
  23#include <linux/module.h>
  24#include <linux/slab.h>
  25#include <linux/vmalloc.h>
  26
  27#include <asm/processor.h>
  28#include <asm/hardirq.h>
  29#include <asm/nmi.h>
  30#include <asm/hw_irq.h>
  31#include <asm/apic.h>
  32#include <asm/io_apic.h>
  33#include <asm/hpet.h>
  34#include <linux/kdebug.h>
  35#include <asm/cpu.h>
  36#include <asm/reboot.h>
  37#include <asm/virtext.h>
  38#include <asm/intel_pt.h>
  39
  40/* Alignment required for elf header segment */
  41#define ELF_CORE_HEADER_ALIGN   4096
  42
  43/* This primarily represents number of split ranges due to exclusion */
  44#define CRASH_MAX_RANGES        16
  45
  46struct crash_mem_range {
  47        u64 start, end;
  48};
  49
  50struct crash_mem {
  51        unsigned int nr_ranges;
  52        struct crash_mem_range ranges[CRASH_MAX_RANGES];
  53};
  54
  55/* Misc data about ram ranges needed to prepare elf headers */
  56struct crash_elf_data {
  57        struct kimage *image;
  58        /*
  59         * Total number of ram ranges we have after various adjustments for
  60         * GART, crash reserved region etc.
  61         */
  62        unsigned int max_nr_ranges;
  63        unsigned long gart_start, gart_end;
  64
  65        /* Pointer to elf header */
  66        void *ehdr;
  67        /* Pointer to next phdr */
  68        void *bufp;
  69        struct crash_mem mem;
  70};
  71
  72/* Used while preparing memory map entries for second kernel */
  73struct crash_memmap_data {
  74        struct boot_params *params;
  75        /* Type of memory */
  76        unsigned int type;
  77};
  78
  79/*
  80 * This is used to VMCLEAR all VMCSs loaded on the
  81 * processor. And when loading kvm_intel module, the
  82 * callback function pointer will be assigned.
  83 *
  84 * protected by rcu.
  85 */
  86crash_vmclear_fn __rcu *crash_vmclear_loaded_vmcss = NULL;
  87EXPORT_SYMBOL_GPL(crash_vmclear_loaded_vmcss);
  88unsigned long crash_zero_bytes;
  89
  90static inline void cpu_crash_vmclear_loaded_vmcss(void)
  91{
  92        crash_vmclear_fn *do_vmclear_operation = NULL;
  93
  94        rcu_read_lock();
  95        do_vmclear_operation = rcu_dereference(crash_vmclear_loaded_vmcss);
  96        if (do_vmclear_operation)
  97                do_vmclear_operation();
  98        rcu_read_unlock();
  99}
 100
 101#if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)
 102
 103static void kdump_nmi_callback(int cpu, struct pt_regs *regs)
 104{
 105#ifdef CONFIG_X86_32
 106        struct pt_regs fixed_regs;
 107
 108        if (!user_mode(regs)) {
 109                crash_fixup_ss_esp(&fixed_regs, regs);
 110                regs = &fixed_regs;
 111        }
 112#endif
 113        crash_save_cpu(regs, cpu);
 114
 115        /*
 116         * VMCLEAR VMCSs loaded on all cpus if needed.
 117         */
 118        cpu_crash_vmclear_loaded_vmcss();
 119
 120        /* Disable VMX or SVM if needed.
 121         *
 122         * We need to disable virtualization on all CPUs.
 123         * Having VMX or SVM enabled on any CPU may break rebooting
 124         * after the kdump kernel has finished its task.
 125         */
 126        cpu_emergency_vmxoff();
 127        cpu_emergency_svm_disable();
 128
 129        /*
 130         * Disable Intel PT to stop its logging
 131         */
 132        cpu_emergency_stop_pt();
 133
 134        disable_local_APIC();
 135}
 136
 137static void kdump_nmi_shootdown_cpus(void)
 138{
 139        nmi_shootdown_cpus(kdump_nmi_callback);
 140
 141        disable_local_APIC();
 142}
 143
 144#else
 145static void kdump_nmi_shootdown_cpus(void)
 146{
 147        /* There are no cpus to shootdown */
 148}
 149#endif
 150
 151void native_machine_crash_shutdown(struct pt_regs *regs)
 152{
 153        /* This function is only called after the system
 154         * has panicked or is otherwise in a critical state.
 155         * The minimum amount of code to allow a kexec'd kernel
 156         * to run successfully needs to happen here.
 157         *
 158         * In practice this means shooting down the other cpus in
 159         * an SMP system.
 160         */
 161        /* The kernel is broken so disable interrupts */
 162        local_irq_disable();
 163
 164        kdump_nmi_shootdown_cpus();
 165
 166        /*
 167         * VMCLEAR VMCSs loaded on this cpu if needed.
 168         */
 169        cpu_crash_vmclear_loaded_vmcss();
 170
 171        /* Booting kdump kernel with VMX or SVM enabled won't work,
 172         * because (among other limitations) we can't disable paging
 173         * with the virt flags.
 174         */
 175        cpu_emergency_vmxoff();
 176        cpu_emergency_svm_disable();
 177
 178        /*
 179         * Disable Intel PT to stop its logging
 180         */
 181        cpu_emergency_stop_pt();
 182
 183#ifdef CONFIG_X86_IO_APIC
 184        /* Prevent crash_kexec() from deadlocking on ioapic_lock. */
 185        ioapic_zap_locks();
 186        disable_IO_APIC();
 187#endif
 188        lapic_shutdown();
 189#ifdef CONFIG_HPET_TIMER
 190        hpet_disable();
 191#endif
 192        crash_save_cpu(regs, safe_smp_processor_id());
 193}
 194
 195#ifdef CONFIG_KEXEC_FILE
 196static int get_nr_ram_ranges_callback(u64 start, u64 end, void *arg)
 197{
 198        unsigned int *nr_ranges = arg;
 199
 200        (*nr_ranges)++;
 201        return 0;
 202}
 203
 204static int get_gart_ranges_callback(u64 start, u64 end, void *arg)
 205{
 206        struct crash_elf_data *ced = arg;
 207
 208        ced->gart_start = start;
 209        ced->gart_end = end;
 210
 211        /* Not expecting more than 1 gart aperture */
 212        return 1;
 213}
 214
 215
 216/* Gather all the required information to prepare elf headers for ram regions */
 217static void fill_up_crash_elf_data(struct crash_elf_data *ced,
 218                                   struct kimage *image)
 219{
 220        unsigned int nr_ranges = 0;
 221
 222        ced->image = image;
 223
 224        walk_system_ram_res(0, -1, &nr_ranges,
 225                                get_nr_ram_ranges_callback);
 226
 227        ced->max_nr_ranges = nr_ranges;
 228
 229        /*
 230         * We don't create ELF headers for GART aperture as an attempt
 231         * to dump this memory in second kernel leads to hang/crash.
 232         * If gart aperture is present, one needs to exclude that region
 233         * and that could lead to need of extra phdr.
 234         */
 235        walk_iomem_res("GART", IORESOURCE_MEM, 0, -1,
 236                                ced, get_gart_ranges_callback);
 237
 238        /*
 239         * If we have gart region, excluding that could potentially split
 240         * a memory range, resulting in extra header. Account for  that.
 241         */
 242        if (ced->gart_end)
 243                ced->max_nr_ranges++;
 244
 245        /* Exclusion of crash region could split memory ranges */
 246        ced->max_nr_ranges++;
 247
 248        /* If crashk_low_res is not 0, another range split possible */
 249        if (crashk_low_res.end)
 250                ced->max_nr_ranges++;
 251}
 252
 253static int exclude_mem_range(struct crash_mem *mem,
 254                unsigned long long mstart, unsigned long long mend)
 255{
 256        int i, j;
 257        unsigned long long start, end;
 258        struct crash_mem_range temp_range = {0, 0};
 259
 260        for (i = 0; i < mem->nr_ranges; i++) {
 261                start = mem->ranges[i].start;
 262                end = mem->ranges[i].end;
 263
 264                if (mstart > end || mend < start)
 265                        continue;
 266
 267                /* Truncate any area outside of range */
 268                if (mstart < start)
 269                        mstart = start;
 270                if (mend > end)
 271                        mend = end;
 272
 273                /* Found completely overlapping range */
 274                if (mstart == start && mend == end) {
 275                        mem->ranges[i].start = 0;
 276                        mem->ranges[i].end = 0;
 277                        if (i < mem->nr_ranges - 1) {
 278                                /* Shift rest of the ranges to left */
 279                                for (j = i; j < mem->nr_ranges - 1; j++) {
 280                                        mem->ranges[j].start =
 281                                                mem->ranges[j+1].start;
 282                                        mem->ranges[j].end =
 283                                                        mem->ranges[j+1].end;
 284                                }
 285                        }
 286                        mem->nr_ranges--;
 287                        return 0;
 288                }
 289
 290                if (mstart > start && mend < end) {
 291                        /* Split original range */
 292                        mem->ranges[i].end = mstart - 1;
 293                        temp_range.start = mend + 1;
 294                        temp_range.end = end;
 295                } else if (mstart != start)
 296                        mem->ranges[i].end = mstart - 1;
 297                else
 298                        mem->ranges[i].start = mend + 1;
 299                break;
 300        }
 301
 302        /* If a split happend, add the split to array */
 303        if (!temp_range.end)
 304                return 0;
 305
 306        /* Split happened */
 307        if (i == CRASH_MAX_RANGES - 1) {
 308                pr_err("Too many crash ranges after split\n");
 309                return -ENOMEM;
 310        }
 311
 312        /* Location where new range should go */
 313        j = i + 1;
 314        if (j < mem->nr_ranges) {
 315                /* Move over all ranges one slot towards the end */
 316                for (i = mem->nr_ranges - 1; i >= j; i--)
 317                        mem->ranges[i + 1] = mem->ranges[i];
 318        }
 319
 320        mem->ranges[j].start = temp_range.start;
 321        mem->ranges[j].end = temp_range.end;
 322        mem->nr_ranges++;
 323        return 0;
 324}
 325
 326/*
 327 * Look for any unwanted ranges between mstart, mend and remove them. This
 328 * might lead to split and split ranges are put in ced->mem.ranges[] array
 329 */
 330static int elf_header_exclude_ranges(struct crash_elf_data *ced,
 331                unsigned long long mstart, unsigned long long mend)
 332{
 333        struct crash_mem *cmem = &ced->mem;
 334        int ret = 0;
 335
 336        memset(cmem->ranges, 0, sizeof(cmem->ranges));
 337
 338        cmem->ranges[0].start = mstart;
 339        cmem->ranges[0].end = mend;
 340        cmem->nr_ranges = 1;
 341
 342        /* Exclude crashkernel region */
 343        ret = exclude_mem_range(cmem, crashk_res.start, crashk_res.end);
 344        if (ret)
 345                return ret;
 346
 347        if (crashk_low_res.end) {
 348                ret = exclude_mem_range(cmem, crashk_low_res.start, crashk_low_res.end);
 349                if (ret)
 350                        return ret;
 351        }
 352
 353        /* Exclude GART region */
 354        if (ced->gart_end) {
 355                ret = exclude_mem_range(cmem, ced->gart_start, ced->gart_end);
 356                if (ret)
 357                        return ret;
 358        }
 359
 360        return ret;
 361}
 362
 363static int prepare_elf64_ram_headers_callback(u64 start, u64 end, void *arg)
 364{
 365        struct crash_elf_data *ced = arg;
 366        Elf64_Ehdr *ehdr;
 367        Elf64_Phdr *phdr;
 368        unsigned long mstart, mend;
 369        struct kimage *image = ced->image;
 370        struct crash_mem *cmem;
 371        int ret, i;
 372
 373        ehdr = ced->ehdr;
 374
 375        /* Exclude unwanted mem ranges */
 376        ret = elf_header_exclude_ranges(ced, start, end);
 377        if (ret)
 378                return ret;
 379
 380        /* Go through all the ranges in ced->mem.ranges[] and prepare phdr */
 381        cmem = &ced->mem;
 382
 383        for (i = 0; i < cmem->nr_ranges; i++) {
 384                mstart = cmem->ranges[i].start;
 385                mend = cmem->ranges[i].end;
 386
 387                phdr = ced->bufp;
 388                ced->bufp += sizeof(Elf64_Phdr);
 389
 390                phdr->p_type = PT_LOAD;
 391                phdr->p_flags = PF_R|PF_W|PF_X;
 392                phdr->p_offset  = mstart;
 393
 394                /*
 395                 * If a range matches backup region, adjust offset to backup
 396                 * segment.
 397                 */
 398                if (mstart == image->arch.backup_src_start &&
 399                    (mend - mstart + 1) == image->arch.backup_src_sz)
 400                        phdr->p_offset = image->arch.backup_load_addr;
 401
 402                phdr->p_paddr = mstart;
 403                phdr->p_vaddr = (unsigned long long) __va(mstart);
 404                phdr->p_filesz = phdr->p_memsz = mend - mstart + 1;
 405                phdr->p_align = 0;
 406                ehdr->e_phnum++;
 407                pr_debug("Crash PT_LOAD elf header. phdr=%p vaddr=0x%llx, paddr=0x%llx, sz=0x%llx e_phnum=%d p_offset=0x%llx\n",
 408                        phdr, phdr->p_vaddr, phdr->p_paddr, phdr->p_filesz,
 409                        ehdr->e_phnum, phdr->p_offset);
 410        }
 411
 412        return ret;
 413}
 414
 415static int prepare_elf64_headers(struct crash_elf_data *ced,
 416                void **addr, unsigned long *sz)
 417{
 418        Elf64_Ehdr *ehdr;
 419        Elf64_Phdr *phdr;
 420        unsigned long nr_cpus = num_possible_cpus(), nr_phdr, elf_sz;
 421        unsigned char *buf, *bufp;
 422        unsigned int cpu;
 423        unsigned long long notes_addr;
 424        int ret;
 425
 426        /* extra phdr for vmcoreinfo elf note */
 427        nr_phdr = nr_cpus + 1;
 428        nr_phdr += ced->max_nr_ranges;
 429
 430        /*
 431         * kexec-tools creates an extra PT_LOAD phdr for kernel text mapping
 432         * area on x86_64 (ffffffff80000000 - ffffffffa0000000).
 433         * I think this is required by tools like gdb. So same physical
 434         * memory will be mapped in two elf headers. One will contain kernel
 435         * text virtual addresses and other will have __va(physical) addresses.
 436         */
 437
 438        nr_phdr++;
 439        elf_sz = sizeof(Elf64_Ehdr) + nr_phdr * sizeof(Elf64_Phdr);
 440        elf_sz = ALIGN(elf_sz, ELF_CORE_HEADER_ALIGN);
 441
 442        buf = vzalloc(elf_sz);
 443        if (!buf)
 444                return -ENOMEM;
 445
 446        bufp = buf;
 447        ehdr = (Elf64_Ehdr *)bufp;
 448        bufp += sizeof(Elf64_Ehdr);
 449        memcpy(ehdr->e_ident, ELFMAG, SELFMAG);
 450        ehdr->e_ident[EI_CLASS] = ELFCLASS64;
 451        ehdr->e_ident[EI_DATA] = ELFDATA2LSB;
 452        ehdr->e_ident[EI_VERSION] = EV_CURRENT;
 453        ehdr->e_ident[EI_OSABI] = ELF_OSABI;
 454        memset(ehdr->e_ident + EI_PAD, 0, EI_NIDENT - EI_PAD);
 455        ehdr->e_type = ET_CORE;
 456        ehdr->e_machine = ELF_ARCH;
 457        ehdr->e_version = EV_CURRENT;
 458        ehdr->e_phoff = sizeof(Elf64_Ehdr);
 459        ehdr->e_ehsize = sizeof(Elf64_Ehdr);
 460        ehdr->e_phentsize = sizeof(Elf64_Phdr);
 461
 462        /* Prepare one phdr of type PT_NOTE for each present cpu */
 463        for_each_present_cpu(cpu) {
 464                phdr = (Elf64_Phdr *)bufp;
 465                bufp += sizeof(Elf64_Phdr);
 466                phdr->p_type = PT_NOTE;
 467                notes_addr = per_cpu_ptr_to_phys(per_cpu_ptr(crash_notes, cpu));
 468                phdr->p_offset = phdr->p_paddr = notes_addr;
 469                phdr->p_filesz = phdr->p_memsz = sizeof(note_buf_t);
 470                (ehdr->e_phnum)++;
 471        }
 472
 473        /* Prepare one PT_NOTE header for vmcoreinfo */
 474        phdr = (Elf64_Phdr *)bufp;
 475        bufp += sizeof(Elf64_Phdr);
 476        phdr->p_type = PT_NOTE;
 477        phdr->p_offset = phdr->p_paddr = paddr_vmcoreinfo_note();
 478        phdr->p_filesz = phdr->p_memsz = sizeof(vmcoreinfo_note);
 479        (ehdr->e_phnum)++;
 480
 481#ifdef CONFIG_X86_64
 482        /* Prepare PT_LOAD type program header for kernel text region */
 483        phdr = (Elf64_Phdr *)bufp;
 484        bufp += sizeof(Elf64_Phdr);
 485        phdr->p_type = PT_LOAD;
 486        phdr->p_flags = PF_R|PF_W|PF_X;
 487        phdr->p_vaddr = (Elf64_Addr)_text;
 488        phdr->p_filesz = phdr->p_memsz = _end - _text;
 489        phdr->p_offset = phdr->p_paddr = __pa_symbol(_text);
 490        (ehdr->e_phnum)++;
 491#endif
 492
 493        /* Prepare PT_LOAD headers for system ram chunks. */
 494        ced->ehdr = ehdr;
 495        ced->bufp = bufp;
 496        ret = walk_system_ram_res(0, -1, ced,
 497                        prepare_elf64_ram_headers_callback);
 498        if (ret < 0)
 499                return ret;
 500
 501        *addr = buf;
 502        *sz = elf_sz;
 503        return 0;
 504}
 505
 506/* Prepare elf headers. Return addr and size */
 507static int prepare_elf_headers(struct kimage *image, void **addr,
 508                                        unsigned long *sz)
 509{
 510        struct crash_elf_data *ced;
 511        int ret;
 512
 513        ced = kzalloc(sizeof(*ced), GFP_KERNEL);
 514        if (!ced)
 515                return -ENOMEM;
 516
 517        fill_up_crash_elf_data(ced, image);
 518
 519        /* By default prepare 64bit headers */
 520        ret =  prepare_elf64_headers(ced, addr, sz);
 521        kfree(ced);
 522        return ret;
 523}
 524
 525static int add_e820_entry(struct boot_params *params, struct e820entry *entry)
 526{
 527        unsigned int nr_e820_entries;
 528
 529        nr_e820_entries = params->e820_entries;
 530        if (nr_e820_entries >= E820MAX)
 531                return 1;
 532
 533        memcpy(&params->e820_map[nr_e820_entries], entry,
 534                        sizeof(struct e820entry));
 535        params->e820_entries++;
 536        return 0;
 537}
 538
 539static int memmap_entry_callback(u64 start, u64 end, void *arg)
 540{
 541        struct crash_memmap_data *cmd = arg;
 542        struct boot_params *params = cmd->params;
 543        struct e820entry ei;
 544
 545        ei.addr = start;
 546        ei.size = end - start + 1;
 547        ei.type = cmd->type;
 548        add_e820_entry(params, &ei);
 549
 550        return 0;
 551}
 552
 553static int memmap_exclude_ranges(struct kimage *image, struct crash_mem *cmem,
 554                                 unsigned long long mstart,
 555                                 unsigned long long mend)
 556{
 557        unsigned long start, end;
 558        int ret = 0;
 559
 560        cmem->ranges[0].start = mstart;
 561        cmem->ranges[0].end = mend;
 562        cmem->nr_ranges = 1;
 563
 564        /* Exclude Backup region */
 565        start = image->arch.backup_load_addr;
 566        end = start + image->arch.backup_src_sz - 1;
 567        ret = exclude_mem_range(cmem, start, end);
 568        if (ret)
 569                return ret;
 570
 571        /* Exclude elf header region */
 572        start = image->arch.elf_load_addr;
 573        end = start + image->arch.elf_headers_sz - 1;
 574        return exclude_mem_range(cmem, start, end);
 575}
 576
 577/* Prepare memory map for crash dump kernel */
 578int crash_setup_memmap_entries(struct kimage *image, struct boot_params *params)
 579{
 580        int i, ret = 0;
 581        unsigned long flags;
 582        struct e820entry ei;
 583        struct crash_memmap_data cmd;
 584        struct crash_mem *cmem;
 585
 586        cmem = vzalloc(sizeof(struct crash_mem));
 587        if (!cmem)
 588                return -ENOMEM;
 589
 590        memset(&cmd, 0, sizeof(struct crash_memmap_data));
 591        cmd.params = params;
 592
 593        /* Add first 640K segment */
 594        ei.addr = image->arch.backup_src_start;
 595        ei.size = image->arch.backup_src_sz;
 596        ei.type = E820_RAM;
 597        add_e820_entry(params, &ei);
 598
 599        /* Add ACPI tables */
 600        cmd.type = E820_ACPI;
 601        flags = IORESOURCE_MEM | IORESOURCE_BUSY;
 602        walk_iomem_res("ACPI Tables", flags, 0, -1, &cmd,
 603                       memmap_entry_callback);
 604
 605        /* Add ACPI Non-volatile Storage */
 606        cmd.type = E820_NVS;
 607        walk_iomem_res("ACPI Non-volatile Storage", flags, 0, -1, &cmd,
 608                        memmap_entry_callback);
 609
 610        /* Add crashk_low_res region */
 611        if (crashk_low_res.end) {
 612                ei.addr = crashk_low_res.start;
 613                ei.size = crashk_low_res.end - crashk_low_res.start + 1;
 614                ei.type = E820_RAM;
 615                add_e820_entry(params, &ei);
 616        }
 617
 618        /* Exclude some ranges from crashk_res and add rest to memmap */
 619        ret = memmap_exclude_ranges(image, cmem, crashk_res.start,
 620                                                crashk_res.end);
 621        if (ret)
 622                goto out;
 623
 624        for (i = 0; i < cmem->nr_ranges; i++) {
 625                ei.size = cmem->ranges[i].end - cmem->ranges[i].start + 1;
 626
 627                /* If entry is less than a page, skip it */
 628                if (ei.size < PAGE_SIZE)
 629                        continue;
 630                ei.addr = cmem->ranges[i].start;
 631                ei.type = E820_RAM;
 632                add_e820_entry(params, &ei);
 633        }
 634
 635out:
 636        vfree(cmem);
 637        return ret;
 638}
 639
 640static int determine_backup_region(u64 start, u64 end, void *arg)
 641{
 642        struct kimage *image = arg;
 643
 644        image->arch.backup_src_start = start;
 645        image->arch.backup_src_sz = end - start + 1;
 646
 647        /* Expecting only one range for backup region */
 648        return 1;
 649}
 650
 651int crash_load_segments(struct kimage *image)
 652{
 653        unsigned long src_start, src_sz, elf_sz;
 654        void *elf_addr;
 655        int ret;
 656
 657        /*
 658         * Determine and load a segment for backup area. First 640K RAM
 659         * region is backup source
 660         */
 661
 662        ret = walk_system_ram_res(KEXEC_BACKUP_SRC_START, KEXEC_BACKUP_SRC_END,
 663                                image, determine_backup_region);
 664
 665        /* Zero or postive return values are ok */
 666        if (ret < 0)
 667                return ret;
 668
 669        src_start = image->arch.backup_src_start;
 670        src_sz = image->arch.backup_src_sz;
 671
 672        /* Add backup segment. */
 673        if (src_sz) {
 674                /*
 675                 * Ideally there is no source for backup segment. This is
 676                 * copied in purgatory after crash. Just add a zero filled
 677                 * segment for now to make sure checksum logic works fine.
 678                 */
 679                ret = kexec_add_buffer(image, (char *)&crash_zero_bytes,
 680                                       sizeof(crash_zero_bytes), src_sz,
 681                                       PAGE_SIZE, 0, -1, 0,
 682                                       &image->arch.backup_load_addr);
 683                if (ret)
 684                        return ret;
 685                pr_debug("Loaded backup region at 0x%lx backup_start=0x%lx memsz=0x%lx\n",
 686                         image->arch.backup_load_addr, src_start, src_sz);
 687        }
 688
 689        /* Prepare elf headers and add a segment */
 690        ret = prepare_elf_headers(image, &elf_addr, &elf_sz);
 691        if (ret)
 692                return ret;
 693
 694        image->arch.elf_headers = elf_addr;
 695        image->arch.elf_headers_sz = elf_sz;
 696
 697        ret = kexec_add_buffer(image, (char *)elf_addr, elf_sz, elf_sz,
 698                        ELF_CORE_HEADER_ALIGN, 0, -1, 0,
 699                        &image->arch.elf_load_addr);
 700        if (ret) {
 701                vfree((void *)image->arch.elf_headers);
 702                return ret;
 703        }
 704        pr_debug("Loaded ELF headers at 0x%lx bufsz=0x%lx memsz=0x%lx\n",
 705                 image->arch.elf_load_addr, elf_sz, elf_sz);
 706
 707        return ret;
 708}
 709#endif /* CONFIG_KEXEC_FILE */
 710