cregit-Linux how code gets into the kernel

Release 4.11 arch/arm/include/asm/kvm_emulate.h

/*
 * Copyright (C) 2012 - Virtual Open Systems and Columbia University
 * Author: Christoffer Dall <c.dall@virtualopensystems.com>
 *
 * 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.
 */

#ifndef __ARM_KVM_EMULATE_H__

#define __ARM_KVM_EMULATE_H__

#include <linux/kvm_host.h>
#include <asm/kvm_asm.h>
#include <asm/kvm_mmio.h>
#include <asm/kvm_arm.h>
#include <asm/cputype.h>

unsigned long *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num);
unsigned long *vcpu_spsr(struct kvm_vcpu *vcpu);


static inline unsigned long vcpu_get_reg(struct kvm_vcpu *vcpu, u8 reg_num) { return *vcpu_reg(vcpu, reg_num); }

Contributors

PersonTokensPropCommitsCommitProp
Pavel Fedin25100.00%1100.00%
Total25100.00%1100.00%


static inline void vcpu_set_reg(struct kvm_vcpu *vcpu, u8 reg_num, unsigned long val) { *vcpu_reg(vcpu, reg_num) = val; }

Contributors

PersonTokensPropCommitsCommitProp
Pavel Fedin29100.00%1100.00%
Total29100.00%1100.00%

bool kvm_condition_valid32(const struct kvm_vcpu *vcpu); void kvm_skip_instr32(struct kvm_vcpu *vcpu, bool is_wide_instr); void kvm_inject_undefined(struct kvm_vcpu *vcpu); void kvm_inject_vabt(struct kvm_vcpu *vcpu); void kvm_inject_dabt(struct kvm_vcpu *vcpu, unsigned long addr); void kvm_inject_pabt(struct kvm_vcpu *vcpu, unsigned long addr);
static inline bool kvm_condition_valid(const struct kvm_vcpu *vcpu) { return kvm_condition_valid32(vcpu); }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier19100.00%1100.00%
Total19100.00%1100.00%


static inline void kvm_skip_instr(struct kvm_vcpu *vcpu, bool is_wide_instr) { kvm_skip_instr32(vcpu, is_wide_instr); }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier22100.00%1100.00%
Total22100.00%1100.00%


static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu) { vcpu->arch.hcr = HCR_GUEST_MASK; }

Contributors

PersonTokensPropCommitsCommitProp
Christoffer Dall20100.00%1100.00%
Total20100.00%1100.00%


