crash/netdump.h
Dave Anderson e30594ebea Implemented a new "bt -A" option for the S390X architecture, which
adds support for displaying the new s390x vector registers.  For
ELF dumps, the registers are taken from the VX ELF notes; for s390
dumps. the registers are taken from memory.  The option produces the
same output as the -a option, but also displays the vector registers
for all active tasks.
(holzheu@linux.vnet.ibm.com)
2014-12-17 16:35:28 -05:00

220 lines
5.0 KiB
C

/* netdump.h
*
* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 David Anderson
* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Red Hat, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Author: David Anderson
*/
#include <elf.h>
#define MIN_NETDUMP_ELF32_HEADER_SIZE \
sizeof(Elf32_Ehdr)+sizeof(Elf32_Phdr)+sizeof(Elf32_Phdr)
#define MIN_NETDUMP_ELF64_HEADER_SIZE \
sizeof(Elf64_Ehdr)+sizeof(Elf64_Phdr)+sizeof(Elf64_Phdr)
#define MIN_NETDUMP_ELF_HEADER_SIZE \
MAX(MIN_NETDUMP_ELF32_HEADER_SIZE, MIN_NETDUMP_ELF64_HEADER_SIZE)
#define NT_TASKSTRUCT 4
#define NT_DISKDUMP 0x70000001
#ifdef NOTDEF
/*
* Note: Based upon the original, abandoned, proposal for
* its contents -- keep around for potential future use.
*/
#ifndef NT_KDUMPINFO
#define NT_KDUMPINFO 7
#endif
#endif /* NOTDEF */
struct pt_load_segment {
off_t file_offset;
physaddr_t phys_start;
physaddr_t phys_end;
physaddr_t zero_fill;
};
struct vmcore_data {
ulong flags;
int ndfd;
FILE *ofp;
uint header_size;
char *elf_header;
uint num_pt_load_segments;
struct pt_load_segment *pt_load_segments;
Elf32_Ehdr *elf32;
Elf32_Phdr *notes32;
Elf32_Phdr *load32;
Elf64_Ehdr *elf64;
Elf64_Phdr *notes64;
Elf64_Phdr *load64;
void *nt_prstatus;
void *nt_prpsinfo;
void *nt_taskstruct;
ulong task_struct;
uint page_size;
ulong switch_stack;
uint num_prstatus_notes;
void *nt_prstatus_percpu[NR_CPUS];
struct xen_kdump_data *xen_kdump_data;
void *vmcoreinfo;
uint size_vmcoreinfo;
/* Backup Region, first 640K of System RAM. */
#define KEXEC_BACKUP_SRC_END 0x0009ffff
uint num_qemu_notes;
void *nt_qemu_percpu[NR_CPUS];
ulonglong backup_src_start;
ulong backup_src_size;
ulonglong backup_offset;
};
#define DUMP_ELF_INCOMPLETE 0x1 /* dumpfile is incomplete */
/*
* ELF note types for Xen dom0/hypervisor kdumps.
* The comments below are from xen/include/public/elfnote.h.
*/
/*
* System information exported through crash notes.
*
* The kexec / kdump code will create one XEN_ELFNOTE_CRASH_INFO
* note in case of a system crash. This note will contain various
* information about the system, see xen/include/xen/elfcore.h.
*/
#define XEN_ELFNOTE_CRASH_INFO 0x1000001
/*
* System registers exported through crash notes.
*
* The kexec / kdump code will create one XEN_ELFNOTE_CRASH_REGS
* note per cpu in case of a system crash. This note is architecture
* specific and will contain registers not saved in the "CORE" note.
* See xen/include/xen/elfcore.h for more information.
*/
#define XEN_ELFNOTE_CRASH_REGS 0x1000002
/*
* For (temporary) backwards compatibility.
*/
#define NT_XEN_KDUMP_CR3 0x10000001
struct xen_kdump_data {
ulong flags;
ulong cr3;
ulong p2m_mfn;
char *page;
ulong last_mfn_read;
ulong last_pmd_read;
ulong cache_hits;
ulong accesses;
int p2m_frames;
ulong *p2m_mfn_frame_list;
ulong xen_phys_start;
int xen_major_version;
int xen_minor_version;
};
#define KDUMP_P2M_INIT (0x1)
#define KDUMP_CR3 (0x2)
#define KDUMP_MFN_LIST (0x4)
#define P2M_FAILURE ((physaddr_t)(0xffffffffffffffffLL))
/*
* S390 CPU timer ELF note
*/
#ifndef NT_S390_TIMER
#define NT_S390_TIMER 0x301
#endif
/*
* S390 TOD clock comparator ELF note
*/
#ifndef NT_S390_TODCMP
#define NT_S390_TODCMP 0x302
#endif
/*
* S390 TOD programmable register ELF note
*/
#ifndef NT_S390_TODPREG
#define NT_S390_TODPREG 0x303
#endif
/*
* S390 control registers ELF note
*/
#ifndef NT_S390_CTRS
#define NT_S390_CTRS 0x304
#endif
/*
* S390 prefix ELF note
*/
#ifndef NT_S390_PREFIX
#define NT_S390_PREFIX 0x305
#endif
/*
* S390 vector registers 0-15 upper half note (16 * u64)
*/
#ifndef NT_S390_VXRS_LOW
#define NT_S390_VXRS_LOW 0x309
#endif
/*
* S390 vector registers 16-31 note (16 * u128)
*/
#ifndef NT_S390_VXRS_HIGH
#define NT_S390_VXRS_HIGH 0x30a
#endif
#define MAX_KCORE_ELF_HEADER_SIZE (32768)
struct proc_kcore_data {
uint flags;
uint segments;
char *elf_header;
Elf64_Ehdr *elf64;
Elf64_Phdr *load64;
Elf32_Ehdr *elf32;
Elf32_Phdr *load32;
};
struct QEMUCPUSegment {
uint32_t selector;
uint32_t limit;
uint32_t flags;
uint32_t pad;
uint64_t base;
};
typedef struct QEMUCPUSegment QEMUCPUSegment;
struct QEMUCPUState {
uint32_t version;
uint32_t size;
uint64_t rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp;
uint64_t r8, r9, r10, r11, r12, r13, r14, r15;
uint64_t rip, rflags;
QEMUCPUSegment cs, ds, es, fs, gs, ss;
QEMUCPUSegment ldt, tr, gdt, idt;
uint64_t cr[5];
};
typedef struct QEMUCPUState QEMUCPUState;