| 1985 | } |
| 1986 | |
| 1987 | int |
| 1988 | vm_entry_intinfo(struct vm *vm, int vcpuid, uint64_t *retinfo) |
| 1989 | { |
| 1990 | struct vcpu *vcpu; |
| 1991 | uint64_t info1, info2; |
| 1992 | int valid; |
| 1993 | |
| 1994 | KASSERT(vcpuid >= 0 && |
| 1995 | vcpuid < vm->maxcpus, ("invalid vcpu %d", vcpuid)); |
| 1996 | |
| 1997 | vcpu = &vm->vcpu[vcpuid]; |
| 1998 | |
| 1999 | info1 = vcpu->exitintinfo; |
| 2000 | vcpu->exitintinfo = 0; |
| 2001 | |
| 2002 | info2 = 0; |
| 2003 | if (vcpu->exception_pending) { |
| 2004 | info2 = vcpu_exception_intinfo(vcpu); |
| 2005 | vcpu->exception_pending = 0; |
| 2006 | VCPU_CTR2(vm, vcpuid, "Exception %d delivered: %#lx", |
| 2007 | vcpu->exc_vector, info2); |
| 2008 | } |
| 2009 | |
| 2010 | if ((info1 & VM_INTINFO_VALID) && (info2 & VM_INTINFO_VALID)) { |
| 2011 | valid = nested_fault(vm, vcpuid, info1, info2, retinfo); |
| 2012 | } else if (info1 & VM_INTINFO_VALID) { |
| 2013 | *retinfo = info1; |
| 2014 | valid = 1; |
| 2015 | } else if (info2 & VM_INTINFO_VALID) { |
| 2016 | *retinfo = info2; |
| 2017 | valid = 1; |
| 2018 | } else { |
| 2019 | valid = 0; |
| 2020 | } |
| 2021 | |
| 2022 | if (valid) { |
| 2023 | VCPU_CTR4(vm, vcpuid, "%s: info1(%#lx), info2(%#lx), " |
| 2024 | "retinfo(%#lx)", __func__, info1, info2, *retinfo); |
| 2025 | } |
| 2026 | |
| 2027 | return (valid); |
| 2028 | } |
| 2029 | |
| 2030 | int |
| 2031 | vm_get_intinfo(struct vm *vm, int vcpuid, uint64_t *info1, uint64_t *info2) |
no test coverage detected