qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] target: ppc: Use MSR_HVB bit to get the target endianness for memory dump
@ 2023-05-09 10:47 Narayana Murty N
  0 siblings, 0 replies; only message in thread
From: Narayana Murty N @ 2023-05-09 10:47 UTC (permalink / raw)
  To: danielhb413, clg, david, groug
  Cc: qemu-ppc, qemu-devel, farosas, npiggin, vaibhav, harshpb, sbhat,
	nnmlinux

Currently on PPC64 qemu always dumps the guest memory in
Big Endian (BE) format even though the guest running in Little Endian
(LE) mode. So crash tool fails to load the dump as illustrated below:

Log :
$ virsh dump DOMAIN --memory-only dump.file

Domain 'DOMAIN' dumped to dump.file

$ crash vmlinux dump.file

<snip>
crash 8.0.2-1.el9

WARNING: endian mismatch:
          crash utility: little-endian
          dump.file: big-endian

WARNING: machine type mismatch:
          crash utility: PPC64
          dump.file: (unknown)

crash: dump.file: not a supported file format
<snip>

This happens because cpu_get_dump_info() passes cpu->env->has_hv_mode
to function ppc_interrupts_little_endian(), the cpu->env->has_hv_mode
always set for powerNV even though the guest is not running in hv mode.
The hv mode should be taken from msr_mask MSR_HVB bit
(cpu->env.msr_mask & MSR_HVB). This patch fixes the issue by passing
MSR_HVB value to ppc_interrupts_little_endian() in order to determine
the guest endianness.

The patch was tested on POWER9 box booted with Linux as host in
following cases:
case I: powerNV booted with BigEndian host, LittleEndian guest
case II: powerNV booted with BigEndian host, BigEndian guest
case III: powerNV booted with LittleEndian host, LittleEndian guest
with -enable-kvm
case IV: powerNV booted with LittleEndian host, BigEndian guest
with -enable-kvm
The results are tabulated below, Endianess of the dump file against
the Host and guest Endianess.

|----------------|----------------|
|Host-Endianess  |Guest-Endianness|
|                |-------|--------|
|                | BE    | LE     |
|----------------|-------|--------|
|BE              | BE    | LE     |
|----------------|-------|--------|
|LE              | BE    | LE	  |
|----------------|-------|--------|

Signed-off-by: Narayana Murty N <nnmlinux@linux.ibm.com>
---
Changes since V1:
https://lore.kernel.org/qemu-devel/20230420145055.10196-1-nnmlinux@linux.ibm.com/
The approach to solve the issue was changed based on feedback from
Fabiano Rosas on patch V1.
---
 target/ppc/arch_dump.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/target/ppc/arch_dump.c b/target/ppc/arch_dump.c
index f58e6359d5..a8315659d9 100644
--- a/target/ppc/arch_dump.c
+++ b/target/ppc/arch_dump.c
@@ -237,7 +237,7 @@ int cpu_get_dump_info(ArchDumpInfo *info,
     info->d_machine = PPC_ELF_MACHINE;
     info->d_class = ELFCLASS;
 
-    if (ppc_interrupts_little_endian(cpu, cpu->env.has_hv_mode)) {
+    if (ppc_interrupts_little_endian(cpu, !!(cpu->env.msr_mask & MSR_HVB))) {
         info->d_endian = ELFDATA2LSB;
     } else {
         info->d_endian = ELFDATA2MSB;
-- 
2.39.2



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2023-05-09 10:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-09 10:47 [PATCH v2] target: ppc: Use MSR_HVB bit to get the target endianness for memory dump Narayana Murty N

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).