Pratyush Anand
2017-05-23 03:23:16 UTC
Hi Hatayama,
KASLR enabled kernel.
I have already posted a patch to calculate page_offset when pt_load is not
available.
http://lists.infradead.org/pipermail/kexec/2017-May/018747.html
Probably,I can improve that patch in next version so that it takes care of
sadump case as well.
Thanks for reporting this issue.
~Pratyush
This reverts commit 0c9dd01d8ee2e4ec1821a11f5e174fdba56012b8 because
the logic works well only on the kdump ELF format. It doesn't work
well on sadump vmcores and qemu/KVM guest vmcores created by virsh
dump --memory-only command where info->page_offset results in 0. These
formats have to depend on kernel version dependency in the current
situation.
I do not think that we should just revert it. Revert will break things onthe logic works well only on the kdump ELF format. It doesn't work
well on sadump vmcores and qemu/KVM guest vmcores created by virsh
dump --memory-only command where info->page_offset results in 0. These
formats have to depend on kernel version dependency in the current
situation.
KASLR enabled kernel.
I have already posted a patch to calculate page_offset when pt_load is not
available.
http://lists.infradead.org/pipermail/kexec/2017-May/018747.html
Probably,I can improve that patch in next version so that it takes care of
sadump case as well.
Thanks for reporting this issue.
~Pratyush
---
arch/x86_64.c | 25 ++++---------------------
1 file changed, 4 insertions(+), 21 deletions(-)
diff --git a/arch/x86_64.c b/arch/x86_64.c
index e978a36..13f0c3f 100644
--- a/arch/x86_64.c
+++ b/arch/x86_64.c
@@ -33,25 +33,6 @@ get_xen_p2m_mfn(void)
return NOT_FOUND_LONG_VALUE;
}
-static int
-get_page_offset_x86_64(void)
-{
- int i;
- unsigned long long phys_start;
- unsigned long long virt_start;
-
- for (i = 0; get_pt_load(i, &phys_start, NULL, &virt_start, NULL); i++) {
- if (virt_start < __START_KERNEL_map
- && phys_start != NOT_PADDR) {
- info->page_offset = virt_start - phys_start;
- return TRUE;
- }
- }
-
- ERRMSG("Can't get any pt_load to calculate page offset.\n");
- return FALSE;
-}
-
int
get_phys_base_x86_64(void)
{
@@ -179,8 +160,10 @@ get_versiondep_info_x86_64(void)
else
info->max_physmem_bits = _MAX_PHYSMEM_BITS_2_6_31;
- if (!get_page_offset_x86_64())
- return FALSE;
+ if (info->kernel_version < KERNEL_VERSION(2, 6, 27))
+ info->page_offset = __PAGE_OFFSET_ORIG;
+ else
+ info->page_offset = __PAGE_OFFSET_2_6_27;
if (info->kernel_version < KERNEL_VERSION(2, 6, 31)) {
info->vmemmap_start = VMEMMAP_START_ORIG;
arch/x86_64.c | 25 ++++---------------------
1 file changed, 4 insertions(+), 21 deletions(-)
diff --git a/arch/x86_64.c b/arch/x86_64.c
index e978a36..13f0c3f 100644
--- a/arch/x86_64.c
+++ b/arch/x86_64.c
@@ -33,25 +33,6 @@ get_xen_p2m_mfn(void)
return NOT_FOUND_LONG_VALUE;
}
-static int
-get_page_offset_x86_64(void)
-{
- int i;
- unsigned long long phys_start;
- unsigned long long virt_start;
-
- for (i = 0; get_pt_load(i, &phys_start, NULL, &virt_start, NULL); i++) {
- if (virt_start < __START_KERNEL_map
- && phys_start != NOT_PADDR) {
- info->page_offset = virt_start - phys_start;
- return TRUE;
- }
- }
-
- ERRMSG("Can't get any pt_load to calculate page offset.\n");
- return FALSE;
-}
-
int
get_phys_base_x86_64(void)
{
@@ -179,8 +160,10 @@ get_versiondep_info_x86_64(void)
else
info->max_physmem_bits = _MAX_PHYSMEM_BITS_2_6_31;
- if (!get_page_offset_x86_64())
- return FALSE;
+ if (info->kernel_version < KERNEL_VERSION(2, 6, 27))
+ info->page_offset = __PAGE_OFFSET_ORIG;
+ else
+ info->page_offset = __PAGE_OFFSET_2_6_27;
if (info->kernel_version < KERNEL_VERSION(2, 6, 31)) {
info->vmemmap_start = VMEMMAP_START_ORIG;