linux/arch/arm/kvm/reset.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2012 - Virtual Open Systems and Columbia University
   3 * Author: Christoffer Dall <c.dall@virtualopensystems.com>
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License, version 2, as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write to the Free Software
  16 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17 */
  18#include <linux/compiler.h>
  19#include <linux/errno.h>
  20#include <linux/sched.h>
  21#include <linux/kvm_host.h>
  22#include <linux/kvm.h>
  23
  24#include <asm/unified.h>
  25#include <asm/ptrace.h>
  26#include <asm/cputype.h>
  27#include <asm/kvm_arm.h>
  28#include <asm/kvm_coproc.h>
  29
  30/******************************************************************************
  31 * Cortex-A15 Reset Values
  32 */
  33
  34static const int a15_max_cpu_idx = 3;
  35
  36static struct kvm_regs a15_regs_reset = {
  37        .usr_regs.ARM_cpsr = SVC_MODE | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT,
  38};
  39
  40
  41/*******************************************************************************
  42 * Exported reset function
  43 */
  44
  45/**
  46 * kvm_reset_vcpu - sets core registers and cp15 registers to reset value
  47 * @vcpu: The VCPU pointer
  48 *
  49 * This function finds the right table above and sets the registers on the
  50 * virtual CPU struct to their architectually defined reset values.
  51 */
  52int kvm_reset_vcpu(struct kvm_vcpu *vcpu)
  53{
  54        struct kvm_regs *cpu_reset;
  55
  56        switch (vcpu->arch.target) {
  57        case KVM_ARM_TARGET_CORTEX_A15:
  58                if (vcpu->vcpu_id > a15_max_cpu_idx)
  59                        return -EINVAL;
  60                cpu_reset = &a15_regs_reset;
  61                vcpu->arch.midr = read_cpuid_id();
  62                break;
  63        default:
  64                return -ENODEV;
  65        }
  66
  67        /* Reset core registers */
  68        memcpy(&vcpu->arch.regs, cpu_reset, sizeof(vcpu->arch.regs));
  69
  70        /* Reset CP15 registers */
  71        kvm_reset_coprocs(vcpu);
  72
  73        return 0;
  74}
  75