# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID a9d58ef8e4e7ee24fcb2e0c9527390bab14c647c
# Parent 380f87e8003fc9ce6235c7fcd9972ecb749f0a86
[IA64] Add sal emulation to VTI domain
Signed-off-by Anthony.xu <anthony.xu@xxxxxxxxx>
---
xen/arch/ia64/vmx/pal_emul.c | 20 +++++++-
xen/arch/ia64/vmx/vmx_process.c | 92 +++-------------------------------------
xen/include/asm-ia64/vmx_pal.h | 1
3 files changed, 28 insertions(+), 85 deletions(-)
diff -r 380f87e8003f -r a9d58ef8e4e7 xen/arch/ia64/vmx/pal_emul.c
--- a/xen/arch/ia64/vmx/pal_emul.c Wed May 31 11:27:59 2006 -0600
+++ b/xen/arch/ia64/vmx/pal_emul.c Wed May 31 11:28:03 2006 -0600
@@ -21,6 +21,7 @@
#include <asm/vmx_vcpu.h>
#include <asm/pal.h>
#include <asm/sal.h>
+#include <asm/dom_fw.h>
#include <asm/tlb.h>
#include <asm/vmx_mm_def.h>
@@ -42,7 +43,14 @@ set_pal_result (VCPU *vcpu,struct ia64_p
vcpu_set_gr(vcpu,11, result.v2,0);
}
-
+static void
+set_sal_result (VCPU *vcpu,struct sal_ret_values result) {
+
+ vcpu_set_gr(vcpu,8, result.r8,0);
+ vcpu_set_gr(vcpu,9, result.r9,0);
+ vcpu_set_gr(vcpu,10, result.r10,0);
+ vcpu_set_gr(vcpu,11, result.r11,0);
+}
static struct ia64_pal_retval
pal_cache_flush (VCPU *vcpu) {
UINT64 gr28,gr29, gr30, gr31;
@@ -450,4 +458,12 @@ pal_emul( VCPU *vcpu) {
set_pal_result (vcpu, result);
}
-
+void
+sal_emul(VCPU *v) {
+ struct sal_ret_values result;
+ result = sal_emulator(vcpu_get_gr(v,32),vcpu_get_gr(v,33),
+ vcpu_get_gr(v,34),vcpu_get_gr(v,35),
+ vcpu_get_gr(v,36),vcpu_get_gr(v,37),
+ vcpu_get_gr(v,38),vcpu_get_gr(v,39));
+ set_sal_result(v, result);
+}
diff -r 380f87e8003f -r a9d58ef8e4e7 xen/arch/ia64/vmx/vmx_process.c
--- a/xen/arch/ia64/vmx/vmx_process.c Wed May 31 11:27:59 2006 -0600
+++ b/xen/arch/ia64/vmx/vmx_process.c Wed May 31 11:28:03 2006 -0600
@@ -64,6 +64,7 @@ extern void ivhpt_fault (VCPU *vcpu, u64
extern void ivhpt_fault (VCPU *vcpu, u64 vadr);
#define DOMN_PAL_REQUEST 0x110000
+#define DOMN_SAL_REQUEST 0x110001
static UINT64 vec2off[68] = {0x0,0x400,0x800,0xc00,0x1000, 0x1400,0x1800,
0x1c00,0x2000,0x2400,0x2800,0x2c00,0x3000,0x3400,0x3800,0x3c00,0x4000,
@@ -96,85 +97,6 @@ void vmx_reflect_interruption(UINT64 ifa
inject_guest_interruption(vcpu, vector);
}
-static void
-vmx_handle_hypercall (VCPU *v, REGS *regs)
-{
- struct ia64_pal_retval y;
- struct sal_ret_values x;
- unsigned long i, sal_param[8];
-
- switch (regs->r2) {
- case FW_HYPERCALL_PAL_CALL:
- //printf("*** PAL hypercall: index=%d\n",regs->r28);
- //FIXME: This should call a C routine
- y = pal_emulator_static(VCPU(v, vgr[12]));
- regs->r8 = y.status; regs->r9 = y.v0;
- regs->r10 = y.v1; regs->r11 = y.v2;
-#if 0
- if (regs->r8)
- printk("Failed vpal emulation, with index:0x%lx\n",
- VCPU(v, vgr[12]));
-#endif
- break;
- case FW_HYPERCALL_SAL_CALL:
- for (i = 0; i < 8; i++)
- vcpu_get_gr_nat(v, 32+i, &sal_param[i]);
- x = sal_emulator(sal_param[0], sal_param[1],
- sal_param[2], sal_param[3],
- sal_param[4], sal_param[5],
- sal_param[6], sal_param[7]);
- regs->r8 = x.r8; regs->r9 = x.r9;
- regs->r10 = x.r10; regs->r11 = x.r11;
-#if 0
- if (regs->r8)
- printk("Failed vsal emulation, with index:0x%lx\n",
- sal_param[0]);
-#endif
- break;
- case FW_HYPERCALL_EFI_RESET_SYSTEM:
- printf("efi.reset_system called ");
- if (current->domain == dom0) {
- printf("(by dom0)\n ");
- (*efi.reset_system)(EFI_RESET_WARM,0,0,NULL);
- }
- printf("(not supported for non-0 domain)\n");
- regs->r8 = EFI_UNSUPPORTED;
- break;
- case FW_HYPERCALL_EFI_GET_TIME:
- {
- unsigned long *tv, *tc;
- vcpu_get_gr_nat(v, 32, (u64 *)&tv);
- vcpu_get_gr_nat(v, 33, (u64 *)&tc);
- printf("efi_get_time(%p,%p) called...",tv,tc);
- tv = __va(translate_domain_mpaddr((unsigned long)tv));
- if (tc) tc = __va(translate_domain_mpaddr((unsigned long)tc));
- regs->r8 = (*efi.get_time)((efi_time_t *)tv,(efi_time_cap_t
*)tc);
- printf("and returns %lx\n",regs->r8);
- }
- break;
- case FW_HYPERCALL_EFI_SET_TIME:
- case FW_HYPERCALL_EFI_GET_WAKEUP_TIME:
- case FW_HYPERCALL_EFI_SET_WAKEUP_TIME:
- // FIXME: need fixes in efi.h from 2.6.9
- case FW_HYPERCALL_EFI_SET_VIRTUAL_ADDRESS_MAP:
- // FIXME: WARNING!! IF THIS EVER GETS IMPLEMENTED
- // SOME OF THE OTHER EFI EMULATIONS WILL CHANGE AS
- // POINTER ARGUMENTS WILL BE VIRTUAL!!
- case FW_HYPERCALL_EFI_GET_VARIABLE:
- // FIXME: need fixes in efi.h from 2.6.9
- case FW_HYPERCALL_EFI_GET_NEXT_VARIABLE:
- case FW_HYPERCALL_EFI_SET_VARIABLE:
- case FW_HYPERCALL_EFI_GET_NEXT_HIGH_MONO_COUNT:
- // FIXME: need fixes in efi.h from 2.6.9
- regs->r8 = EFI_UNSUPPORTED;
- break;
- }
-#if 0
- if (regs->r8)
- printk("Failed vgfw emulation, with index:0x%lx\n",
- regs->r2);
-#endif
-}
IA64FAULT
vmx_ia64_handle_break (unsigned long ifa, struct pt_regs *regs, unsigned long
isr, unsigned long iim)
@@ -197,13 +119,17 @@ vmx_ia64_handle_break (unsigned long ifa
if (!user_mode(regs)) {
/* Allow hypercalls only when cpl = 0. */
if (iim == d->arch.breakimm) {
- vmx_handle_hypercall (v ,regs);
- vmx_vcpu_increment_iip(current);
+ ia64_hypercall(regs);
+ vmx_vcpu_increment_iip(v);
return IA64_NO_FAULT;
}
else if(iim == DOMN_PAL_REQUEST){
- pal_emul(current);
- vmx_vcpu_increment_iip(current);
+ pal_emul(v);
+ vmx_vcpu_increment_iip(v);
+ return IA64_NO_FAULT;
+ }else if(iim == DOMN_SAL_REQUEST){
+ sal_emul(v);
+ vmx_vcpu_increment_iip(v);
return IA64_NO_FAULT;
}
}
diff -r 380f87e8003f -r a9d58ef8e4e7 xen/include/asm-ia64/vmx_pal.h
--- a/xen/include/asm-ia64/vmx_pal.h Wed May 31 11:27:59 2006 -0600
+++ b/xen/include/asm-ia64/vmx_pal.h Wed May 31 11:28:03 2006 -0600
@@ -115,6 +115,7 @@ ia64_pal_vp_save (u64 *vpd, u64 pal_proc
return iprv.status;
}
extern void pal_emul(struct vcpu *vcpu);
+extern void sal_emul(struct vcpu *vcpu);
#define PAL_PROC_VM_BIT (1UL << 40)
#define PAL_PROC_VMSW_BIT (1UL << 54)
#endif /* _ASM_IA64_VT_PAL_H */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|