diff options
author | Daniel Kiper <daniel.kiper@oracle.com> | 2015-11-28 21:14:04 +0100 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2015-11-30 08:55:23 +0900 |
commit | 8a1aa35a1077b42bc2a2afb05d24b637e1edf2a1 (patch) | |
tree | 07111fb6656f0db5c5948ef9d9def0a5ce7a522d /kexec/arch/i386/crashdump-x86.c | |
parent | 6ba9e97c5b5f059c11b87f5f21f55bd92dcf1f2d (diff) |
crashdump/x86: Add option to get crash kernel region size
Crash kernel region size is available via sysfs on Linux running on
bare metal. However, this does not work when Linux runs as Xen dom0.
In this case Xen crash kernel region size should be established using
__HYPERVISOR_kexec_op hypercall (Linux kernel kexec functionality does
not make a lot of sense in Xen dom0). Sadly hypercalls are not easily
accessible using shell scripts or something like that. Potentially we
can check "xl dmesg" output for crashkernel option but this is not nice.
So, let's add this functionality, for Linux running on bare metal and
as Xen dom0, to kexec-tools. This way kdump scripts may establish crash
kernel region size in one way regardless of platform. All burden of
platform detection lies on kexec-tools.
Figure (and unit) displayed by this new kexec-tools functionality is
the same as one taken from /sys/kernel/kexec_crash_size.
This functionality is available on x86 platform only. If idea is acceptable
then I can prepare patches for other platforms (if it is possible and make
sense) and repost them as fully flagged patch series.
Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'kexec/arch/i386/crashdump-x86.c')
-rw-r--r-- | kexec/arch/i386/crashdump-x86.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c index bbc0f35..4b31112 100644 --- a/kexec/arch/i386/crashdump-x86.c +++ b/kexec/arch/i386/crashdump-x86.c @@ -1056,7 +1056,7 @@ static int crashkernel_mem_callback(void *UNUSED(data), int nr, return 0; } -int is_crashkernel_mem_reserved(void) +static int get_crashkernel_region(void) { int ret; @@ -1079,3 +1079,19 @@ int is_crashkernel_mem_reserved(void) return !!crash_reserved_mem_nr; } + +int is_crashkernel_mem_reserved(void) +{ + return get_crashkernel_region(); +} + +void print_crashkernel_region_size(void) +{ + uint64_t end, start; + + if (get_crashkernel_region()) { + get_crash_kernel_load_range(&start, &end); + printf("%lu\n", end - start + 1); + } else + printf("0\n"); +} |