diff options
author | Laurent Vivier <lvivier@redhat.com> | 2016-08-08 15:08:53 +0200 |
---|---|---|
committer | David Gibson <david@gibson.dropbear.id.au> | 2016-08-10 13:05:05 +1000 |
commit | 760d88d1d0c409f1afe6f1c91539487413e8b2a9 (patch) | |
tree | bb5c27e6bc5d411c6dbeedfa8f4714454cae09fa /target-ppc/arch_dump.c | |
parent | 2bb15bddf2607110820d5ce5aa43baac27292fb3 (diff) | |
download | qemu-760d88d1d0c409f1afe6f1c91539487413e8b2a9.zip qemu-760d88d1d0c409f1afe6f1c91539487413e8b2a9.tar.gz qemu-760d88d1d0c409f1afe6f1c91539487413e8b2a9.tar.bz2 |
ppc64: fix compressed dump with pseries kernel
If we don't provide the page size in target-ppc:cpu_get_dump_info(),
the default one (TARGET_PAGE_SIZE, 4KB) is used to create
the compressed dump. It works fine with Macintosh, but not with
pseries as the kernel default page size is 64KB.
Without this patch, if we generate a compressed dump in the QEMU monitor:
(qemu) dump-guest-memory -z qemu.dump
This dump cannot be read by crash:
# crash vmlinux qemu.dump
...
WARNING: cannot translate vmemmap kernel virtual addresses:
commands requiring page structure contents will fail
...
Page_size is used to determine the dumpfile's block size. The
block size needs to be at least the page size, but a multiple of page
size works fine too. For PPC64, linux supports either 4KB or 64KB software
page size. So we define the page_size to 64KB.
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'target-ppc/arch_dump.c')
-rw-r--r-- | target-ppc/arch_dump.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/target-ppc/arch_dump.c b/target-ppc/arch_dump.c index df1fd8c..40282a1 100644 --- a/target-ppc/arch_dump.c +++ b/target-ppc/arch_dump.c @@ -220,6 +220,11 @@ int cpu_get_dump_info(ArchDumpInfo *info, } else { info->d_endian = ELFDATA2LSB; } + /* 64KB is the max page size for pseries kernel */ + if (strncmp(object_get_typename(qdev_get_machine()), + "pseries-", 8) == 0) { + info->page_size = (1U << 16); + } return 0; } |