# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 8771f539663a903e58f59a2a9b39ed3e37af7049
# Parent 9765174339938e4374947e2e6e9eae675c267f22
[IA64] Handle VTi's fp fault & trap in hypervisor instead of injecting to guest
Signed-off-by : Zhang xiantao <xiantao.zhang@xxxxxxxxx>
Signed-off-by : Kevin Tian <kevin.tian@xxxxxxxxx>
---
xen/arch/ia64/vmx/vmx_process.c | 14 +++++++++++++-
xen/arch/ia64/xen/process.c | 12 +++++-------
2 files changed, 18 insertions(+), 8 deletions(-)
diff -r 976517433993 -r 8771f539663a xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c Sat Jun 03 15:21:07 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_process.c Sat Jun 03 15:34:07 2006 -0600
@@ -62,6 +62,7 @@ extern void alt_itlb (VCPU *vcpu, u64 va
extern void alt_itlb (VCPU *vcpu, u64 vadr);
extern void itlb_fault (VCPU *vcpu, u64 vadr);
extern void ivhpt_fault (VCPU *vcpu, u64 vadr);
+extern unsigned long handle_fpu_swa (int fp_fault, struct pt_regs *regs,
unsigned long isr);
#define DOMN_PAL_REQUEST 0x110000
#define DOMN_SAL_REQUEST 0x110001
@@ -84,8 +85,19 @@ void vmx_reflect_interruption(UINT64 ifa
VCPU *vcpu = current;
UINT64 vpsr = vmx_vcpu_get_psr(vcpu);
vector=vec2off[vector];
- if(!(vpsr&IA64_PSR_IC)&&(vector!=0x1400)){
+ if(!(vpsr&IA64_PSR_IC)&&(vector!=IA64_DATA_NESTED_TLB_VECTOR)){
panic_domain(regs, "Guest nested fault vector=%lx!\n", vector);
+ }
+ else{ // handle fpswa emulation
+ // fp fault
+ if(vector == IA64_FP_FAULT_VECTOR && !handle_fpu_swa(1, regs, isr)){
+ vmx_vcpu_increment_iip(vcpu);
+ return;
+ }
+ //fp trap
+ else if(vector == IA64_FP_TRAP_VECTOR && !handle_fpu_swa(0, regs,
isr)){
+ return;
+ }
}
VCPU(vcpu,isr)=isr;
VCPU(vcpu,iipa) = regs->cr_iip;
diff -r 976517433993 -r 8771f539663a xen/arch/ia64/xen/process.c
--- a/xen/arch/ia64/xen/process.c Sat Jun 03 15:21:07 2006 -0600
+++ b/xen/arch/ia64/xen/process.c Sat Jun 03 15:34:07 2006 -0600
@@ -447,7 +447,7 @@ fp_emulate (int fp_fault, void *bundle,
/*
* Handle floating-point assist faults and traps for domain.
*/
-static unsigned long
+unsigned long
handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr)
{
struct vcpu *v = current;
@@ -477,11 +477,6 @@ handle_fpu_swa (int fp_fault, struct pt_
PSCBX(v, fpswa_ret) = ret;
printk("%s(%s): fp_emulate() returned %ld\n",
__FUNCTION__, fp_fault?"fault":"trap", ret.status);
- } else {
- if (fp_fault) {
- /* emulation was successful */
- vcpu_increment_iip(v);
- }
}
return ret.status;
@@ -869,7 +864,10 @@ ia64_handle_reflection (unsigned long if
// FIXME: Should we handle unaligned refs in Xen??
vector = IA64_UNALIGNED_REF_VECTOR; break;
case 32:
- if (!(handle_fpu_swa(1, regs, isr))) return;
+ if (!(handle_fpu_swa(1, regs, isr))) {
+ vcpu_increment_iip(v);
+ return;
+ }
printf("ia64_handle_reflection: handling FP fault\n");
vector = IA64_FP_FAULT_VECTOR; break;
case 33:
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|