mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
dump: rebase from host-private RAMBlock offsets to guest-physical addresses
RAMBlock.offset --> GuestPhysBlock.target_start RAMBlock.offset + RAMBlock.length --> GuestPhysBlock.target_end RAMBlock.length --> GuestPhysBlock.target_end - GuestPhysBlock.target_start "GuestPhysBlock.host_addr" is only used when writing the dump contents. This patch enables "crash" to work with the vmcore by rebasing the vmcore from the left side of the following diagram to the right side: host-private offset relative to ram_addr RAMBlock guest-visible paddrs 0 +-------------------+.....+-------------------+ 0 | ^ | | ^ | | 640 KB | | 640 KB | | v | | v | 0x0000a0000 +-------------------+.....+-------------------+ 0x0000a0000 | ^ | |XXXXXXXXXXXXXXXXXXX| | 384 KB | |XXXXXXXXXXXXXXXXXXX| | v | |XXXXXXXXXXXXXXXXXXX| 0x000100000 +-------------------+.....+-------------------+ 0x000100000 | ^ | | ^ | | 3583 MB | | 3583 MB | | v | | v | 0x0e0000000 +-------------------+.....+-------------------+ 0x0e0000000 | ^ |. |XXXXXXXXXXXXXXXXXXX| | above_4g_mem_size | . |XXXX PCI hole XXXXX| | v | . |XXXX XXXXX| ram_size +-------------------+ . |XXXX 512 MB XXXXX| . .|XXXXXXXXXXXXXXXXXXX| . +-------------------+ 0x100000000 . | ^ | . | above_4g_mem_size | .| v | +-------------------+ ram_size + 512 MB Related RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=981582 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
c5d7f60f06
commit
56c4bfb3f0
7 changed files with 69 additions and 57 deletions
|
@ -15,6 +15,7 @@
|
|||
#include "exec/cpu-all.h"
|
||||
#include "sysemu/dump.h"
|
||||
#include "elf.h"
|
||||
#include "sysemu/memory_mapping.h"
|
||||
|
||||
#ifdef TARGET_X86_64
|
||||
typedef struct {
|
||||
|
@ -389,10 +390,11 @@ int x86_cpu_write_elf32_qemunote(WriteCoreDumpFunction f, CPUState *cs,
|
|||
return cpu_write_qemu_note(f, &cpu->env, opaque, 0);
|
||||
}
|
||||
|
||||
int cpu_get_dump_info(ArchDumpInfo *info)
|
||||
int cpu_get_dump_info(ArchDumpInfo *info,
|
||||
const GuestPhysBlockList *guest_phys_blocks)
|
||||
{
|
||||
bool lma = false;
|
||||
RAMBlock *block;
|
||||
GuestPhysBlock *block;
|
||||
|
||||
#ifdef TARGET_X86_64
|
||||
X86CPU *first_x86_cpu = X86_CPU(first_cpu);
|
||||
|
@ -412,8 +414,8 @@ int cpu_get_dump_info(ArchDumpInfo *info)
|
|||
} else {
|
||||
info->d_class = ELFCLASS32;
|
||||
|
||||
QTAILQ_FOREACH(block, &ram_list.blocks, next) {
|
||||
if (block->offset + block->length > UINT_MAX) {
|
||||
QTAILQ_FOREACH(block, &guest_phys_blocks->head, next) {
|
||||
if (block->target_end > UINT_MAX) {
|
||||
/* The memory size is greater than 4G */
|
||||
info->d_class = ELFCLASS64;
|
||||
break;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue