mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
d94d71cb45
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license version 2 as published by the free software foundation this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details you should have received a copy of the gnu general public license along with this program if not write to the free software foundation 51 franklin street fifth floor boston ma 02110 1301 usa extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 67 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Richard Fontana <rfontana@redhat.com> Reviewed-by: Alexios Zavras <alexios.zavras@intel.com> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190529141333.953658117@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
87 lines
2.1 KiB
C
87 lines
2.1 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Copyright (C) 2012 - Virtual Open Systems and Columbia University
|
|
* Author: Christoffer Dall <c.dall@virtualopensystems.com>
|
|
*/
|
|
#include <linux/compiler.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/kvm_host.h>
|
|
#include <linux/kvm.h>
|
|
|
|
#include <asm/unified.h>
|
|
#include <asm/ptrace.h>
|
|
#include <asm/cputype.h>
|
|
#include <asm/kvm_arm.h>
|
|
#include <asm/kvm_coproc.h>
|
|
#include <asm/kvm_emulate.h>
|
|
|
|
#include <kvm/arm_arch_timer.h>
|
|
|
|
/******************************************************************************
|
|
* Cortex-A15 and Cortex-A7 Reset Values
|
|
*/
|
|
|
|
static struct kvm_regs cortexa_regs_reset = {
|
|
.usr_regs.ARM_cpsr = SVC_MODE | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT,
|
|
};
|
|
|
|
|
|
/*******************************************************************************
|
|
* Exported reset function
|
|
*/
|
|
|
|
/**
|
|
* kvm_reset_vcpu - sets core registers and cp15 registers to reset value
|
|
* @vcpu: The VCPU pointer
|
|
*
|
|
* This function finds the right table above and sets the registers on the
|
|
* virtual CPU struct to their architecturally defined reset values.
|
|
*/
|
|
int kvm_reset_vcpu(struct kvm_vcpu *vcpu)
|
|
{
|
|
struct kvm_regs *reset_regs;
|
|
|
|
switch (vcpu->arch.target) {
|
|
case KVM_ARM_TARGET_CORTEX_A7:
|
|
case KVM_ARM_TARGET_CORTEX_A15:
|
|
reset_regs = &cortexa_regs_reset;
|
|
vcpu->arch.midr = read_cpuid_id();
|
|
break;
|
|
default:
|
|
return -ENODEV;
|
|
}
|
|
|
|
/* Reset core registers */
|
|
memcpy(&vcpu->arch.ctxt.gp_regs, reset_regs, sizeof(vcpu->arch.ctxt.gp_regs));
|
|
|
|
/* Reset CP15 registers */
|
|
kvm_reset_coprocs(vcpu);
|
|
|
|
/*
|
|
* Additional reset state handling that PSCI may have imposed on us.
|
|
* Must be done after all the sys_reg reset.
|
|
*/
|
|
if (READ_ONCE(vcpu->arch.reset_state.reset)) {
|
|
unsigned long target_pc = vcpu->arch.reset_state.pc;
|
|
|
|
/* Gracefully handle Thumb2 entry point */
|
|
if (target_pc & 1) {
|
|
target_pc &= ~1UL;
|
|
vcpu_set_thumb(vcpu);
|
|
}
|
|
|
|
/* Propagate caller endianness */
|
|
if (vcpu->arch.reset_state.be)
|
|
kvm_vcpu_set_be(vcpu);
|
|
|
|
*vcpu_pc(vcpu) = target_pc;
|
|
vcpu_set_reg(vcpu, 0, vcpu->arch.reset_state.r0);
|
|
|
|
vcpu->arch.reset_state.reset = false;
|
|
}
|
|
|
|
/* Reset arch_timer context */
|
|
return kvm_timer_vcpu_reset(vcpu);
|
|
}
|