From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mukesh Rathor Subject: Re: [RFC PATCH 12/16]: PVH xen: return PVH features during creation, etc... Date: Thu, 17 Jan 2013 18:29:03 -0800 Message-ID: <20130117182903.7bcb8da6@mantra.us.oracle.com> References: <20130111180736.36c662d6@mantra.us.oracle.com> <50F4060C02000078000B5453@nat28.tlf.novell.com> <20130117153617.203b1aeb@mantra.us.oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20130117153617.203b1aeb@mantra.us.oracle.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich Cc: xen-devel List-Id: xen-devel@lists.xenproject.org On Thu, 17 Jan 2013 15:36:17 -0800 Mukesh Rathor wrote: > On Mon, 14 Jan 2013 12:20:12 +0000 > "Jan Beulich" wrote: > Agree, I need to make propgate_page_fault() inject PF into the PVH > guest. Working on it now. Done. No other callers of prop_page_fault for PVH. So are you OK with something like this: static noinline int vmxit_invalid_op(struct cpu_user_regs *regs) { ulong addr=0; if ( guest_kernel_mode(current, regs) || (addr = emulate_forced_invalid_op(regs)) == 0 ) { hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); return 0; } if (addr != EXCRET_fault_fixed) hvm_inject_page_fault(0, addr); return 0; } unsigned long emulate_forced_invalid_op(struct cpu_user_regs *regs) { char sig[5], instr[2]; unsigned long eip, rc, addr; eip = regs->eip; /* Check for forced emulation signature: ud2 ; .ascii "xen". */ if ( (rc = raw_copy_from_guest(sig, (char *)eip, sizeof(sig))) != 0 ) { addr = eip + sizeof(sig) - rc; if ( is_pvh_vcpu(current) ) return addr; propagate_page_fault(addr, 0); return EXCRET_fault_fixed; } if ( memcmp(sig, "\xf\xbxen", sizeof(sig)) ) return 0; eip += sizeof(sig); /* We only emulate CPUID. */ if ( ( rc = raw_copy_from_guest(instr, (char *)eip, sizeof(instr))) != 0 ) { addr = eip + sizeof(instr) - rc; if ( is_pvh_vcpu(current) ) return addr; propagate_page_fault(addr, 0); return EXCRET_fault_fixed; } if ( memcmp(instr, "\xf\xa2", sizeof(instr)) ) return 0; eip += sizeof(instr); pv_cpuid(regs); if ( is_pvh_vcpu(current) ) regs->eip = eip; else instruction_done(regs, eip, 0); trace_trap_one_addr(TRC_PV_FORCED_INVALID_OP, regs->eip); return EXCRET_fault_fixed; Thanks, Mukesh