]> Git Repo - J-linux.git/blob - arch/powerpc/kernel/fadump.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / arch / powerpc / kernel / fadump.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Firmware Assisted dump: A robust mechanism to get reliable kernel crash
4  * dump with assistance from firmware. This approach does not use kexec,
5  * instead firmware assists in booting the kdump kernel while preserving
6  * memory contents. The most of the code implementation has been adapted
7  * from phyp assisted dump implementation written by Linas Vepstas and
8  * Manish Ahuja
9  *
10  * Copyright 2011 IBM Corporation
11  * Author: Mahesh Salgaonkar <[email protected]>
12  */
13
14 #undef DEBUG
15 #define pr_fmt(fmt) "fadump: " fmt
16
17 #include <linux/string.h>
18 #include <linux/memblock.h>
19 #include <linux/delay.h>
20 #include <linux/seq_file.h>
21 #include <linux/crash_dump.h>
22 #include <linux/kobject.h>
23 #include <linux/sysfs.h>
24 #include <linux/slab.h>
25 #include <linux/cma.h>
26 #include <linux/hugetlb.h>
27 #include <linux/debugfs.h>
28 #include <linux/of.h>
29 #include <linux/of_fdt.h>
30
31 #include <asm/page.h>
32 #include <asm/fadump.h>
33 #include <asm/fadump-internal.h>
34 #include <asm/setup.h>
35 #include <asm/interrupt.h>
36
37 /*
38  * The CPU who acquired the lock to trigger the fadump crash should
39  * wait for other CPUs to enter.
40  *
41  * The timeout is in milliseconds.
42  */
43 #define CRASH_TIMEOUT           500
44
45 static struct fw_dump fw_dump;
46
47 static void __init fadump_reserve_crash_area(u64 base);
48
49 #ifndef CONFIG_PRESERVE_FA_DUMP
50
51 static struct kobject *fadump_kobj;
52
53 static atomic_t cpus_in_fadump;
54 static DEFINE_MUTEX(fadump_mutex);
55
56 #define RESERVED_RNGS_SZ        16384 /* 16K - 128 entries */
57 #define RESERVED_RNGS_CNT       (RESERVED_RNGS_SZ / \
58                                  sizeof(struct fadump_memory_range))
59 static struct fadump_memory_range rngs[RESERVED_RNGS_CNT];
60 static struct fadump_mrange_info
61 reserved_mrange_info = { "reserved", rngs, RESERVED_RNGS_SZ, 0, RESERVED_RNGS_CNT, true };
62
63 static void __init early_init_dt_scan_reserved_ranges(unsigned long node);
64
65 #ifdef CONFIG_CMA
66 static struct cma *fadump_cma;
67
68 /*
69  * fadump_cma_init() - Initialize CMA area from a fadump reserved memory
70  *
71  * This function initializes CMA area from fadump reserved memory.
72  * The total size of fadump reserved memory covers for boot memory size
73  * + cpu data size + hpte size and metadata.
74  * Initialize only the area equivalent to boot memory size for CMA use.
75  * The remaining portion of fadump reserved memory will be not given
76  * to CMA and pages for those will stay reserved. boot memory size is
77  * aligned per CMA requirement to satisy cma_init_reserved_mem() call.
78  * But for some reason even if it fails we still have the memory reservation
79  * with us and we can still continue doing fadump.
80  */
81 void __init fadump_cma_init(void)
82 {
83         unsigned long long base, size, end;
84         int rc;
85
86         if (!fw_dump.fadump_supported || !fw_dump.fadump_enabled ||
87                         fw_dump.dump_active)
88                 return;
89         /*
90          * Do not use CMA if user has provided fadump=nocma kernel parameter.
91          */
92         if (fw_dump.nocma || !fw_dump.boot_memory_size)
93                 return;
94
95         /*
96          * [base, end) should be reserved during early init in
97          * fadump_reserve_mem(). No need to check this here as
98          * cma_init_reserved_mem() already checks for overlap.
99          * Here we give the aligned chunk of this reserved memory to CMA.
100          */
101         base = fw_dump.reserve_dump_area_start;
102         size = fw_dump.boot_memory_size;
103         end = base + size;
104
105         base = ALIGN(base, CMA_MIN_ALIGNMENT_BYTES);
106         end = ALIGN_DOWN(end, CMA_MIN_ALIGNMENT_BYTES);
107         size = end - base;
108
109         if (end <= base) {
110                 pr_warn("%s: Too less memory to give to CMA\n", __func__);
111                 return;
112         }
113
114         rc = cma_init_reserved_mem(base, size, 0, "fadump_cma", &fadump_cma);
115         if (rc) {
116                 pr_err("Failed to init cma area for firmware-assisted dump,%d\n", rc);
117                 /*
118                  * Though the CMA init has failed we still have memory
119                  * reservation with us. The reserved memory will be
120                  * blocked from production system usage.  Hence return 1,
121                  * so that we can continue with fadump.
122                  */
123                 return;
124         }
125
126         /*
127          *  If CMA activation fails, keep the pages reserved, instead of
128          *  exposing them to buddy allocator. Same as 'fadump=nocma' case.
129          */
130         cma_reserve_pages_on_error(fadump_cma);
131
132         /*
133          * So we now have successfully initialized cma area for fadump.
134          */
135         pr_info("Initialized [0x%llx, %luMB] cma area from [0x%lx, %luMB] "
136                 "bytes of memory reserved for firmware-assisted dump\n",
137                 cma_get_base(fadump_cma), cma_get_size(fadump_cma) >> 20,
138                 fw_dump.reserve_dump_area_start,
139                 fw_dump.boot_memory_size >> 20);
140         return;
141 }
142 #endif /* CONFIG_CMA */
143
144 /*
145  * Additional parameters meant for capture kernel are placed in a dedicated area.
146  * If this is capture kernel boot, append these parameters to bootargs.
147  */
148 void __init fadump_append_bootargs(void)
149 {
150         char *append_args;
151         size_t len;
152
153         if (!fw_dump.dump_active || !fw_dump.param_area_supported || !fw_dump.param_area)
154                 return;
155
156         if (fw_dump.param_area < fw_dump.boot_mem_top) {
157                 if (memblock_reserve(fw_dump.param_area, COMMAND_LINE_SIZE)) {
158                         pr_warn("WARNING: Can't use additional parameters area!\n");
159                         fw_dump.param_area = 0;
160                         return;
161                 }
162         }
163
164         append_args = (char *)fw_dump.param_area;
165         len = strlen(boot_command_line);
166
167         /*
168          * Too late to fail even if cmdline size exceeds. Truncate additional parameters
169          * to cmdline size and proceed anyway.
170          */
171         if (len + strlen(append_args) >= COMMAND_LINE_SIZE - 1)
172                 pr_warn("WARNING: Appending parameters exceeds cmdline size. Truncating!\n");
173
174         pr_debug("Cmdline: %s\n", boot_command_line);
175         snprintf(boot_command_line + len, COMMAND_LINE_SIZE - len, " %s", append_args);
176         pr_info("Updated cmdline: %s\n", boot_command_line);
177 }
178
179 /* Scan the Firmware Assisted dump configuration details. */
180 int __init early_init_dt_scan_fw_dump(unsigned long node, const char *uname,
181                                       int depth, void *data)
182 {
183         if (depth == 0) {
184                 early_init_dt_scan_reserved_ranges(node);
185                 return 0;
186         }
187
188         if (depth != 1)
189                 return 0;
190
191         if (strcmp(uname, "rtas") == 0) {
192                 rtas_fadump_dt_scan(&fw_dump, node);
193                 return 1;
194         }
195
196         if (strcmp(uname, "ibm,opal") == 0) {
197                 opal_fadump_dt_scan(&fw_dump, node);
198                 return 1;
199         }
200
201         return 0;
202 }
203
204 /*
205  * If fadump is registered, check if the memory provided
206  * falls within boot memory area and reserved memory area.
207  */
208 int is_fadump_memory_area(u64 addr, unsigned long size)
209 {
210         u64 d_start, d_end;
211
212         if (!fw_dump.dump_registered)
213                 return 0;
214
215         if (!size)
216                 return 0;
217
218         d_start = fw_dump.reserve_dump_area_start;
219         d_end = d_start + fw_dump.reserve_dump_area_size;
220         if (((addr + size) > d_start) && (addr <= d_end))
221                 return 1;
222
223         return (addr <= fw_dump.boot_mem_top);
224 }
225
226 int should_fadump_crash(void)
227 {
228         if (!fw_dump.dump_registered || !fw_dump.fadumphdr_addr)
229                 return 0;
230         return 1;
231 }
232
233 int is_fadump_active(void)
234 {
235         return fw_dump.dump_active;
236 }
237
238 /*
239  * Returns true, if there are no holes in memory area between d_start to d_end,
240  * false otherwise.
241  */
242 static bool is_fadump_mem_area_contiguous(u64 d_start, u64 d_end)
243 {
244         phys_addr_t reg_start, reg_end;
245         bool ret = false;
246         u64 i, start, end;
247
248         for_each_mem_range(i, &reg_start, &reg_end) {
249                 start = max_t(u64, d_start, reg_start);
250                 end = min_t(u64, d_end, reg_end);
251                 if (d_start < end) {
252                         /* Memory hole from d_start to start */
253                         if (start > d_start)
254                                 break;
255
256                         if (end == d_end) {
257                                 ret = true;
258                                 break;
259                         }
260
261                         d_start = end + 1;
262                 }
263         }
264
265         return ret;
266 }
267
268 /*
269  * Returns true, if there are no holes in reserved memory area,
270  * false otherwise.
271  */
272 bool is_fadump_reserved_mem_contiguous(void)
273 {
274         u64 d_start, d_end;
275
276         d_start = fw_dump.reserve_dump_area_start;
277         d_end   = d_start + fw_dump.reserve_dump_area_size;
278         return is_fadump_mem_area_contiguous(d_start, d_end);
279 }
280
281 /* Print firmware assisted dump configurations for debugging purpose. */
282 static void __init fadump_show_config(void)
283 {
284         int i;
285
286         pr_debug("Support for firmware-assisted dump (fadump): %s\n",
287                         (fw_dump.fadump_supported ? "present" : "no support"));
288
289         if (!fw_dump.fadump_supported)
290                 return;
291
292         pr_debug("Fadump enabled    : %s\n",
293                                 (fw_dump.fadump_enabled ? "yes" : "no"));
294         pr_debug("Dump Active       : %s\n",
295                                 (fw_dump.dump_active ? "yes" : "no"));
296         pr_debug("Dump section sizes:\n");
297         pr_debug("    CPU state data size: %lx\n", fw_dump.cpu_state_data_size);
298         pr_debug("    HPTE region size   : %lx\n", fw_dump.hpte_region_size);
299         pr_debug("    Boot memory size   : %lx\n", fw_dump.boot_memory_size);
300         pr_debug("    Boot memory top    : %llx\n", fw_dump.boot_mem_top);
301         pr_debug("Boot memory regions cnt: %llx\n", fw_dump.boot_mem_regs_cnt);
302         for (i = 0; i < fw_dump.boot_mem_regs_cnt; i++) {
303                 pr_debug("[%03d] base = %llx, size = %llx\n", i,
304                          fw_dump.boot_mem_addr[i], fw_dump.boot_mem_sz[i]);
305         }
306 }
307
308 /**
309  * fadump_calculate_reserve_size(): reserve variable boot area 5% of System RAM
310  *
311  * Function to find the largest memory size we need to reserve during early
312  * boot process. This will be the size of the memory that is required for a
313  * kernel to boot successfully.
314  *
315  * This function has been taken from phyp-assisted dump feature implementation.
316  *
317  * returns larger of 256MB or 5% rounded down to multiples of 256MB.
318  *
319  * TODO: Come up with better approach to find out more accurate memory size
320  * that is required for a kernel to boot successfully.
321  *
322  */
323 static __init u64 fadump_calculate_reserve_size(void)
324 {
325         u64 base, size, bootmem_min;
326         int ret;
327
328         if (fw_dump.reserve_bootvar)
329                 pr_warn("'fadump_reserve_mem=' parameter is deprecated in favor of 'crashkernel=' parameter.\n");
330
331         /*
332          * Check if the size is specified through crashkernel= cmdline
333          * option. If yes, then use that but ignore base as fadump reserves
334          * memory at a predefined offset.
335          */
336         ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
337                                 &size, &base, NULL, NULL);
338         if (ret == 0 && size > 0) {
339                 unsigned long max_size;
340
341                 if (fw_dump.reserve_bootvar)
342                         pr_info("Using 'crashkernel=' parameter for memory reservation.\n");
343
344                 fw_dump.reserve_bootvar = (unsigned long)size;
345
346                 /*
347                  * Adjust if the boot memory size specified is above
348                  * the upper limit.
349                  */
350                 max_size = memblock_phys_mem_size() / MAX_BOOT_MEM_RATIO;
351                 if (fw_dump.reserve_bootvar > max_size) {
352                         fw_dump.reserve_bootvar = max_size;
353                         pr_info("Adjusted boot memory size to %luMB\n",
354                                 (fw_dump.reserve_bootvar >> 20));
355                 }
356
357                 return fw_dump.reserve_bootvar;
358         } else if (fw_dump.reserve_bootvar) {
359                 /*
360                  * 'fadump_reserve_mem=' is being used to reserve memory
361                  * for firmware-assisted dump.
362                  */
363                 return fw_dump.reserve_bootvar;
364         }
365
366         /* divide by 20 to get 5% of value */
367         size = memblock_phys_mem_size() / 20;
368
369         /* round it down in multiples of 256 */
370         size = size & ~0x0FFFFFFFUL;
371
372         /* Truncate to memory_limit. We don't want to over reserve the memory.*/
373         if (memory_limit && size > memory_limit)
374                 size = memory_limit;
375
376         bootmem_min = fw_dump.ops->fadump_get_bootmem_min();
377         return (size > bootmem_min ? size : bootmem_min);
378 }
379
380 /*
381  * Calculate the total memory size required to be reserved for
382  * firmware-assisted dump registration.
383  */
384 static unsigned long __init get_fadump_area_size(void)
385 {
386         unsigned long size = 0;
387
388         size += fw_dump.cpu_state_data_size;
389         size += fw_dump.hpte_region_size;
390         /*
391          * Account for pagesize alignment of boot memory area destination address.
392          * This faciliates in mmap reading of first kernel's memory.
393          */
394         size = PAGE_ALIGN(size);
395         size += fw_dump.boot_memory_size;
396         size += sizeof(struct fadump_crash_info_header);
397
398         /* This is to hold kernel metadata on platforms that support it */
399         size += (fw_dump.ops->fadump_get_metadata_size ?
400                  fw_dump.ops->fadump_get_metadata_size() : 0);
401         return size;
402 }
403
404 static int __init add_boot_mem_region(unsigned long rstart,
405                                       unsigned long rsize)
406 {
407         int max_boot_mem_rgns = fw_dump.ops->fadump_max_boot_mem_rgns();
408         int i = fw_dump.boot_mem_regs_cnt++;
409
410         if (fw_dump.boot_mem_regs_cnt > max_boot_mem_rgns) {
411                 fw_dump.boot_mem_regs_cnt = max_boot_mem_rgns;
412                 return 0;
413         }
414
415         pr_debug("Added boot memory range[%d] [%#016lx-%#016lx)\n",
416                  i, rstart, (rstart + rsize));
417         fw_dump.boot_mem_addr[i] = rstart;
418         fw_dump.boot_mem_sz[i] = rsize;
419         return 1;
420 }
421
422 /*
423  * Firmware usually has a hard limit on the data it can copy per region.
424  * Honour that by splitting a memory range into multiple regions.
425  */
426 static int __init add_boot_mem_regions(unsigned long mstart,
427                                        unsigned long msize)
428 {
429         unsigned long rstart, rsize, max_size;
430         int ret = 1;
431
432         rstart = mstart;
433         max_size = fw_dump.max_copy_size ? fw_dump.max_copy_size : msize;
434         while (msize) {
435                 if (msize > max_size)
436                         rsize = max_size;
437                 else
438                         rsize = msize;
439
440                 ret = add_boot_mem_region(rstart, rsize);
441                 if (!ret)
442                         break;
443
444                 msize -= rsize;
445                 rstart += rsize;
446         }
447
448         return ret;
449 }
450
451 static int __init fadump_get_boot_mem_regions(void)
452 {
453         unsigned long size, cur_size, hole_size, last_end;
454         unsigned long mem_size = fw_dump.boot_memory_size;
455         phys_addr_t reg_start, reg_end;
456         int ret = 1;
457         u64 i;
458
459         fw_dump.boot_mem_regs_cnt = 0;
460
461         last_end = 0;
462         hole_size = 0;
463         cur_size = 0;
464         for_each_mem_range(i, &reg_start, &reg_end) {
465                 size = reg_end - reg_start;
466                 hole_size += (reg_start - last_end);
467
468                 if ((cur_size + size) >= mem_size) {
469                         size = (mem_size - cur_size);
470                         ret = add_boot_mem_regions(reg_start, size);
471                         break;
472                 }
473
474                 mem_size -= size;
475                 cur_size += size;
476                 ret = add_boot_mem_regions(reg_start, size);
477                 if (!ret)
478                         break;
479
480                 last_end = reg_end;
481         }
482         fw_dump.boot_mem_top = PAGE_ALIGN(fw_dump.boot_memory_size + hole_size);
483
484         return ret;
485 }
486
487 /*
488  * Returns true, if the given range overlaps with reserved memory ranges
489  * starting at idx. Also, updates idx to index of overlapping memory range
490  * with the given memory range.
491  * False, otherwise.
492  */
493 static bool __init overlaps_reserved_ranges(u64 base, u64 end, int *idx)
494 {
495         bool ret = false;
496         int i;
497
498         for (i = *idx; i < reserved_mrange_info.mem_range_cnt; i++) {
499                 u64 rbase = reserved_mrange_info.mem_ranges[i].base;
500                 u64 rend = rbase + reserved_mrange_info.mem_ranges[i].size;
501
502                 if (end <= rbase)
503                         break;
504
505                 if ((end > rbase) &&  (base < rend)) {
506                         *idx = i;
507                         ret = true;
508                         break;
509                 }
510         }
511
512         return ret;
513 }
514
515 /*
516  * Locate a suitable memory area to reserve memory for FADump. While at it,
517  * lookup reserved-ranges & avoid overlap with them, as they are used by F/W.
518  */
519 static u64 __init fadump_locate_reserve_mem(u64 base, u64 size)
520 {
521         struct fadump_memory_range *mrngs;
522         phys_addr_t mstart, mend;
523         int idx = 0;
524         u64 i, ret = 0;
525
526         mrngs = reserved_mrange_info.mem_ranges;
527         for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE,
528                                 &mstart, &mend, NULL) {
529                 pr_debug("%llu) mstart: %llx, mend: %llx, base: %llx\n",
530                          i, mstart, mend, base);
531
532                 if (mstart > base)
533                         base = PAGE_ALIGN(mstart);
534
535                 while ((mend > base) && ((mend - base) >= size)) {
536                         if (!overlaps_reserved_ranges(base, base+size, &idx)) {
537                                 ret = base;
538                                 goto out;
539                         }
540
541                         base = mrngs[idx].base + mrngs[idx].size;
542                         base = PAGE_ALIGN(base);
543                 }
544         }
545
546 out:
547         return ret;
548 }
549
550 int __init fadump_reserve_mem(void)
551 {
552         u64 base, size, mem_boundary, bootmem_min;
553         int ret = 1;
554
555         if (!fw_dump.fadump_enabled)
556                 return 0;
557
558         if (!fw_dump.fadump_supported) {
559                 pr_info("Firmware-Assisted Dump is not supported on this hardware\n");
560                 goto error_out;
561         }
562
563         /*
564          * Initialize boot memory size
565          * If dump is active then we have already calculated the size during
566          * first kernel.
567          */
568         if (!fw_dump.dump_active) {
569                 fw_dump.boot_memory_size =
570                         PAGE_ALIGN(fadump_calculate_reserve_size());
571
572                 bootmem_min = fw_dump.ops->fadump_get_bootmem_min();
573                 if (fw_dump.boot_memory_size < bootmem_min) {
574                         pr_err("Can't enable fadump with boot memory size (0x%lx) less than 0x%llx\n",
575                                fw_dump.boot_memory_size, bootmem_min);
576                         goto error_out;
577                 }
578
579                 if (!fadump_get_boot_mem_regions()) {
580                         pr_err("Too many holes in boot memory area to enable fadump\n");
581                         goto error_out;
582                 }
583         }
584
585         if (memory_limit)
586                 mem_boundary = memory_limit;
587         else
588                 mem_boundary = memblock_end_of_DRAM();
589
590         base = fw_dump.boot_mem_top;
591         size = get_fadump_area_size();
592         fw_dump.reserve_dump_area_size = size;
593         if (fw_dump.dump_active) {
594                 pr_info("Firmware-assisted dump is active.\n");
595
596 #ifdef CONFIG_HUGETLB_PAGE
597                 /*
598                  * FADump capture kernel doesn't care much about hugepages.
599                  * In fact, handling hugepages in capture kernel is asking for
600                  * trouble. So, disable HugeTLB support when fadump is active.
601                  */
602                 hugetlb_disabled = true;
603 #endif
604                 /*
605                  * If last boot has crashed then reserve all the memory
606                  * above boot memory size so that we don't touch it until
607                  * dump is written to disk by userspace tool. This memory
608                  * can be released for general use by invalidating fadump.
609                  */
610                 fadump_reserve_crash_area(base);
611
612                 pr_debug("fadumphdr_addr = %#016lx\n", fw_dump.fadumphdr_addr);
613                 pr_debug("Reserve dump area start address: 0x%lx\n",
614                          fw_dump.reserve_dump_area_start);
615         } else {
616                 /*
617                  * Reserve memory at an offset closer to bottom of the RAM to
618                  * minimize the impact of memory hot-remove operation.
619                  */
620                 base = fadump_locate_reserve_mem(base, size);
621
622                 if (!base || (base + size > mem_boundary)) {
623                         pr_err("Failed to find memory chunk for reservation!\n");
624                         goto error_out;
625                 }
626                 fw_dump.reserve_dump_area_start = base;
627
628                 /*
629                  * Calculate the kernel metadata address and register it with
630                  * f/w if the platform supports.
631                  */
632                 if (fw_dump.ops->fadump_setup_metadata &&
633                     (fw_dump.ops->fadump_setup_metadata(&fw_dump) < 0))
634                         goto error_out;
635
636                 if (memblock_reserve(base, size)) {
637                         pr_err("Failed to reserve memory!\n");
638                         goto error_out;
639                 }
640
641                 pr_info("Reserved %lldMB of memory at %#016llx (System RAM: %lldMB)\n",
642                         (size >> 20), base, (memblock_phys_mem_size() >> 20));
643         }
644
645         return ret;
646 error_out:
647         fw_dump.fadump_enabled = 0;
648         fw_dump.reserve_dump_area_size = 0;
649         return 0;
650 }
651
652 /* Look for fadump= cmdline option. */
653 static int __init early_fadump_param(char *p)
654 {
655         if (!p)
656                 return 1;
657
658         if (strncmp(p, "on", 2) == 0)
659                 fw_dump.fadump_enabled = 1;
660         else if (strncmp(p, "off", 3) == 0)
661                 fw_dump.fadump_enabled = 0;
662         else if (strncmp(p, "nocma", 5) == 0) {
663                 fw_dump.fadump_enabled = 1;
664                 fw_dump.nocma = 1;
665         }
666
667         return 0;
668 }
669 early_param("fadump", early_fadump_param);
670
671 /*
672  * Look for fadump_reserve_mem= cmdline option
673  * TODO: Remove references to 'fadump_reserve_mem=' parameter,
674  *       the sooner 'crashkernel=' parameter is accustomed to.
675  */
676 static int __init early_fadump_reserve_mem(char *p)
677 {
678         if (p)
679                 fw_dump.reserve_bootvar = memparse(p, &p);
680         return 0;
681 }
682 early_param("fadump_reserve_mem", early_fadump_reserve_mem);
683
684 void crash_fadump(struct pt_regs *regs, const char *str)
685 {
686         unsigned int msecs;
687         struct fadump_crash_info_header *fdh = NULL;
688         int old_cpu, this_cpu;
689         /* Do not include first CPU */
690         unsigned int ncpus = num_online_cpus() - 1;
691
692         if (!should_fadump_crash())
693                 return;
694
695         /*
696          * old_cpu == -1 means this is the first CPU which has come here,
697          * go ahead and trigger fadump.
698          *
699          * old_cpu != -1 means some other CPU has already on its way
700          * to trigger fadump, just keep looping here.
701          */
702         this_cpu = smp_processor_id();
703         old_cpu = cmpxchg(&crashing_cpu, -1, this_cpu);
704
705         if (old_cpu != -1) {
706                 atomic_inc(&cpus_in_fadump);
707
708                 /*
709                  * We can't loop here indefinitely. Wait as long as fadump
710                  * is in force. If we race with fadump un-registration this
711                  * loop will break and then we go down to normal panic path
712                  * and reboot. If fadump is in force the first crashing
713                  * cpu will definitely trigger fadump.
714                  */
715                 while (fw_dump.dump_registered)
716                         cpu_relax();
717                 return;
718         }
719
720         fdh = __va(fw_dump.fadumphdr_addr);
721         fdh->crashing_cpu = crashing_cpu;
722         crash_save_vmcoreinfo();
723
724         if (regs)
725                 fdh->regs = *regs;
726         else
727                 ppc_save_regs(&fdh->regs);
728
729         fdh->cpu_mask = *cpu_online_mask;
730
731         /*
732          * If we came in via system reset, wait a while for the secondary
733          * CPUs to enter.
734          */
735         if (TRAP(&(fdh->regs)) == INTERRUPT_SYSTEM_RESET) {
736                 msecs = CRASH_TIMEOUT;
737                 while ((atomic_read(&cpus_in_fadump) < ncpus) && (--msecs > 0))
738                         mdelay(1);
739         }
740
741         fw_dump.ops->fadump_trigger(fdh, str);
742 }
743
744 u32 *__init fadump_regs_to_elf_notes(u32 *buf, struct pt_regs *regs)
745 {
746         struct elf_prstatus prstatus;
747
748         memset(&prstatus, 0, sizeof(prstatus));
749         /*
750          * FIXME: How do i get PID? Do I really need it?
751          * prstatus.pr_pid = ????
752          */
753         elf_core_copy_regs(&prstatus.pr_reg, regs);
754         buf = append_elf_note(buf, CRASH_CORE_NOTE_NAME, NT_PRSTATUS,
755                               &prstatus, sizeof(prstatus));
756         return buf;
757 }
758
759 void __init fadump_update_elfcore_header(char *bufp)
760 {
761         struct elf_phdr *phdr;
762
763         bufp += sizeof(struct elfhdr);
764
765         /* First note is a place holder for cpu notes info. */
766         phdr = (struct elf_phdr *)bufp;
767
768         if (phdr->p_type == PT_NOTE) {
769                 phdr->p_paddr   = __pa(fw_dump.cpu_notes_buf_vaddr);
770                 phdr->p_offset  = phdr->p_paddr;
771                 phdr->p_filesz  = fw_dump.cpu_notes_buf_size;
772                 phdr->p_memsz = fw_dump.cpu_notes_buf_size;
773         }
774         return;
775 }
776
777 static void *__init fadump_alloc_buffer(unsigned long size)
778 {
779         unsigned long count, i;
780         struct page *page;
781         void *vaddr;
782
783         vaddr = alloc_pages_exact(size, GFP_KERNEL | __GFP_ZERO);
784         if (!vaddr)
785                 return NULL;
786
787         count = PAGE_ALIGN(size) / PAGE_SIZE;
788         page = virt_to_page(vaddr);
789         for (i = 0; i < count; i++)
790                 mark_page_reserved(page + i);
791         return vaddr;
792 }
793
794 static void fadump_free_buffer(unsigned long vaddr, unsigned long size)
795 {
796         free_reserved_area((void *)vaddr, (void *)(vaddr + size), -1, NULL);
797 }
798
799 s32 __init fadump_setup_cpu_notes_buf(u32 num_cpus)
800 {
801         /* Allocate buffer to hold cpu crash notes. */
802         fw_dump.cpu_notes_buf_size = num_cpus * sizeof(note_buf_t);
803         fw_dump.cpu_notes_buf_size = PAGE_ALIGN(fw_dump.cpu_notes_buf_size);
804         fw_dump.cpu_notes_buf_vaddr =
805                 (unsigned long)fadump_alloc_buffer(fw_dump.cpu_notes_buf_size);
806         if (!fw_dump.cpu_notes_buf_vaddr) {
807                 pr_err("Failed to allocate %ld bytes for CPU notes buffer\n",
808                        fw_dump.cpu_notes_buf_size);
809                 return -ENOMEM;
810         }
811
812         pr_debug("Allocated buffer for cpu notes of size %ld at 0x%lx\n",
813                  fw_dump.cpu_notes_buf_size,
814                  fw_dump.cpu_notes_buf_vaddr);
815         return 0;
816 }
817
818 void fadump_free_cpu_notes_buf(void)
819 {
820         if (!fw_dump.cpu_notes_buf_vaddr)
821                 return;
822
823         fadump_free_buffer(fw_dump.cpu_notes_buf_vaddr,
824                            fw_dump.cpu_notes_buf_size);
825         fw_dump.cpu_notes_buf_vaddr = 0;
826         fw_dump.cpu_notes_buf_size = 0;
827 }
828
829 static void fadump_free_mem_ranges(struct fadump_mrange_info *mrange_info)
830 {
831         if (mrange_info->is_static) {
832                 mrange_info->mem_range_cnt = 0;
833                 return;
834         }
835
836         kfree(mrange_info->mem_ranges);
837         memset((void *)((u64)mrange_info + RNG_NAME_SZ), 0,
838                (sizeof(struct fadump_mrange_info) - RNG_NAME_SZ));
839 }
840
841 /*
842  * Allocate or reallocate mem_ranges array in incremental units
843  * of PAGE_SIZE.
844  */
845 static int fadump_alloc_mem_ranges(struct fadump_mrange_info *mrange_info)
846 {
847         struct fadump_memory_range *new_array;
848         u64 new_size;
849
850         new_size = mrange_info->mem_ranges_sz + PAGE_SIZE;
851         pr_debug("Allocating %llu bytes of memory for %s memory ranges\n",
852                  new_size, mrange_info->name);
853
854         new_array = krealloc(mrange_info->mem_ranges, new_size, GFP_KERNEL);
855         if (new_array == NULL) {
856                 pr_err("Insufficient memory for setting up %s memory ranges\n",
857                        mrange_info->name);
858                 fadump_free_mem_ranges(mrange_info);
859                 return -ENOMEM;
860         }
861
862         mrange_info->mem_ranges = new_array;
863         mrange_info->mem_ranges_sz = new_size;
864         mrange_info->max_mem_ranges = (new_size /
865                                        sizeof(struct fadump_memory_range));
866         return 0;
867 }
868 static inline int fadump_add_mem_range(struct fadump_mrange_info *mrange_info,
869                                        u64 base, u64 end)
870 {
871         struct fadump_memory_range *mem_ranges = mrange_info->mem_ranges;
872         bool is_adjacent = false;
873         u64 start, size;
874
875         if (base == end)
876                 return 0;
877
878         /*
879          * Fold adjacent memory ranges to bring down the memory ranges/
880          * PT_LOAD segments count.
881          */
882         if (mrange_info->mem_range_cnt) {
883                 start = mem_ranges[mrange_info->mem_range_cnt - 1].base;
884                 size  = mem_ranges[mrange_info->mem_range_cnt - 1].size;
885
886                 /*
887                  * Boot memory area needs separate PT_LOAD segment(s) as it
888                  * is moved to a different location at the time of crash.
889                  * So, fold only if the region is not boot memory area.
890                  */
891                 if ((start + size) == base && start >= fw_dump.boot_mem_top)
892                         is_adjacent = true;
893         }
894         if (!is_adjacent) {
895                 /* resize the array on reaching the limit */
896                 if (mrange_info->mem_range_cnt == mrange_info->max_mem_ranges) {
897                         int ret;
898
899                         if (mrange_info->is_static) {
900                                 pr_err("Reached array size limit for %s memory ranges\n",
901                                        mrange_info->name);
902                                 return -ENOSPC;
903                         }
904
905                         ret = fadump_alloc_mem_ranges(mrange_info);
906                         if (ret)
907                                 return ret;
908
909                         /* Update to the new resized array */
910                         mem_ranges = mrange_info->mem_ranges;
911                 }
912
913                 start = base;
914                 mem_ranges[mrange_info->mem_range_cnt].base = start;
915                 mrange_info->mem_range_cnt++;
916         }
917
918         mem_ranges[mrange_info->mem_range_cnt - 1].size = (end - start);
919         pr_debug("%s_memory_range[%d] [%#016llx-%#016llx], %#llx bytes\n",
920                  mrange_info->name, (mrange_info->mem_range_cnt - 1),
921                  start, end - 1, (end - start));
922         return 0;
923 }
924
925 static int fadump_init_elfcore_header(char *bufp)
926 {
927         struct elfhdr *elf;
928
929         elf = (struct elfhdr *) bufp;
930         bufp += sizeof(struct elfhdr);
931         memcpy(elf->e_ident, ELFMAG, SELFMAG);
932         elf->e_ident[EI_CLASS] = ELF_CLASS;
933         elf->e_ident[EI_DATA] = ELF_DATA;
934         elf->e_ident[EI_VERSION] = EV_CURRENT;
935         elf->e_ident[EI_OSABI] = ELF_OSABI;
936         memset(elf->e_ident+EI_PAD, 0, EI_NIDENT-EI_PAD);
937         elf->e_type = ET_CORE;
938         elf->e_machine = ELF_ARCH;
939         elf->e_version = EV_CURRENT;
940         elf->e_entry = 0;
941         elf->e_phoff = sizeof(struct elfhdr);
942         elf->e_shoff = 0;
943
944         if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2))
945                 elf->e_flags = 2;
946         else if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V1))
947                 elf->e_flags = 1;
948         else
949                 elf->e_flags = 0;
950
951         elf->e_ehsize = sizeof(struct elfhdr);
952         elf->e_phentsize = sizeof(struct elf_phdr);
953         elf->e_phnum = 0;
954         elf->e_shentsize = 0;
955         elf->e_shnum = 0;
956         elf->e_shstrndx = 0;
957
958         return 0;
959 }
960
961 /*
962  * If the given physical address falls within the boot memory region then
963  * return the relocated address that points to the dump region reserved
964  * for saving initial boot memory contents.
965  */
966 static inline unsigned long fadump_relocate(unsigned long paddr)
967 {
968         unsigned long raddr, rstart, rend, rlast, hole_size;
969         int i;
970
971         hole_size = 0;
972         rlast = 0;
973         raddr = paddr;
974         for (i = 0; i < fw_dump.boot_mem_regs_cnt; i++) {
975                 rstart = fw_dump.boot_mem_addr[i];
976                 rend = rstart + fw_dump.boot_mem_sz[i];
977                 hole_size += (rstart - rlast);
978
979                 if (paddr >= rstart && paddr < rend) {
980                         raddr += fw_dump.boot_mem_dest_addr - hole_size;
981                         break;
982                 }
983
984                 rlast = rend;
985         }
986
987         pr_debug("vmcoreinfo: paddr = 0x%lx, raddr = 0x%lx\n", paddr, raddr);
988         return raddr;
989 }
990
991 static void __init populate_elf_pt_load(struct elf_phdr *phdr, u64 start,
992                              u64 size, unsigned long long offset)
993 {
994         phdr->p_align   = 0;
995         phdr->p_memsz   = size;
996         phdr->p_filesz  = size;
997         phdr->p_paddr   = start;
998         phdr->p_offset  = offset;
999         phdr->p_type    = PT_LOAD;
1000         phdr->p_flags   = PF_R|PF_W|PF_X;
1001         phdr->p_vaddr   = (unsigned long)__va(start);
1002 }
1003
1004 static void __init fadump_populate_elfcorehdr(struct fadump_crash_info_header *fdh)
1005 {
1006         char *bufp;
1007         struct elfhdr *elf;
1008         struct elf_phdr *phdr;
1009         u64 boot_mem_dest_offset;
1010         unsigned long long i, ra_start, ra_end, ra_size, mstart, mend;
1011
1012         bufp = (char *) fw_dump.elfcorehdr_addr;
1013         fadump_init_elfcore_header(bufp);
1014         elf = (struct elfhdr *)bufp;
1015         bufp += sizeof(struct elfhdr);
1016
1017         /*
1018          * Set up ELF PT_NOTE, a placeholder for CPU notes information.
1019          * The notes info will be populated later by platform-specific code.
1020          * Hence, this PT_NOTE will always be the first ELF note.
1021          *
1022          * NOTE: Any new ELF note addition should be placed after this note.
1023          */
1024         phdr = (struct elf_phdr *)bufp;
1025         bufp += sizeof(struct elf_phdr);
1026         phdr->p_type = PT_NOTE;
1027         phdr->p_flags   = 0;
1028         phdr->p_vaddr   = 0;
1029         phdr->p_align   = 0;
1030         phdr->p_offset  = 0;
1031         phdr->p_paddr   = 0;
1032         phdr->p_filesz  = 0;
1033         phdr->p_memsz   = 0;
1034         /* Increment number of program headers. */
1035         (elf->e_phnum)++;
1036
1037         /* setup ELF PT_NOTE for vmcoreinfo */
1038         phdr = (struct elf_phdr *)bufp;
1039         bufp += sizeof(struct elf_phdr);
1040         phdr->p_type    = PT_NOTE;
1041         phdr->p_flags   = 0;
1042         phdr->p_vaddr   = 0;
1043         phdr->p_align   = 0;
1044         phdr->p_paddr   = phdr->p_offset = fdh->vmcoreinfo_raddr;
1045         phdr->p_memsz   = phdr->p_filesz = fdh->vmcoreinfo_size;
1046         /* Increment number of program headers. */
1047         (elf->e_phnum)++;
1048
1049         /*
1050          * Setup PT_LOAD sections. first include boot memory regions
1051          * and then add rest of the memory regions.
1052          */
1053         boot_mem_dest_offset = fw_dump.boot_mem_dest_addr;
1054         for (i = 0; i < fw_dump.boot_mem_regs_cnt; i++) {
1055                 phdr = (struct elf_phdr *)bufp;
1056                 bufp += sizeof(struct elf_phdr);
1057                 populate_elf_pt_load(phdr, fw_dump.boot_mem_addr[i],
1058                                      fw_dump.boot_mem_sz[i],
1059                                      boot_mem_dest_offset);
1060                 /* Increment number of program headers. */
1061                 (elf->e_phnum)++;
1062                 boot_mem_dest_offset += fw_dump.boot_mem_sz[i];
1063         }
1064
1065         /* Memory reserved for fadump in first kernel */
1066         ra_start = fw_dump.reserve_dump_area_start;
1067         ra_size = get_fadump_area_size();
1068         ra_end = ra_start + ra_size;
1069
1070         phdr = (struct elf_phdr *)bufp;
1071         for_each_mem_range(i, &mstart, &mend) {
1072                 /* Boot memory regions already added, skip them now */
1073                 if (mstart < fw_dump.boot_mem_top) {
1074                         if (mend > fw_dump.boot_mem_top)
1075                                 mstart = fw_dump.boot_mem_top;
1076                         else
1077                                 continue;
1078                 }
1079
1080                 /* Handle memblock regions overlaps with fadump reserved area */
1081                 if ((ra_start < mend) && (ra_end > mstart)) {
1082                         if ((mstart < ra_start) && (mend > ra_end)) {
1083                                 populate_elf_pt_load(phdr, mstart, ra_start - mstart, mstart);
1084                                 /* Increment number of program headers. */
1085                                 (elf->e_phnum)++;
1086                                 bufp += sizeof(struct elf_phdr);
1087                                 phdr = (struct elf_phdr *)bufp;
1088                                 populate_elf_pt_load(phdr, ra_end, mend - ra_end, ra_end);
1089                         } else if (mstart < ra_start) {
1090                                 populate_elf_pt_load(phdr, mstart, ra_start - mstart, mstart);
1091                         } else if (ra_end < mend) {
1092                                 populate_elf_pt_load(phdr, ra_end, mend - ra_end, ra_end);
1093                         }
1094                 } else {
1095                 /* No overlap with fadump reserved memory region */
1096                         populate_elf_pt_load(phdr, mstart, mend - mstart, mstart);
1097                 }
1098
1099                 /* Increment number of program headers. */
1100                 (elf->e_phnum)++;
1101                 bufp += sizeof(struct elf_phdr);
1102                 phdr = (struct elf_phdr *) bufp;
1103         }
1104 }
1105
1106 static unsigned long init_fadump_header(unsigned long addr)
1107 {
1108         struct fadump_crash_info_header *fdh;
1109
1110         if (!addr)
1111                 return 0;
1112
1113         fdh = __va(addr);
1114         addr += sizeof(struct fadump_crash_info_header);
1115
1116         memset(fdh, 0, sizeof(struct fadump_crash_info_header));
1117         fdh->magic_number = FADUMP_CRASH_INFO_MAGIC;
1118         fdh->version = FADUMP_HEADER_VERSION;
1119         /* We will set the crashing cpu id in crash_fadump() during crash. */
1120         fdh->crashing_cpu = FADUMP_CPU_UNKNOWN;
1121
1122         /*
1123          * The physical address and size of vmcoreinfo are required in the
1124          * second kernel to prepare elfcorehdr.
1125          */
1126         fdh->vmcoreinfo_raddr = fadump_relocate(paddr_vmcoreinfo_note());
1127         fdh->vmcoreinfo_size = VMCOREINFO_NOTE_SIZE;
1128
1129
1130         fdh->pt_regs_sz = sizeof(struct pt_regs);
1131         /*
1132          * When LPAR is terminated by PYHP, ensure all possible CPUs'
1133          * register data is processed while exporting the vmcore.
1134          */
1135         fdh->cpu_mask = *cpu_possible_mask;
1136         fdh->cpu_mask_sz = sizeof(struct cpumask);
1137
1138         return addr;
1139 }
1140
1141 static int register_fadump(void)
1142 {
1143         unsigned long addr;
1144
1145         /*
1146          * If no memory is reserved then we can not register for firmware-
1147          * assisted dump.
1148          */
1149         if (!fw_dump.reserve_dump_area_size)
1150                 return -ENODEV;
1151
1152         addr = fw_dump.fadumphdr_addr;
1153
1154         /* Initialize fadump crash info header. */
1155         addr = init_fadump_header(addr);
1156
1157         /* register the future kernel dump with firmware. */
1158         pr_debug("Registering for firmware-assisted kernel dump...\n");
1159         return fw_dump.ops->fadump_register(&fw_dump);
1160 }
1161
1162 void fadump_cleanup(void)
1163 {
1164         if (!fw_dump.fadump_supported)
1165                 return;
1166
1167         /* Invalidate the registration only if dump is active. */
1168         if (fw_dump.dump_active) {
1169                 pr_debug("Invalidating firmware-assisted dump registration\n");
1170                 fw_dump.ops->fadump_invalidate(&fw_dump);
1171         } else if (fw_dump.dump_registered) {
1172                 /* Un-register Firmware-assisted dump if it was registered. */
1173                 fw_dump.ops->fadump_unregister(&fw_dump);
1174         }
1175
1176         if (fw_dump.ops->fadump_cleanup)
1177                 fw_dump.ops->fadump_cleanup(&fw_dump);
1178 }
1179
1180 static void fadump_free_reserved_memory(unsigned long start_pfn,
1181                                         unsigned long end_pfn)
1182 {
1183         unsigned long pfn;
1184         unsigned long time_limit = jiffies + HZ;
1185
1186         pr_info("freeing reserved memory (0x%llx - 0x%llx)\n",
1187                 PFN_PHYS(start_pfn), PFN_PHYS(end_pfn));
1188
1189         for (pfn = start_pfn; pfn < end_pfn; pfn++) {
1190                 free_reserved_page(pfn_to_page(pfn));
1191
1192                 if (time_after(jiffies, time_limit)) {
1193                         cond_resched();
1194                         time_limit = jiffies + HZ;
1195                 }
1196         }
1197 }
1198
1199 /*
1200  * Skip memory holes and free memory that was actually reserved.
1201  */
1202 static void fadump_release_reserved_area(u64 start, u64 end)
1203 {
1204         unsigned long reg_spfn, reg_epfn;
1205         u64 tstart, tend, spfn, epfn;
1206         int i;
1207
1208         spfn = PHYS_PFN(start);
1209         epfn = PHYS_PFN(end);
1210
1211         for_each_mem_pfn_range(i, MAX_NUMNODES, &reg_spfn, &reg_epfn, NULL) {
1212                 tstart = max_t(u64, spfn, reg_spfn);
1213                 tend   = min_t(u64, epfn, reg_epfn);
1214
1215                 if (tstart < tend) {
1216                         fadump_free_reserved_memory(tstart, tend);
1217
1218                         if (tend == epfn)
1219                                 break;
1220
1221                         spfn = tend;
1222                 }
1223         }
1224 }
1225
1226 /*
1227  * Sort the mem ranges in-place and merge adjacent ranges
1228  * to minimize the memory ranges count.
1229  */
1230 static void sort_and_merge_mem_ranges(struct fadump_mrange_info *mrange_info)
1231 {
1232         struct fadump_memory_range *mem_ranges;
1233         u64 base, size;
1234         int i, j, idx;
1235
1236         if (!reserved_mrange_info.mem_range_cnt)
1237                 return;
1238
1239         /* Sort the memory ranges */
1240         mem_ranges = mrange_info->mem_ranges;
1241         for (i = 0; i < mrange_info->mem_range_cnt; i++) {
1242                 idx = i;
1243                 for (j = (i + 1); j < mrange_info->mem_range_cnt; j++) {
1244                         if (mem_ranges[idx].base > mem_ranges[j].base)
1245                                 idx = j;
1246                 }
1247                 if (idx != i)
1248                         swap(mem_ranges[idx], mem_ranges[i]);
1249         }
1250
1251         /* Merge adjacent reserved ranges */
1252         idx = 0;
1253         for (i = 1; i < mrange_info->mem_range_cnt; i++) {
1254                 base = mem_ranges[i-1].base;
1255                 size = mem_ranges[i-1].size;
1256                 if (mem_ranges[i].base == (base + size))
1257                         mem_ranges[idx].size += mem_ranges[i].size;
1258                 else {
1259                         idx++;
1260                         if (i == idx)
1261                                 continue;
1262
1263                         mem_ranges[idx] = mem_ranges[i];
1264                 }
1265         }
1266         mrange_info->mem_range_cnt = idx + 1;
1267 }
1268
1269 /*
1270  * Scan reserved-ranges to consider them while reserving/releasing
1271  * memory for FADump.
1272  */
1273 static void __init early_init_dt_scan_reserved_ranges(unsigned long node)
1274 {
1275         const __be32 *prop;
1276         int len, ret = -1;
1277         unsigned long i;
1278
1279         /* reserved-ranges already scanned */
1280         if (reserved_mrange_info.mem_range_cnt != 0)
1281                 return;
1282
1283         prop = of_get_flat_dt_prop(node, "reserved-ranges", &len);
1284         if (!prop)
1285                 return;
1286
1287         /*
1288          * Each reserved range is an (address,size) pair, 2 cells each,
1289          * totalling 4 cells per range.
1290          */
1291         for (i = 0; i < len / (sizeof(*prop) * 4); i++) {
1292                 u64 base, size;
1293
1294                 base = of_read_number(prop + (i * 4) + 0, 2);
1295                 size = of_read_number(prop + (i * 4) + 2, 2);
1296
1297                 if (size) {
1298                         ret = fadump_add_mem_range(&reserved_mrange_info,
1299                                                    base, base + size);
1300                         if (ret < 0) {
1301                                 pr_warn("some reserved ranges are ignored!\n");
1302                                 break;
1303                         }
1304                 }
1305         }
1306
1307         /* Compact reserved ranges */
1308         sort_and_merge_mem_ranges(&reserved_mrange_info);
1309 }
1310
1311 /*
1312  * Release the memory that was reserved during early boot to preserve the
1313  * crash'ed kernel's memory contents except reserved dump area (permanent
1314  * reservation) and reserved ranges used by F/W. The released memory will
1315  * be available for general use.
1316  */
1317 static void fadump_release_memory(u64 begin, u64 end)
1318 {
1319         u64 ra_start, ra_end, tstart;
1320         int i, ret;
1321
1322         ra_start = fw_dump.reserve_dump_area_start;
1323         ra_end = ra_start + fw_dump.reserve_dump_area_size;
1324
1325         /*
1326          * If reserved ranges array limit is hit, overwrite the last reserved
1327          * memory range with reserved dump area to ensure it is excluded from
1328          * the memory being released (reused for next FADump registration).
1329          */
1330         if (reserved_mrange_info.mem_range_cnt ==
1331             reserved_mrange_info.max_mem_ranges)
1332                 reserved_mrange_info.mem_range_cnt--;
1333
1334         ret = fadump_add_mem_range(&reserved_mrange_info, ra_start, ra_end);
1335         if (ret != 0)
1336                 return;
1337
1338         /* Get the reserved ranges list in order first. */
1339         sort_and_merge_mem_ranges(&reserved_mrange_info);
1340
1341         /* Exclude reserved ranges and release remaining memory */
1342         tstart = begin;
1343         for (i = 0; i < reserved_mrange_info.mem_range_cnt; i++) {
1344                 ra_start = reserved_mrange_info.mem_ranges[i].base;
1345                 ra_end = ra_start + reserved_mrange_info.mem_ranges[i].size;
1346
1347                 if (tstart >= ra_end)
1348                         continue;
1349
1350                 if (tstart < ra_start)
1351                         fadump_release_reserved_area(tstart, ra_start);
1352                 tstart = ra_end;
1353         }
1354
1355         if (tstart < end)
1356                 fadump_release_reserved_area(tstart, end);
1357 }
1358
1359 static void fadump_free_elfcorehdr_buf(void)
1360 {
1361         if (fw_dump.elfcorehdr_addr == 0 || fw_dump.elfcorehdr_size == 0)
1362                 return;
1363
1364         /*
1365          * Before freeing the memory of `elfcorehdr`, reset the global
1366          * `elfcorehdr_addr` to prevent modules like `vmcore` from accessing
1367          * invalid memory.
1368          */
1369         elfcorehdr_addr = ELFCORE_ADDR_ERR;
1370         fadump_free_buffer(fw_dump.elfcorehdr_addr, fw_dump.elfcorehdr_size);
1371         fw_dump.elfcorehdr_addr = 0;
1372         fw_dump.elfcorehdr_size = 0;
1373 }
1374
1375 static void fadump_invalidate_release_mem(void)
1376 {
1377         mutex_lock(&fadump_mutex);
1378         if (!fw_dump.dump_active) {
1379                 mutex_unlock(&fadump_mutex);
1380                 return;
1381         }
1382
1383         fadump_cleanup();
1384         mutex_unlock(&fadump_mutex);
1385
1386         fadump_free_elfcorehdr_buf();
1387         fadump_release_memory(fw_dump.boot_mem_top, memblock_end_of_DRAM());
1388         fadump_free_cpu_notes_buf();
1389
1390         /*
1391          * Setup kernel metadata and initialize the kernel dump
1392          * memory structure for FADump re-registration.
1393          */
1394         if (fw_dump.ops->fadump_setup_metadata &&
1395             (fw_dump.ops->fadump_setup_metadata(&fw_dump) < 0))
1396                 pr_warn("Failed to setup kernel metadata!\n");
1397         fw_dump.ops->fadump_init_mem_struct(&fw_dump);
1398 }
1399
1400 static ssize_t release_mem_store(struct kobject *kobj,
1401                                  struct kobj_attribute *attr,
1402                                  const char *buf, size_t count)
1403 {
1404         int input = -1;
1405
1406         if (!fw_dump.dump_active)
1407                 return -EPERM;
1408
1409         if (kstrtoint(buf, 0, &input))
1410                 return -EINVAL;
1411
1412         if (input == 1) {
1413                 /*
1414                  * Take away the '/proc/vmcore'. We are releasing the dump
1415                  * memory, hence it will not be valid anymore.
1416                  */
1417 #ifdef CONFIG_PROC_VMCORE
1418                 vmcore_cleanup();
1419 #endif
1420                 fadump_invalidate_release_mem();
1421
1422         } else
1423                 return -EINVAL;
1424         return count;
1425 }
1426
1427 /* Release the reserved memory and disable the FADump */
1428 static void __init unregister_fadump(void)
1429 {
1430         fadump_cleanup();
1431         fadump_release_memory(fw_dump.reserve_dump_area_start,
1432                               fw_dump.reserve_dump_area_size);
1433         fw_dump.fadump_enabled = 0;
1434         kobject_put(fadump_kobj);
1435 }
1436
1437 static ssize_t enabled_show(struct kobject *kobj,
1438                             struct kobj_attribute *attr,
1439                             char *buf)
1440 {
1441         return sprintf(buf, "%d\n", fw_dump.fadump_enabled);
1442 }
1443
1444 /*
1445  * /sys/kernel/fadump/hotplug_ready sysfs node returns 1, which inidcates
1446  * to usersapce that fadump re-registration is not required on memory
1447  * hotplug events.
1448  */
1449 static ssize_t hotplug_ready_show(struct kobject *kobj,
1450                                       struct kobj_attribute *attr,
1451                                       char *buf)
1452 {
1453         return sprintf(buf, "%d\n", 1);
1454 }
1455
1456 static ssize_t mem_reserved_show(struct kobject *kobj,
1457                                  struct kobj_attribute *attr,
1458                                  char *buf)
1459 {
1460         return sprintf(buf, "%ld\n", fw_dump.reserve_dump_area_size);
1461 }
1462
1463 static ssize_t registered_show(struct kobject *kobj,
1464                                struct kobj_attribute *attr,
1465                                char *buf)
1466 {
1467         return sprintf(buf, "%d\n", fw_dump.dump_registered);
1468 }
1469
1470 static ssize_t bootargs_append_show(struct kobject *kobj,
1471                                    struct kobj_attribute *attr,
1472                                    char *buf)
1473 {
1474         return sprintf(buf, "%s\n", (char *)__va(fw_dump.param_area));
1475 }
1476
1477 static ssize_t bootargs_append_store(struct kobject *kobj,
1478                                    struct kobj_attribute *attr,
1479                                    const char *buf, size_t count)
1480 {
1481         char *params;
1482
1483         if (!fw_dump.fadump_enabled || fw_dump.dump_active)
1484                 return -EPERM;
1485
1486         if (count >= COMMAND_LINE_SIZE)
1487                 return -EINVAL;
1488
1489         /*
1490          * Fail here instead of handling this scenario with
1491          * some silly workaround in capture kernel.
1492          */
1493         if (saved_command_line_len + count >= COMMAND_LINE_SIZE) {
1494                 pr_err("Appending parameters exceeds cmdline size!\n");
1495                 return -ENOSPC;
1496         }
1497
1498         params = __va(fw_dump.param_area);
1499         strscpy_pad(params, buf, COMMAND_LINE_SIZE);
1500         /* Remove newline character at the end. */
1501         if (params[count-1] == '\n')
1502                 params[count-1] = '\0';
1503
1504         return count;
1505 }
1506
1507 static ssize_t registered_store(struct kobject *kobj,
1508                                 struct kobj_attribute *attr,
1509                                 const char *buf, size_t count)
1510 {
1511         int ret = 0;
1512         int input = -1;
1513
1514         if (!fw_dump.fadump_enabled || fw_dump.dump_active)
1515                 return -EPERM;
1516
1517         if (kstrtoint(buf, 0, &input))
1518                 return -EINVAL;
1519
1520         mutex_lock(&fadump_mutex);
1521
1522         switch (input) {
1523         case 0:
1524                 if (fw_dump.dump_registered == 0) {
1525                         goto unlock_out;
1526                 }
1527
1528                 /* Un-register Firmware-assisted dump */
1529                 pr_debug("Un-register firmware-assisted dump\n");
1530                 fw_dump.ops->fadump_unregister(&fw_dump);
1531                 break;
1532         case 1:
1533                 if (fw_dump.dump_registered == 1) {
1534                         /* Un-register Firmware-assisted dump */
1535                         fw_dump.ops->fadump_unregister(&fw_dump);
1536                 }
1537                 /* Register Firmware-assisted dump */
1538                 ret = register_fadump();
1539                 break;
1540         default:
1541                 ret = -EINVAL;
1542                 break;
1543         }
1544
1545 unlock_out:
1546         mutex_unlock(&fadump_mutex);
1547         return ret < 0 ? ret : count;
1548 }
1549
1550 static int fadump_region_show(struct seq_file *m, void *private)
1551 {
1552         if (!fw_dump.fadump_enabled)
1553                 return 0;
1554
1555         mutex_lock(&fadump_mutex);
1556         fw_dump.ops->fadump_region_show(&fw_dump, m);
1557         mutex_unlock(&fadump_mutex);
1558         return 0;
1559 }
1560
1561 static struct kobj_attribute release_attr = __ATTR_WO(release_mem);
1562 static struct kobj_attribute enable_attr = __ATTR_RO(enabled);
1563 static struct kobj_attribute register_attr = __ATTR_RW(registered);
1564 static struct kobj_attribute mem_reserved_attr = __ATTR_RO(mem_reserved);
1565 static struct kobj_attribute hotplug_ready_attr = __ATTR_RO(hotplug_ready);
1566 static struct kobj_attribute bootargs_append_attr = __ATTR_RW(bootargs_append);
1567
1568 static struct attribute *fadump_attrs[] = {
1569         &enable_attr.attr,
1570         &register_attr.attr,
1571         &mem_reserved_attr.attr,
1572         &hotplug_ready_attr.attr,
1573         NULL,
1574 };
1575
1576 ATTRIBUTE_GROUPS(fadump);
1577
1578 DEFINE_SHOW_ATTRIBUTE(fadump_region);
1579
1580 static void __init fadump_init_files(void)
1581 {
1582         int rc = 0;
1583
1584         fadump_kobj = kobject_create_and_add("fadump", kernel_kobj);
1585         if (!fadump_kobj) {
1586                 pr_err("failed to create fadump kobject\n");
1587                 return;
1588         }
1589
1590         if (fw_dump.param_area) {
1591                 rc = sysfs_create_file(fadump_kobj, &bootargs_append_attr.attr);
1592                 if (rc)
1593                         pr_err("unable to create bootargs_append sysfs file (%d)\n", rc);
1594         }
1595
1596         debugfs_create_file("fadump_region", 0444, arch_debugfs_dir, NULL,
1597                             &fadump_region_fops);
1598
1599         if (fw_dump.dump_active) {
1600                 rc = sysfs_create_file(fadump_kobj, &release_attr.attr);
1601                 if (rc)
1602                         pr_err("unable to create release_mem sysfs file (%d)\n",
1603                                rc);
1604         }
1605
1606         rc = sysfs_create_groups(fadump_kobj, fadump_groups);
1607         if (rc) {
1608                 pr_err("sysfs group creation failed (%d), unregistering FADump",
1609                        rc);
1610                 unregister_fadump();
1611                 return;
1612         }
1613
1614         /*
1615          * The FADump sysfs are moved from kernel_kobj to fadump_kobj need to
1616          * create symlink at old location to maintain backward compatibility.
1617          *
1618          *      - fadump_enabled -> fadump/enabled
1619          *      - fadump_registered -> fadump/registered
1620          *      - fadump_release_mem -> fadump/release_mem
1621          */
1622         rc = compat_only_sysfs_link_entry_to_kobj(kernel_kobj, fadump_kobj,
1623                                                   "enabled", "fadump_enabled");
1624         if (rc) {
1625                 pr_err("unable to create fadump_enabled symlink (%d)", rc);
1626                 return;
1627         }
1628
1629         rc = compat_only_sysfs_link_entry_to_kobj(kernel_kobj, fadump_kobj,
1630                                                   "registered",
1631                                                   "fadump_registered");
1632         if (rc) {
1633                 pr_err("unable to create fadump_registered symlink (%d)", rc);
1634                 sysfs_remove_link(kernel_kobj, "fadump_enabled");
1635                 return;
1636         }
1637
1638         if (fw_dump.dump_active) {
1639                 rc = compat_only_sysfs_link_entry_to_kobj(kernel_kobj,
1640                                                           fadump_kobj,
1641                                                           "release_mem",
1642                                                           "fadump_release_mem");
1643                 if (rc)
1644                         pr_err("unable to create fadump_release_mem symlink (%d)",
1645                                rc);
1646         }
1647         return;
1648 }
1649
1650 static int __init fadump_setup_elfcorehdr_buf(void)
1651 {
1652         int elf_phdr_cnt;
1653         unsigned long elfcorehdr_size;
1654
1655         /*
1656          * Program header for CPU notes comes first, followed by one for
1657          * vmcoreinfo, and the remaining program headers correspond to
1658          * memory regions.
1659          */
1660         elf_phdr_cnt = 2 + fw_dump.boot_mem_regs_cnt + memblock_num_regions(memory);
1661         elfcorehdr_size = sizeof(struct elfhdr) + (elf_phdr_cnt * sizeof(struct elf_phdr));
1662         elfcorehdr_size = PAGE_ALIGN(elfcorehdr_size);
1663
1664         fw_dump.elfcorehdr_addr = (u64)fadump_alloc_buffer(elfcorehdr_size);
1665         if (!fw_dump.elfcorehdr_addr) {
1666                 pr_err("Failed to allocate %lu bytes for elfcorehdr\n",
1667                        elfcorehdr_size);
1668                 return -ENOMEM;
1669         }
1670         fw_dump.elfcorehdr_size = elfcorehdr_size;
1671         return 0;
1672 }
1673
1674 /*
1675  * Check if the fadump header of crashed kernel is compatible with fadump kernel.
1676  *
1677  * It checks the magic number, endianness, and size of non-primitive type
1678  * members of fadump header to ensure safe dump collection.
1679  */
1680 static bool __init is_fadump_header_compatible(struct fadump_crash_info_header *fdh)
1681 {
1682         if (fdh->magic_number == FADUMP_CRASH_INFO_MAGIC_OLD) {
1683                 pr_err("Old magic number, can't process the dump.\n");
1684                 return false;
1685         }
1686
1687         if (fdh->magic_number != FADUMP_CRASH_INFO_MAGIC) {
1688                 if (fdh->magic_number == swab64(FADUMP_CRASH_INFO_MAGIC))
1689                         pr_err("Endianness mismatch between the crashed and fadump kernels.\n");
1690                 else
1691                         pr_err("Fadump header is corrupted.\n");
1692
1693                 return false;
1694         }
1695
1696         /*
1697          * Dump collection is not safe if the size of non-primitive type members
1698          * of the fadump header do not match between crashed and fadump kernel.
1699          */
1700         if (fdh->pt_regs_sz != sizeof(struct pt_regs) ||
1701             fdh->cpu_mask_sz != sizeof(struct cpumask)) {
1702                 pr_err("Fadump header size mismatch.\n");
1703                 return false;
1704         }
1705
1706         return true;
1707 }
1708
1709 static void __init fadump_process(void)
1710 {
1711         struct fadump_crash_info_header *fdh;
1712
1713         fdh = (struct fadump_crash_info_header *) __va(fw_dump.fadumphdr_addr);
1714         if (!fdh) {
1715                 pr_err("Crash info header is empty.\n");
1716                 goto err_out;
1717         }
1718
1719         /* Avoid processing the dump if fadump header isn't compatible */
1720         if (!is_fadump_header_compatible(fdh))
1721                 goto err_out;
1722
1723         /* Allocate buffer for elfcorehdr */
1724         if (fadump_setup_elfcorehdr_buf())
1725                 goto err_out;
1726
1727         fadump_populate_elfcorehdr(fdh);
1728
1729         /* Let platform update the CPU notes in elfcorehdr */
1730         if (fw_dump.ops->fadump_process(&fw_dump) < 0)
1731                 goto err_out;
1732
1733         /*
1734          * elfcorehdr is now ready to be exported.
1735          *
1736          * set elfcorehdr_addr so that vmcore module will export the
1737          * elfcorehdr through '/proc/vmcore'.
1738          */
1739         elfcorehdr_addr = virt_to_phys((void *)fw_dump.elfcorehdr_addr);
1740         return;
1741
1742 err_out:
1743         fadump_invalidate_release_mem();
1744 }
1745
1746 /*
1747  * Reserve memory to store additional parameters to be passed
1748  * for fadump/capture kernel.
1749  */
1750 void __init fadump_setup_param_area(void)
1751 {
1752         phys_addr_t range_start, range_end;
1753
1754         if (!fw_dump.param_area_supported || fw_dump.dump_active)
1755                 return;
1756
1757         /* This memory can't be used by PFW or bootloader as it is shared across kernels */
1758         if (early_radix_enabled()) {
1759                 /*
1760                  * Anywhere in the upper half should be good enough as all memory
1761                  * is accessible in real mode.
1762                  */
1763                 range_start = memblock_end_of_DRAM() / 2;
1764                 range_end = memblock_end_of_DRAM();
1765         } else {
1766                 /*
1767                  * Passing additional parameters is supported for hash MMU only
1768                  * if the first memory block size is 768MB or higher.
1769                  */
1770                 if (ppc64_rma_size < 0x30000000)
1771                         return;
1772
1773                 /*
1774                  * 640 MB to 768 MB is not used by PFW/bootloader. So, try reserving
1775                  * memory for passing additional parameters in this range to avoid
1776                  * being stomped on by PFW/bootloader.
1777                  */
1778                 range_start = 0x2A000000;
1779                 range_end = range_start + 0x4000000;
1780         }
1781
1782         fw_dump.param_area = memblock_phys_alloc_range(COMMAND_LINE_SIZE,
1783                                                        COMMAND_LINE_SIZE,
1784                                                        range_start,
1785                                                        range_end);
1786         if (!fw_dump.param_area) {
1787                 pr_warn("WARNING: Could not setup area to pass additional parameters!\n");
1788                 return;
1789         }
1790
1791         memset((void *)fw_dump.param_area, 0, COMMAND_LINE_SIZE);
1792 }
1793
1794 /*
1795  * Prepare for firmware-assisted dump.
1796  */
1797 int __init setup_fadump(void)
1798 {
1799         if (!fw_dump.fadump_supported)
1800                 return 0;
1801
1802         fadump_init_files();
1803         fadump_show_config();
1804
1805         if (!fw_dump.fadump_enabled)
1806                 return 1;
1807
1808         /*
1809          * If dump data is available then see if it is valid and prepare for
1810          * saving it to the disk.
1811          */
1812         if (fw_dump.dump_active) {
1813                 fadump_process();
1814         }
1815         /* Initialize the kernel dump memory structure and register with f/w */
1816         else if (fw_dump.reserve_dump_area_size) {
1817                 fw_dump.ops->fadump_init_mem_struct(&fw_dump);
1818                 register_fadump();
1819         }
1820
1821         /*
1822          * In case of panic, fadump is triggered via ppc_panic_event()
1823          * panic notifier. Setting crash_kexec_post_notifiers to 'true'
1824          * lets panic() function take crash friendly path before panic
1825          * notifiers are invoked.
1826          */
1827         crash_kexec_post_notifiers = true;
1828
1829         return 1;
1830 }
1831 /*
1832  * Use subsys_initcall_sync() here because there is dependency with
1833  * crash_save_vmcoreinfo_init(), which must run first to ensure vmcoreinfo initialization
1834  * is done before registering with f/w.
1835  */
1836 subsys_initcall_sync(setup_fadump);
1837 #else /* !CONFIG_PRESERVE_FA_DUMP */
1838
1839 /* Scan the Firmware Assisted dump configuration details. */
1840 int __init early_init_dt_scan_fw_dump(unsigned long node, const char *uname,
1841                                       int depth, void *data)
1842 {
1843         if ((depth != 1) || (strcmp(uname, "ibm,opal") != 0))
1844                 return 0;
1845
1846         opal_fadump_dt_scan(&fw_dump, node);
1847         return 1;
1848 }
1849
1850 /*
1851  * When dump is active but PRESERVE_FA_DUMP is enabled on the kernel,
1852  * preserve crash data. The subsequent memory preserving kernel boot
1853  * is likely to process this crash data.
1854  */
1855 int __init fadump_reserve_mem(void)
1856 {
1857         if (fw_dump.dump_active) {
1858                 /*
1859                  * If last boot has crashed then reserve all the memory
1860                  * above boot memory to preserve crash data.
1861                  */
1862                 pr_info("Preserving crash data for processing in next boot.\n");
1863                 fadump_reserve_crash_area(fw_dump.boot_mem_top);
1864         } else
1865                 pr_debug("FADump-aware kernel..\n");
1866
1867         return 1;
1868 }
1869 #endif /* CONFIG_PRESERVE_FA_DUMP */
1870
1871 /* Preserve everything above the base address */
1872 static void __init fadump_reserve_crash_area(u64 base)
1873 {
1874         u64 i, mstart, mend, msize;
1875
1876         for_each_mem_range(i, &mstart, &mend) {
1877                 msize  = mend - mstart;
1878
1879                 if ((mstart + msize) < base)
1880                         continue;
1881
1882                 if (mstart < base) {
1883                         msize -= (base - mstart);
1884                         mstart = base;
1885                 }
1886
1887                 pr_info("Reserving %lluMB of memory at %#016llx for preserving crash data",
1888                         (msize >> 20), mstart);
1889                 memblock_reserve(mstart, msize);
1890         }
1891 }
This page took 0.13092 seconds and 4 git commands to generate.