|
@@ -14,10 +14,10 @@
|
|
|
#include <asm/sections.h>
|
|
|
|
|
|
/* vmcoreinfo stuff */
|
|
|
-static unsigned char vmcoreinfo_data[VMCOREINFO_BYTES];
|
|
|
-u32 vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4];
|
|
|
+static unsigned char *vmcoreinfo_data;
|
|
|
size_t vmcoreinfo_size;
|
|
|
-size_t vmcoreinfo_max_size = sizeof(vmcoreinfo_data);
|
|
|
+size_t vmcoreinfo_max_size = VMCOREINFO_BYTES;
|
|
|
+u32 *vmcoreinfo_note;
|
|
|
|
|
|
/*
|
|
|
* parsing the "crashkernel" commandline
|
|
@@ -326,6 +326,9 @@ static void update_vmcoreinfo_note(void)
|
|
|
|
|
|
void crash_save_vmcoreinfo(void)
|
|
|
{
|
|
|
+ if (!vmcoreinfo_note)
|
|
|
+ return;
|
|
|
+
|
|
|
vmcoreinfo_append_str("CRASHTIME=%ld\n", get_seconds());
|
|
|
update_vmcoreinfo_note();
|
|
|
}
|
|
@@ -356,11 +359,26 @@ void __weak arch_crash_save_vmcoreinfo(void)
|
|
|
|
|
|
phys_addr_t __weak paddr_vmcoreinfo_note(void)
|
|
|
{
|
|
|
- return __pa_symbol((unsigned long)(char *)&vmcoreinfo_note);
|
|
|
+ return __pa(vmcoreinfo_note);
|
|
|
}
|
|
|
|
|
|
static int __init crash_save_vmcoreinfo_init(void)
|
|
|
{
|
|
|
+ vmcoreinfo_data = (unsigned char *)get_zeroed_page(GFP_KERNEL);
|
|
|
+ if (!vmcoreinfo_data) {
|
|
|
+ pr_warn("Memory allocation for vmcoreinfo_data failed\n");
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ vmcoreinfo_note = alloc_pages_exact(VMCOREINFO_NOTE_SIZE,
|
|
|
+ GFP_KERNEL | __GFP_ZERO);
|
|
|
+ if (!vmcoreinfo_note) {
|
|
|
+ free_page((unsigned long)vmcoreinfo_data);
|
|
|
+ vmcoreinfo_data = NULL;
|
|
|
+ pr_warn("Memory allocation for vmcoreinfo_note failed\n");
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
VMCOREINFO_OSRELEASE(init_uts_ns.name.release);
|
|
|
VMCOREINFO_PAGESIZE(PAGE_SIZE);
|
|
|
|