static inline unsigned long vcpu_get_hcr(const struct kvm_vcpu *vcpu) { return vcpu->arch.hcr; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier21100.00%2100.00%
Total21100.00%2100.00%


static inline void vcpu_set_hcr(struct kvm_vcpu *vcpu, unsigned long hcr) { vcpu->arch.hcr = hcr; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier24100.00%1100.00%
Total24100.00%1100.00%


static inline bool vcpu_mode_is_32bit(const struct kvm_vcpu *vcpu) { return 1; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier16100.00%2100.00%
Total16100.00%2100.00%


static inline unsigned long *vcpu_pc(struct kvm_vcpu *vcpu) { return &vcpu->arch.ctxt.gp_regs.usr_regs.ARM_pc; }

Contributors

PersonTokensPropCommitsCommitProp
Christoffer Dall2382.14%133.33%
Marc Zyngier517.86%266.67%
Total28100.00%3100.00%


static inline unsigned long *vcpu_cpsr(const struct kvm_vcpu *vcpu) { return (unsigned long *)&vcpu->arch.ctxt.gp_regs.usr_regs.ARM_cpsr; }

Contributors

PersonTokensPropCommitsCommitProp
Christoffer Dall2367.65%125.00%
Marc Zyngier1132.35%375.00%
Total34100.00%4100.00%


static inline void vcpu_set_thumb(struct kvm_vcpu *vcpu) { *vcpu_cpsr(vcpu) |= PSR_T_BIT; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier20100.00%1100.00%
Total20100.00%1100.00%


static inline bool mode_has_spsr(struct kvm_vcpu *vcpu) { unsigned long cpsr_mode = vcpu->arch.ctxt.gp_regs.usr_regs.ARM_cpsr & MODE_MASK; return (cpsr_mode > USR_MODE && cpsr_mode < SYSTEM_MODE); }

Contributors

PersonTokensPropCommitsCommitProp
Christoffer Dall3892.68%150.00%
Marc Zyngier37.32%150.00%
Total41100.00%2100.00%


static inline bool vcpu_mode_priv(struct kvm_vcpu *vcpu) { unsigned long cpsr_mode = vcpu->arch.ctxt.gp_regs.usr_regs.ARM_cpsr & MODE_MASK; return cpsr_mode > USR_MODE;; }

Contributors

PersonTokensPropCommitsCommitProp
Christoffer Dall3391.67%150.00%
Marc Zyngier38.33%150.00%
Total36100.00%2100.00%


static inline u32 kvm_vcpu_get_hsr(const struct kvm_vcpu *vcpu) { return vcpu->arch.fault.hsr; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier22100.00%2100.00%
Total22100.00%2100.00%


static inline int kvm_vcpu_get_condition(const struct kvm_vcpu *vcpu) { u32 hsr = kvm_vcpu_get_hsr(vcpu); if (hsr & HSR_CV) return (hsr & HSR_COND) >> HSR_COND_SHIFT; return -1; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier40100.00%1100.00%
Total40100.00%1100.00%


static inline unsigned long kvm_vcpu_get_hfar(struct kvm_vcpu *vcpu) { return vcpu->arch.fault.hxfar; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier22100.00%1100.00%
Total22100.00%1100.00%


static inline phys_addr_t kvm_vcpu_get_fault_ipa(struct kvm_vcpu *vcpu) { return ((phys_addr_t)vcpu->arch.fault.hpfar & HPFAR_MASK) << 8; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier30100.00%1100.00%
Total30100.00%1100.00%


static inline bool kvm_vcpu_dabt_isvalid(struct kvm_vcpu *vcpu) { return kvm_vcpu_get_hsr(vcpu) & HSR_ISV; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier20100.00%1100.00%
Total20100.00%1100.00%


static inline bool kvm_vcpu_dabt_iswrite(struct kvm_vcpu *vcpu) { return kvm_vcpu_get_hsr(vcpu) & HSR_WNR; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier20100.00%1100.00%
Total20100.00%1100.00%


static inline bool kvm_vcpu_dabt_issext(struct kvm_vcpu *vcpu) { return kvm_vcpu_get_hsr(vcpu) & HSR_SSE; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier20100.00%1100.00%
Total20100.00%1100.00%


static inline int kvm_vcpu_dabt_get_rd(struct kvm_vcpu *vcpu) { return (kvm_vcpu_get_hsr(vcpu) & HSR_SRT_MASK) >> HSR_SRT_SHIFT; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier24100.00%1100.00%
Total24100.00%1100.00%


static inline bool kvm_vcpu_dabt_isextabt(struct kvm_vcpu *vcpu) { return kvm_vcpu_get_hsr(vcpu) & HSR_DABT_EA; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier20100.00%1100.00%
Total20100.00%1100.00%


static inline bool kvm_vcpu_dabt_iss1tw(struct kvm_vcpu *vcpu) { return kvm_vcpu_get_hsr(vcpu) & HSR_DABT_S1PTW; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier20100.00%1100.00%
Total20100.00%1100.00%


static inline bool kvm_vcpu_dabt_is_cm(struct kvm_vcpu *vcpu) { return !!(kvm_vcpu_get_hsr(vcpu) & HSR_DABT_CM); }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier24100.00%1100.00%
Total24100.00%1100.00%

/* Get Access Size from a data abort */
static inline int kvm_vcpu_dabt_get_as(struct kvm_vcpu *vcpu) { switch ((kvm_vcpu_get_hsr(vcpu) >> 22) & 0x3) { case 0: return 1; case 1: return 2; case 2: return 4; default: kvm_err("Hardware is weird: SAS 0b11 is reserved\n"); return -EFAULT; } }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier55100.00%1100.00%
Total55100.00%1100.00%

/* This one is not specific to Data Abort */
static inline bool kvm_vcpu_trap_il_is32bit(struct kvm_vcpu *vcpu) { return kvm_vcpu_get_hsr(vcpu) & HSR_IL; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier20100.00%1100.00%
Total20100.00%1100.00%


static inline u8 kvm_vcpu_trap_get_class(struct kvm_vcpu *vcpu) { return kvm_vcpu_get_hsr(vcpu) >> HSR_EC_SHIFT; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier20100.00%1100.00%
Total20100.00%1100.00%


static inline bool kvm_vcpu_trap_is_iabt(struct kvm_vcpu *vcpu) { return kvm_vcpu_trap_get_class(vcpu) == HSR_EC_IABT; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier20100.00%1100.00%
Total20100.00%1100.00%


static inline u8 kvm_vcpu_trap_get_fault(struct kvm_vcpu *vcpu) { return kvm_vcpu_get_hsr(vcpu) & HSR_FSC; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier1470.00%150.00%
Christoffer Dall630.00%150.00%
Total20100.00%2100.00%


static inline u8 kvm_vcpu_trap_get_fault_type(struct kvm_vcpu *vcpu) { return kvm_vcpu_get_hsr(vcpu) & HSR_FSC_TYPE; }

Contributors

PersonTokensPropCommitsCommitProp
Christoffer Dall1470.00%150.00%
Marc Zyngier630.00%150.00%
Total20100.00%2100.00%


static inline u32 kvm_vcpu_hvc_get_imm(struct kvm_vcpu *vcpu) { return kvm_vcpu_get_hsr(vcpu) & HSR_HVC_IMM_MASK; }

Contributors

PersonTokensPropCommitsCommitProp
Christoffer Dall20100.00%1100.00%
Total20100.00%1100.00%


static inline unsigned long kvm_vcpu_get_mpidr_aff(struct kvm_vcpu *vcpu) { return vcpu_cp15(vcpu, c0_MPIDR) & MPIDR_HWID_BITMASK; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier2086.96%266.67%
Andre Przywara313.04%133.33%
Total23100.00%3100.00%


static inline void kvm_vcpu_set_be(struct kvm_vcpu *vcpu) { *vcpu_cpsr(vcpu) |= PSR_E_BIT; }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier20100.00%1100.00%
Total20100.00%1100.00%


static inline bool kvm_vcpu_is_be(struct kvm_vcpu *vcpu) { return !!(*vcpu_cpsr(vcpu) & PSR_E_BIT); }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier25100.00%1100.00%
Total25100.00%1100.00%


static inline unsigned long vcpu_data_guest_to_host(struct kvm_vcpu *vcpu, unsigned long data, unsigned int len) { if (kvm_vcpu_is_be(vcpu)) { switch (len) { case 1: return data & 0xff; case 2: return be16_to_cpu(data & 0xffff); default: return be32_to_cpu(data); } } else { switch (len) { case 1: return data & 0xff; case 2: return le16_to_cpu(data & 0xffff); default: return le32_to_cpu(data); } } }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier6567.01%150.00%
Victor Kamensky3232.99%150.00%
Total97100.00%2100.00%


static inline unsigned long vcpu_data_host_to_guest(struct kvm_vcpu *vcpu, unsigned long data, unsigned int len) { if (kvm_vcpu_is_be(vcpu)) { switch (len) { case 1: return data & 0xff; case 2: return cpu_to_be16(data & 0xffff); default: return cpu_to_be32(data); } } else { switch (len) { case 1: return data & 0xff; case 2: return cpu_to_le16(data & 0xffff); default: return cpu_to_le32(data); } } }

Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier6567.01%150.00%
Victor Kamensky3232.99%150.00%
Total97100.00%2100.00%

#endif /* __ARM_KVM_EMULATE_H__ */

Overall Contributors

PersonTokensPropCommitsCommitProp
Marc Zyngier76566.41%2472.73%
Christoffer Dall26322.83%618.18%
Victor Kamensky645.56%13.03%
Pavel Fedin544.69%13.03%
Andre Przywara60.52%13.03%
Total1152100.00%33100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.