# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 602f5965e217ba986c22659c04b379e74be90c22
# Parent df67fa9b1376b126269dae364aa9f5b7a0ffa325
[IA64] display vmx fault messges
This patch modifies the vmx fault handler to display a message when a
fault occurs in hypervisor.
This includes the followings:
- Break 0 handler is modified to check psr.vm bit instead of cpl.
- External interrupt handler is modified to get current using
MINSTATE_GET_CURRENT instead of r21. r21 has been used in DO_SAVE_MIN
which is called from other fault handlers. I'm not sure why the
original vmx fault handler gets the current from r21.
Signed-off-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
Signed-off-by: Tetsu Yamamoto <yamamoto.tetsu@xxxxxxxxxxxxxx>
---
xen/arch/ia64/vmx/vmx_ivt.S | 6 ++++--
xen/arch/ia64/vmx/vmx_process.c | 2 +-
xen/arch/ia64/xen/ivt.S | 2 +-
xen/arch/ia64/xen/xenmisc.c | 12 ++++++++++++
xen/include/asm-ia64/vmx.h | 1 +
5 files changed, 19 insertions(+), 4 deletions(-)
diff -r df67fa9b1376 -r 602f5965e217 xen/arch/ia64/vmx/vmx_ivt.S
--- a/xen/arch/ia64/vmx/vmx_ivt.S Mon Jun 19 13:35:49 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_ivt.S Mon Jun 19 13:42:34 2006 -0600
@@ -88,11 +88,13 @@
#include "vmx_minstate.h"
+#define MINSTATE_VIRT /* needed by minstate.h */
+#include "minstate.h"
#define VMX_FAULT(n) \
vmx_fault_##n:; \
- br.sptk vmx_fault_##n; \
+ br.sptk.many dispatch_to_fault_handler; \
;; \
@@ -508,7 +510,7 @@ ENTRY(vmx_interrupt)
;;
.mem.offset 0,0; st8.spill [r16]=r13,16
.mem.offset 8,0; st8.spill [r17]=r8,16 /* save ar.fpsr */
- mov r13=r21 /* establish `current' */
+ MINSTATE_GET_CURRENT(r13)
;;
.mem.offset 0,0; st8.spill [r16]=r15,16
.mem.offset 8,0; st8.spill [r17]=r14,16
diff -r df67fa9b1376 -r 602f5965e217 xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c Mon Jun 19 13:35:49 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_process.c Mon Jun 19 13:42:34 2006 -0600
@@ -125,7 +125,7 @@ vmx_ia64_handle_break (unsigned long ifa
#endif
{
if (iim == 0)
- die_if_kernel("bug check", regs, iim);
+ vmx_die_if_kernel("Break 0 in Hypervisor.", regs, iim);
if (!user_mode(regs)) {
/* Allow hypercalls only when cpl = 0. */
diff -r df67fa9b1376 -r 602f5965e217 xen/arch/ia64/xen/ivt.S
--- a/xen/arch/ia64/xen/ivt.S Mon Jun 19 13:35:49 2006 -0600
+++ b/xen/arch/ia64/xen/ivt.S Mon Jun 19 13:42:34 2006 -0600
@@ -1493,7 +1493,7 @@ END(dispatch_unaligned_handler)
* suitable spot...
*/
-ENTRY(dispatch_to_fault_handler)
+GLOBAL_ENTRY(dispatch_to_fault_handler)
/*
* Input:
* psr.ic: off
diff -r df67fa9b1376 -r 602f5965e217 xen/arch/ia64/xen/xenmisc.c
--- a/xen/arch/ia64/xen/xenmisc.c Mon Jun 19 13:35:49 2006 -0600
+++ b/xen/arch/ia64/xen/xenmisc.c Mon Jun 19 13:42:34 2006 -0600
@@ -19,6 +19,7 @@
#include <public/sched.h>
#include <asm/vhpt.h>
#include <asm/debugger.h>
+#include <asm/vmx.h>
#include <asm/vmx_vcpu.h>
#include <asm/vcpu.h>
@@ -109,6 +110,17 @@ void die_if_kernel(char *str, struct pt_
domain_crash_synchronous();
}
+void vmx_die_if_kernel(char *str, struct pt_regs *regs, long err) /*
__attribute__ ((noreturn)) */
+{
+ if (vmx_user_mode(regs))
+ return;
+
+ printk("%s: %s %ld\n", __func__, str, err);
+ debugtrace_dump();
+ show_registers(regs);
+ domain_crash_synchronous();
+}
+
long
ia64_peek (struct task_struct *child, struct switch_stack *child_stack,
unsigned long user_rbs_end, unsigned long addr, long *val)
diff -r df67fa9b1376 -r 602f5965e217 xen/include/asm-ia64/vmx.h
--- a/xen/include/asm-ia64/vmx.h Mon Jun 19 13:35:49 2006 -0600
+++ b/xen/include/asm-ia64/vmx.h Mon Jun 19 13:42:34 2006 -0600
@@ -24,6 +24,7 @@
#define RR7_SWITCH_SHIFT 12 /* 4k enough */
#include <public/hvm/ioreq.h>
+#define vmx_user_mode(regs) (((struct ia64_psr *)&(regs)->cr_ipsr)->vm == 1)
#define VCPU_LID(v) (((u64)(v)->vcpu_id)<<24)
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|