On Mon, May 15, 2017 at 06:43:51PM +0100, James Morse wrote: > KVM calls hyp_panic() when anything unexpected happens. This may occur > while a guest owns the EL1 registers. KVM stashes the vcpu pointer in > tpidr_el2, which it uses to find the host context in order to restore > the host EL1 registers before parachuting into the host's panic(). > > The host context is a struct kvm_cpu_context allocated in the per-cpu > area, and mapped to hyp. Given the per-cpu offset for this CPU, this is > easy to find. Change hyp_panic() to take a pointer to the > struct kvm_cpu_context. Wrap these calls with an asm function that > retrieves the struct kvm_cpu_context from the host's per-cpu area. > > Copy the per-cpu offset from the hosts tpidr_el1 into tpidr_el2 during > kvm init. (Later patches will make this unnecessary for VHE hosts) > > We print out the vcpu pointer as part of the panic message. Add a back > reference to the 'running vcpu' in the host cpu context to preserve this. > > Signed-off-by: James Morse <james.morse@xxxxxxx> > --- > arch/arm64/include/asm/kvm_host.h | 2 ++ > arch/arm64/kvm/hyp/hyp-entry.S | 7 +++++++ > arch/arm64/kvm/hyp/s2-setup.c | 3 +++ > arch/arm64/kvm/hyp/switch.c | 25 +++++++++++++------------ > 4 files changed, 25 insertions(+), 12 deletions(-) > > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h > index 5e19165c5fa8..1407bfc81e9e 100644 > --- a/arch/arm64/include/asm/kvm_host.h > +++ b/arch/arm64/include/asm/kvm_host.h > @@ -188,6 +188,8 @@ struct kvm_cpu_context { > u64 sys_regs[NR_SYS_REGS]; > u32 copro[NR_COPRO_REGS]; > }; > + > + struct kvm_vcpu *__hyp_running_vcpu; > }; > > typedef struct kvm_cpu_context kvm_cpu_context_t; > diff --git a/arch/arm64/kvm/hyp/hyp-entry.S b/arch/arm64/kvm/hyp/hyp-entry.S > index fce7cc507e0a..0f83e7e402ad 100644 > --- a/arch/arm64/kvm/hyp/hyp-entry.S > +++ b/arch/arm64/kvm/hyp/hyp-entry.S > @@ -163,6 +163,13 @@ ENTRY(__hyp_do_panic) > eret > ENDPROC(__hyp_do_panic) > > +ENTRY(__hyp_panic) > + ldr x0, =kvm_host_cpu_state Why is this guaranteed to give us a valid EL2 address? > + mrs x1, tpidr_el2 > + add x0, x0, x1 > + b hyp_panic > +ENDPROC(__hyp_panic) > + Thanks, -Christoffer -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html