[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3] target: ppc: Use MSR_HVB bit to get the target endianness
From: |
Narayana Murty N |
Subject: |
Re: [PATCH v3] target: ppc: Use MSR_HVB bit to get the target endianness for memory dump |
Date: |
Thu, 25 May 2023 09:45:11 +0530 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.10.0 |
On 5/23/23 15:52, Cédric Le Goater
wrote:
On 5/22/23 18:02, Narayana Murty N wrote:
Currently on PPC64 qemu always dumps the
guest memory in
Big Endian (BE) format even though the guest running in Little
Endian
The patch is surely correct. I have problems understanding the
config
you are testing. PPC Book3s has multiple hypervisor
implementations :
1. pHyp (AKA PowerVM)
2. OPAL/PowerNV (AKA Power KVM-HV)
3. OPAL/PowerNV/pSeries (AKA Power KVMHV-on-pSeries)
4. pHyp/pSeries (very recent implementation, I don't know how it
is
referred to in the kernel)
I am leaving the KVM-PR implementation out of the discussions for
simplicity.
QEMU also supports emulation of 2. and 3. in two different
machines
PowerNV and pseries, although running pseries guests under a
PowerNV
machine is slow, so is running pseries guests under pseries.
Could you please describe your environment ?
Thanks,
C.
It had been tested target machine OPAL/PowerNV with big endian host os.
and also target OPAL/PowerNV/pSeries little endian host setup with qemu.
(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 crash tool also expects guest kernel endianness should match
the
endianness of the dump.
The patch was tested on POWER9 box booted with Linux as host in
following cases:
Host-Endianess Qemu-Target-Machine Qemu-Guest-Endianess
Qemu-Generated-Guest
Memory-Dump-Format
BE powernv LE KVM guest
LE
BE powernv BE KVM guest
BE
LE powernv LE KVM guest
LE
LE powernv BE KVM guest
BE
LE pseries KVM LE KVM guest
LE
LE pseries TCG LE guest
LE
Signed-off-by: Narayana Murty N <nnmlinux@linux.ibm.com>
---
Changes since V2:
commit message modified as per feedbak from Nicholas Piggin.
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;