/* * xen_hyper_defs.h * * Portions Copyright (C) 2006-2007 Fujitsu Limited * Portions Copyright (C) 2006-2007 VA Linux Systems Japan K.K. * * Authors: Itsuro Oda * Fumihiko Kakuma * * This file is part of Xencrash. * * Xencrash 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. * * Xencrash 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. * * You should have received a copy of the GNU General Public License * along with Xencrash; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifdef XEN_HYPERVISOR_ARCH #include #include #ifdef X86 /* Xen Hypervisor address space layout */ #define IOREMAP_VIRT_END (0UL) #define IOREMAP_VIRT_START (0xFFC00000UL) #define DIRECTMAP_VIRT_END IOREMAP_VIRT_START #define DIRECTMAP_VIRT_START (0xFF000000UL) #define MAPCACHE_VIRT_END DIRECTMAP_VIRT_START #define MAPCACHE_VIRT_START (0xFFC00000UL) #define PERDOMAIN_VIRT_END DIRECTMAP_VIRT_START #define PERDOMAIN_VIRT_START (0xFE800000UL) #define SH_LINEAR_PT_VIRT_END PERDOMAIN_VIRT_START #define SH_LINEAR_PT_VIRT_START (0xFE400000UL) #define SH_LINEAR_PT_VIRT_START_PAE (0xFE000000UL) #define LINEAR_PT_VIRT_END SH_LINEAR_PT_VIRT_START #define LINEAR_PT_VIRT_START (0xFE000000UL) #define LINEAR_PT_VIRT_START_PAE (0xFD800000UL) #define RDWR_MPT_VIRT_END LINEAR_PT_VIRT_START #define RDWR_MPT_VIRT_START (0xFDC00000UL) #define RDWR_MPT_VIRT_START_PAE (0xFC800000UL) #define FRAMETABLE_VIRT_END RDWR_MPT_VIRT_START #define FRAMETABLE_VIRT_START (0xFC400000UL) #define FRAMETABLE_VIRT_START_PAE (0xF6800000UL) #define RO_MPT_VIRT_END FRAMETABLE_VIRT_START #define RO_MPT_VIRT_START (0xFC000000UL) #define RO_MPT_VIRT_START_PAE (0xF5800000UL) #define HYPERVISOR_VIRT_START RO_MPT_VIRT_START #define HYPERVISOR_VIRT_START_PAE RO_MPT_VIRT_START_PAE #endif #ifdef X86_64 #define HYPERVISOR_VIRT_START (0xffff800000000000) #define HYPERVISOR_VIRT_END (0xffff880000000000) #define DIRECTMAP_VIRT_START (0xffff830000000000) #define DIRECTMAP_VIRT_END (0xffff880000000000) #define PAGE_OFFSET_XEN_HYPER DIRECTMAP_VIRT_START #define XEN_VIRT_START (xht->xen_virt_start) #define XEN_VIRT_ADDR(vaddr) \ (((vaddr) >= XEN_VIRT_START) && ((vaddr) < DIRECTMAP_VIRT_START)) #endif #ifdef IA64 #define HYPERVISOR_VIRT_START (0xe800000000000000) #define HYPERVISOR_VIRT_END (0xf800000000000000) #define DEFAULT_SHAREDINFO_ADDR (0xf100000000000000) #define PERCPU_PAGE_SIZE 65536 #define PERCPU_ADDR (DEFAULT_SHAREDINFO_ADDR - PERCPU_PAGE_SIZE) #define DIRECTMAP_VIRT_START (0xf000000000000000) #define DIRECTMAP_VIRT_END PERCPU_ADDR #define VIRT_FRAME_TABLE_SIZE (0x0100000000000000) #define PERCPU_VIRT_ADDR(vaddr) \ (((vaddr) >= PERCPU_ADDR) && ((vaddr) < PERCPU_ADDR + PERCPU_PAGE_SIZE)) #define FRAME_TABLE_VIRT_ADDR(vaddr) \ ((vaddr) >= xhmachdep->frame_table && (vaddr) < xhmachdep->frame_table + VIRT_FRAME_TABLE_SIZE) #undef IA64_RBS_OFFSET #define IA64_RBS_OFFSET ((XEN_HYPER_SIZE(vcpu) + 15) & ~15) #endif /* IA64 */ #define DIRECTMAP_VIRT_ADDR(vaddr) \ (((vaddr) >= DIRECTMAP_VIRT_START) && ((vaddr) < DIRECTMAP_VIRT_END)) typedef uint16_t domid_t; typedef uint32_t Elf_Word; /* * NOTE kakuma: The following defines are temporary version for * elf note format which is used only in crash. */ #define XEN_HYPER_ELF_NOTE_V1 1 #define XEN_HYPER_ELF_NOTE_V2 2 #define XEN_HYPER_ELF_NOTE_V3 3 #define XEN_HYPER_ELF_NOTE_V4 4 #ifdef X86 #define XEN_HYPER_ELF_NOTE_V4_NOTE_SIZE 0x100 #endif #if defined(X86_64) || defined(IA64) #define XEN_HYPER_ELF_NOTE_V4_NOTE_SIZE 0x200 #endif /* * Xen Hyper */ #define XEN_HYPER_SMP (0x400) #ifdef X86 #define XEN_HYPER_MAX_VIRT_CPUS (32) #define XEN_HYPER_HZ 100 #endif #ifdef X86_64 #define XEN_HYPER_MAX_VIRT_CPUS (32) #define XEN_HYPER_HZ 100 #endif #ifdef IA64 #define XEN_HYPER_MAX_VIRT_CPUS (64) #define XEN_HYPER_HZ 100 #endif #ifndef XEN_HYPER_MAX_VIRT_CPUS #define XEN_HYPER_MAX_VIRT_CPUS (1) #endif #if defined(X86) || defined(X86_64) #define xen_hyper_per_cpu(var, cpu) \ ({ ulong __var_addr; \ if (xht->__per_cpu_offset) \ __var_addr = (xht->flags & XEN_HYPER_SMP) ? \ ((ulong)(var) + xht->__per_cpu_offset[cpu]) : (ulong)(var); \ else \ __var_addr = (ulong)(var) + ((ulong)(cpu) << xht->percpu_shift); \ __var_addr; }) #elif defined(IA64) #define xen_hyper_per_cpu(var, cpu) \ ((xht->flags & XEN_HYPER_SMP) ? \ (ulong)(var) + (xht->__per_cpu_offset[cpu]) : \ (ulong)(var)) #endif #if defined(X86) || defined(X86_64) #define XEN_HYPER_STACK_ORDER 2 #if 0 #define XEN_HYPER_STACK_SIZE (machdep->pagesize << XEN_HYPER_STACK_ORDER) #endif #define XEN_HYPER_GET_CPU_INFO(sp) \ ((sp & ~(STACKSIZE()-1)) | \ (STACKSIZE() - XEN_HYPER_SIZE(cpu_info))) #endif #define XEN_HYPER_CONRING_SIZE 16384 /* system time */ #define XEN_HYPER_NANO_TO_SEC(ns) ((ulonglong)((ns) / 1000000000ULL)) #define XEN_HYPER_MICR_TO_SEC(us) ((ulonglong)((us) / 1000000ULL)) #define XEN_HYPER_MILI_TO_SEC(ms) ((ulonglong)((ms) / 1000ULL)) /* * Domain */ /* Prepared domain ID. */ #define XEN_HYPER_DOMID_IO (0x7FF1U) #define XEN_HYPER_DOMID_XEN (0x7FF2U) #define XEN_HYPER_DOMID_IDLE (0x7FFFU) /* Domain flags (domain_flags). */ /* Is this domain privileged? */ #define XEN_HYPER__DOMF_privileged 0 #define XEN_HYPER_DOMF_privileged (1UL<= 0) #define XEN_HYPER_VALID_STRUCT(X) (xen_hyper_size_table.X >= 0) #define XEN_HYPER_VALID_MEMBER(X) (xen_hyper_offset_table.X >= 0) #define XEN_HYPER_ASSIGN_SIZE(X) (xen_hyper_size_table.X) #define XEN_HYPER_ASSIGN_OFFSET(X) (xen_hyper_offset_table.X) #define XEN_HYPER_STRUCT_SIZE_INIT(X, Y) (XEN_HYPER_ASSIGN_SIZE(X) = STRUCT_SIZE(Y)) #define XEN_HYPER_MEMBER_SIZE_INIT(X, Y, Z) (XEN_HYPER_ASSIGN_SIZE(X) = MEMBER_SIZE(Y, Z)) #define XEN_HYPER_MEMBER_OFFSET_INIT(X, Y, Z) (XEN_HYPER_ASSIGN_OFFSET(X) = MEMBER_OFFSET(Y, Z)) /* * System */ #define XEN_HYPER_MAX_CPUS() (xht->max_cpus) #define XEN_HYPER_CRASHING_CPU() (xht->crashing_cpu) /* * Dump information */ #define XEN_HYPER_X86_NOTE_EIP(regs) (regs[12]) #define XEN_HYPER_X86_NOTE_ESP(regs) (regs[15]) #define XEN_HYPER_X86_64_NOTE_RIP(regs) (regs[16]) #define XEN_HYPER_X86_64_NOTE_RSP(regs) (regs[19]) /* * Domain */ #define XEN_HYPER_DOMAIN_F_INIT 0x1 #define XEN_HYPER_NR_DOMAINS() (xht->domains) #define XEN_HYPER_RUNNING_DOMAINS() (xhdt->running_domains) /* * Phisycal CPU */ #define XEN_HYPER_NR_PCPUS() (xht->pcpus) #define for_cpu_indexes(i, cpuid) \ for (i = 0, cpuid = xht->cpu_idxs[i]; \ i < XEN_HYPER_NR_PCPUS(); \ cpuid = xht->cpu_idxs[++i]) #define XEN_HYPER_CURR_VCPU(pcpuid) \ (xen_hyper_get_active_vcpu_from_pcpuid(pcpuid)) /* * VCPU */ #define XEN_HYPER_VCPU_F_INIT 0x1 #define XEN_HYPER_NR_VCPUS_IN_DOM(domain_context) (domain_context->vcpu_cnt) #define XEN_HYPER_VCPU_LAST_CONTEXT() (xhvct->last) /* * tools */ #define XEN_HYPER_PRI(fp, len, str, buf, flag, args) \ sprintf args; \ xen_hyper_fpr_indent(fp, len, str, buf, flag); #define XEN_HYPER_PRI_CONST(fp, len, str, flag) \ xen_hyper_fpr_indent(fp, len, str, NULL, flag); #define XEN_HYPER_PRI_L (0x0) #define XEN_HYPER_PRI_R (0x1) #define XEN_HYPER_PRI_LF (0x2) /* * Global data */ extern struct xen_hyper_machdep_table *xhmachdep; extern struct xen_hyper_table *xht; extern struct xen_hyper_dumpinfo_table *xhdit; extern struct xen_hyper_domain_table *xhdt; extern struct xen_hyper_vcpu_table *xhvct; extern struct xen_hyper_pcpu_table *xhpct; extern struct xen_hyper_sched_table *xhscht; extern struct xen_hyper_symbol_table_data *xhsymt; extern struct xen_hyper_offset_table xen_hyper_offset_table; extern struct xen_hyper_size_table xen_hyper_size_table; extern struct command_table_entry xen_hyper_command_table[]; extern struct task_context fake_tc; /* * Xen Hyper command help */ extern char *xen_hyper_help_domain[]; extern char *xen_hyper_help_doms[]; extern char *xen_hyper_help_dumpinfo[]; extern char *xen_hyper_help_log[]; extern char *xen_hyper_help_pcpus[]; extern char *xen_hyper_help_sched[]; extern char *xen_hyper_help_sys[]; extern char *xen_hyper_help_vcpu[]; extern char *xen_hyper_help_vcpus[]; /* * Prototype */ ulonglong xen_hyper_get_uptime_hyper(void); /* * x86 */ int xen_hyper_x86_get_smp_cpus(void); uint64_t xen_hyper_x86_memory_size(void); /* * IA64 */ int xen_hyper_ia64_get_smp_cpus(void); uint64_t xen_hyper_ia64_memory_size(void); ulong xen_hyper_ia64_processor_speed(void); /* * Xen Hyper */ void xen_hyper_init(void); void xen_hyper_domain_init(void); void xen_hyper_vcpu_init(void); void xen_hyper_dumpinfo_init(void); void xen_hyper_misc_init(void); void xen_hyper_post_init(void); struct xen_hyper_dumpinfo_context *xen_hyper_id_to_dumpinfo_context(uint id); struct xen_hyper_dumpinfo_context *xen_hyper_note_to_dumpinfo_context(ulong note); char *xen_hyper_fill_elf_notes(ulong note, char *note_buf, int type); /* domain */ void xen_hyper_refresh_domain_context_space(void); int xen_hyper_get_domains(void); char *xen_hyper_get_domain_next(int mod, ulong *next); domid_t xen_hyper_domain_to_id(ulong domain); char *xen_hyper_id_to_domain_struct(domid_t id); struct xen_hyper_domain_context * xen_hyper_domain_to_domain_context(ulong domain); struct xen_hyper_domain_context * xen_hyper_id_to_domain_context(domid_t id); struct xen_hyper_domain_context * xen_hyper_store_domain_context(struct xen_hyper_domain_context *dc, ulong domain, char *dp); char *xen_hyper_read_domain_from_context(struct xen_hyper_domain_context *dc); char *xen_hyper_read_domain(ulong domain); char *xen_hyper_read_domain_verify(ulong domain); char *xen_hyper_fill_domain_struct(ulong domain, char *domain_struct); void xen_hyper_alloc_domain_context_space(int domains); ulong xen_hyper_domain_state(struct xen_hyper_domain_context *dc); /* vcpu */ void xen_hyper_refresh_vcpu_context_space(void); struct xen_hyper_vcpu_context * xen_hyper_vcpu_to_vcpu_context(ulong vcpu); struct xen_hyper_vcpu_context * xen_hyper_id_to_vcpu_context(ulong domain, domid_t did, int vcid); struct xen_hyper_vcpu_context_array * xen_hyper_domain_to_vcpu_context_array(ulong domain); struct xen_hyper_vcpu_context_array * xen_hyper_domid_to_vcpu_context_array(domid_t id); struct xen_hyper_vcpu_context * xen_hyper_store_vcpu_context(struct xen_hyper_vcpu_context *vcc, ulong vcpu, char *vcp); char * xen_hyper_read_vcpu_from_context(struct xen_hyper_vcpu_context *vcc); char *xen_hyper_read_vcpu(ulong vcpu); char *xen_hyper_read_vcpu_verify(ulong vcpu); char *xen_hyper_fill_vcpu_struct(ulong vcpu, char *vcpu_struct); void xen_hyper_alloc_vcpu_context_arrays_space(int domains); void xen_hyper_alloc_vcpu_context_space(struct xen_hyper_vcpu_context_array *vcca, int vcpus); int xen_hyper_vcpu_state(struct xen_hyper_vcpu_context *vcc); /* pcpu */ #if defined(X86) || defined(X86_64) void xen_hyper_x86_pcpu_init(void); #elif defined(IA64) void xen_hyper_ia64_pcpu_init(void); #endif struct xen_hyper_pcpu_context *xen_hyper_id_to_pcpu_context(uint id); struct xen_hyper_pcpu_context *xen_hyper_pcpu_to_pcpu_context(ulong pcpu); struct xen_hyper_pcpu_context *xen_hyper_store_pcpu_context(struct xen_hyper_pcpu_context *pcc, ulong pcpu, char *pcp); struct xen_hyper_pcpu_context *xen_hyper_store_pcpu_context_tss(struct xen_hyper_pcpu_context *pcc, ulong init_tss, char *tss); char *xen_hyper_read_pcpu(ulong pcpu); char *xen_hyper_fill_pcpu_struct(ulong pcpu, char *pcpu_struct); void xen_hyper_alloc_pcpu_context_space(int pcpus); /* others */ char *xen_hyper_x86_fill_cpu_data(int idx, char *cpuinfo_x86); char *xen_hyper_ia64_fill_cpu_data(int idx, char *cpuinfo_ia64); int xen_hyper_is_vcpu_crash(struct xen_hyper_vcpu_context *vcc); void xen_hyper_print_bt_header(FILE *out, ulong pcpu, int newline); ulong xen_hyper_get_active_vcpu_from_pcpuid(ulong pcpu); ulong xen_hyper_pcpu_to_active_vcpu(ulong pcpu); void xen_hyper_get_cpu_info(void); int xen_hyper_test_pcpu_id(uint pcpu_id); /* * Xen Hyper command */ void xen_hyper_cmd_help(void); void xen_hyper_cmd_domain(void); void xen_hyper_cmd_doms(void); void xen_hyper_cmd_dumpinfo(void); void xen_hyper_cmd_log(void); void xen_hyper_dump_log(void); void xen_hyper_cmd_pcpus(void); void xen_hyper_cmd_sched(void); void xen_hyper_cmd_sys(void); void xen_hyper_cmd_vcpu(void); void xen_hyper_cmd_vcpus(void); void xen_hyper_display_sys_stats(void); void xen_hyper_show_vcpu_context(struct xen_hyper_vcpu_context *vcc); char *xen_hyper_domain_state_string(struct xen_hyper_domain_context *dc, char *buf, int verbose); char *xen_hyper_vcpu_state_string(struct xen_hyper_vcpu_context *vcc, char *buf, int verbose); /* tools */ void xen_hyper_fpr_indent(FILE *fp, int len, char *str1, char *str2, int flag); #else #define XEN_HYPERVISOR_NOT_SUPPORTED \ "Xen hypervisor mode not supported on this architecture\n" #endif