aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@hp.com>2007-10-22 12:26:53 -0600
committerAlex Williamson <alex.williamson@hp.com>2007-10-22 12:26:53 -0600
commit34070c37f55e7b04f2dc9d6e9f71ea238d8131fa (patch)
tree71b986b26d1bb7d1922c6d76e8474c70d7231e3a
parentde5d56f31dd18fde2297e6f7ea1a1bc2e809ffe5 (diff)
downloadxen-34070c37f55e7b04f2dc9d6e9f71ea238d8131fa.tar.gz
xen-34070c37f55e7b04f2dc9d6e9f71ea238d8131fa.tar.bz2
xen-34070c37f55e7b04f2dc9d6e9f71ea238d8131fa.zip
[IA64] Don't share privregs with hvm domain
Don't share privregs with hvm domain and twist IA64 xen dump core format slightly. Xen shares privregs pages with IA64 HVM domain for xm dump-core to dump the pages. However sharing the page allows hvm guest domain peek/destroy the page contents that might cause xen crash. And the xen dump core file doesn't need privregs page because cpu context should be obtained from vcpu context in case of IA64 HVM domain. Although this patch modify xen dump core format, current crash utility (at least crash 4.0-4.7) doesn't look into .xen_ia64_mmapped_regs section and I don't know any other tools to understand xen dump core file. So this format modification doesn't cause incompatibility issue. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
-rw-r--r--docs/misc/dump-core-format.txt8
-rw-r--r--tools/libxc/xc_core.c2
-rw-r--r--tools/libxc/xc_core_ia64.c11
-rw-r--r--xen/arch/ia64/vmx/vmx_init.c1
-rw-r--r--xen/arch/ia64/xen/domain.c9
-rw-r--r--xen/include/asm-ia64/domain.h1
-rw-r--r--xen/include/public/arch-ia64.h5
7 files changed, 29 insertions, 8 deletions
diff --git a/docs/misc/dump-core-format.txt b/docs/misc/dump-core-format.txt
index aa32d810d8..bc1842c747 100644
--- a/docs/misc/dump-core-format.txt
+++ b/docs/misc/dump-core-format.txt
@@ -127,8 +127,10 @@ Currently the following sections are defined. Some sections are optional.
This section stores the array of mapped_regs_t.
The size of array is stored in xch_nr_vcpus member of header
note descriptor in .note.Xen note section.
- This section is ia64 specific and must exist for ia64 domain.
- This section must not exist for non-ia64 domain.
+ This section is ia64 specific and must exist for ia64 PV
+ domain.
+ This section must not exist for non-ia64 domain or ia64 HVM
+ domain.
note section
@@ -237,3 +239,5 @@ Currently only (major, minor) = (0, 1) is used.
- EI_CLASS member of elf header was changed to ELFCLASS64 independent of
architecture. This is mainly for x86_32pae.
The format version isn't bumped because analysis tools can distinguish it.
+- .xen_ia64_mapped_regs section was made only for ia64 PV domain.
+ In case of IA64 HVM domain, this section doesn't exist.
diff --git a/tools/libxc/xc_core.c b/tools/libxc/xc_core.c
index a939e95c75..edcf67cfc0 100644
--- a/tools/libxc/xc_core.c
+++ b/tools/libxc/xc_core.c
@@ -32,7 +32,7 @@
* |.xen_prstatus |
* | vcpu_guest_context_t[nr_vcpus] |
* +--------------------------------------------------------+
- * |.xen_ia64_mmapped_regs if ia64 |
+ * |.xen_ia64_mmapped_regs if ia64 pv |
* | mmapped_regs_t[nr_vcpus] |
* +--------------------------------------------------------+
* |.xen_shared_info if possible |
diff --git a/tools/libxc/xc_core_ia64.c b/tools/libxc/xc_core_ia64.c
index 443578a0a8..bd233cd1a6 100644
--- a/tools/libxc/xc_core_ia64.c
+++ b/tools/libxc/xc_core_ia64.c
@@ -312,6 +312,10 @@ xc_core_arch_context_get(struct xc_core_arch_context* arch_ctxt,
int xc_handle, uint32_t domid)
{
mapped_regs_t* mapped_regs;
+
+ if ( ctxt->privregs_pfn == VGC_PRIVREGS_HVM )
+ return 0; /* VTi domain case */
+
if ( ctxt->privregs_pfn == INVALID_P2M_ENTRY )
{
PERROR("Could not get mmapped privregs gmfn");
@@ -340,6 +344,13 @@ xc_core_arch_context_get_shdr(struct xc_core_arch_context *arch_ctxt,
int sts = -1;
Elf64_Shdr *shdr;
+ if ( arch_ctxt->nr_vcpus == 0 )
+ {
+ /* VTi domain case */
+ *filesz = 0;
+ return 0;
+ }
+
/* mmapped priv regs */
shdr = xc_core_shdr_get(sheaders);
if ( shdr == NULL )
diff --git a/xen/arch/ia64/vmx/vmx_init.c b/xen/arch/ia64/vmx/vmx_init.c
index f29f9cfe30..a1f03b64d1 100644
--- a/xen/arch/ia64/vmx/vmx_init.c
+++ b/xen/arch/ia64/vmx/vmx_init.c
@@ -309,7 +309,6 @@ vmx_final_setup_guest(struct vcpu *v)
return -ENOMEM;
v->arch.privregs = (mapped_regs_t *)vpd;
- vcpu_share_privregs_with_guest(v);
vpd->vpd_low.virt_env_vaddr = vm_buffer;
v->domain->arch.vmx_platform.gos_type = OS_UNKNOWN;
diff --git a/xen/arch/ia64/xen/domain.c b/xen/arch/ia64/xen/domain.c
index 8a8d2cd74b..f8e3bff5eb 100644
--- a/xen/arch/ia64/xen/domain.c
+++ b/xen/arch/ia64/xen/domain.c
@@ -470,7 +470,7 @@ int vcpu_initialise(struct vcpu *v)
return 0;
}
-void vcpu_share_privregs_with_guest(struct vcpu *v)
+static void vcpu_share_privregs_with_guest(struct vcpu *v)
{
struct domain *d = v->domain;
int i, order = get_order_from_shift(XMAPPEDREGS_SHIFT);
@@ -939,8 +939,11 @@ void arch_get_info_guest(struct vcpu *v, vcpu_guest_context_u c)
c.nat->regs.rbs_rnat &= ~((1UL << bottom_slot) - 1);
}
- c.nat->privregs_pfn = get_gpfn_from_mfn
- (virt_to_maddr(v->arch.privregs) >> PAGE_SHIFT);
+ if (VMX_DOMAIN(v))
+ c.nat->privregs_pfn = VGC_PRIVREGS_HVM;
+ else
+ c.nat->privregs_pfn = get_gpfn_from_mfn(
+ virt_to_maddr(v->arch.privregs) >> PAGE_SHIFT);
for (i = 0; i < IA64_NUM_DBG_REGS; i++) {
if (VMX_DOMAIN(v)) {
diff --git a/xen/include/asm-ia64/domain.h b/xen/include/asm-ia64/domain.h
index 7d2b5be64a..68e5256f04 100644
--- a/xen/include/asm-ia64/domain.h
+++ b/xen/include/asm-ia64/domain.h
@@ -20,7 +20,6 @@ struct tlb_track;
struct vcpu;
extern void relinquish_vcpu_resources(struct vcpu *v);
-extern void vcpu_share_privregs_with_guest(struct vcpu *v);
extern int vcpu_late_initialise(struct vcpu *v);
/* given a current domain metaphysical address, return the physical address */
diff --git a/xen/include/public/arch-ia64.h b/xen/include/public/arch-ia64.h
index d65a48631a..511998bca0 100644
--- a/xen/include/public/arch-ia64.h
+++ b/xen/include/public/arch-ia64.h
@@ -427,6 +427,11 @@ struct vcpu_guest_context {
struct vcpu_guest_context_regs regs;
unsigned long event_callback_ip;
+
+ /* xen doesn't share privregs pages with hvm domain so that this member
+ * doesn't make sense for hvm domain.
+ * ~0UL is already used for INVALID_P2M_ENTRY. */
+#define VGC_PRIVREGS_HVM (~(-2UL))
unsigned long privregs_pfn;
};
typedef struct vcpu_guest_context vcpu_guest_context_t;