rc = IA64_RETRY;
}
if (rc == IA64_RETRY) {
+ PSCBX(current, fpswa_ret) = (fpswa_ret_t){IA64_RETRY, 0, 0, 0};
gdprintk(XENLOG_DEBUG,
"%s(%s): floating-point bundle at 0x%lx not mapped\n",
__FUNCTION__, fp_fault ? "fault" : "trap", fault_ip);
&isr, ®s->pr, ®s->cr_ifs, regs);
if (ret.status) {
+ PSCBX(current, fpswa_ret) = ret;
printk("%s(%s): fp_emulate() returned %ld\n",
__FUNCTION__, fp_fault ? "fault" : "trap", ret.status);
}
struct page_info *hv_page = NULL;
XEN_EFI_RR_DECLARE(rr6, rr7);
+ if (unlikely(PSCBX(v, fpswa_ret).status != 0 &&
+ PSCBX(v, fpswa_ret).status != IA64_RETRY)) {
+ ret = PSCBX(v, fpswa_ret);
+ PSCBX(v, fpswa_ret) = (fpswa_ret_t){0, 0, 0, 0};
+ return ret;
+ }
+
if (!fpswa_interface)
goto error;
char irq_new_condition; // vpsr.i/vtpr change, check for pending VHPI
char hypercall_continuation;
+ fpswa_ret_t fpswa_ret; /* save return values of FPSWA emulation */
struct timer hlt_timer;
struct arch_vmx_struct arch_vmx; /* Virtual Machine Extensions */