Skip to content

Commit

Permalink
x86_64: calculate page_offset in case of re-filtering/sadump/virsh dump
Browse files Browse the repository at this point in the history
we do not call get_elf_info() in case of refiltering and sadump.
Therefore, we will not have any pt_load in that case, and so we get:

get_page_offset_x86_64: Can't get any pt_load to calculate page offset.

However, we will have vmcoreinfo and vmlinux information in case of
re-filtering. So, we are able to find kaslr offset and we can get
page_offset_base address. Thus we can read the page offset as well.

If kaslr is not enabled and also we do not have valid PT_LOAD to
calculate page offset  then use old method to find fixed page
offset.

In case of virsh dump virtual addresses in PT_LOAD are 0. Ignore such
addresses for the page_offset calculation.

Suggested-by: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Signed-off-by: Pratyush Anand <panand@redhat.com>
  • Loading branch information
Pratyush Anand committed May 24, 2017
1 parent a2b4fcd commit 16655ce
Showing 1 changed file with 28 additions and 7 deletions.
35 changes: 28 additions & 7 deletions arch/x86_64.c
Expand Up @@ -75,17 +75,38 @@ get_page_offset_x86_64(void)
int i;
unsigned long long phys_start;
unsigned long long virt_start;
unsigned long page_offset_base;

if (info->kaslr_offset) {
page_offset_base = get_symbol_addr("page_offset_base");
page_offset_base += info->kaslr_offset;
if (!readmem(VADDR, page_offset_base, &info->page_offset,
sizeof(info->page_offset))) {
ERRMSG("Can't read page_offset_base.\n");
return FALSE;
}
}

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;
if (get_num_pt_loads()) {
for (i = 0;
get_pt_load(i, &phys_start, NULL, &virt_start, NULL);
i++) {
if (virt_start != NOT_KV_ADDR
&& 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;
if (info->kernel_version < KERNEL_VERSION(2, 6, 27)) {
info->page_offset = __PAGE_OFFSET_ORIG;
} else {
info->page_offset = __PAGE_OFFSET_2_6_27;
}

return TRUE;
}

int
Expand Down

0 comments on commit 16655ce

Please sign in to comment.