~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm/kvm/coproc.h

Version: ~ [ linux-5.13-rc5 ] ~ [ linux-5.12.9 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.42 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.124 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.193 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.235 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.271 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.271 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * Copyright (C) 2012 - Virtual Open Systems and Columbia University
  3  * Authors: 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 
 19 #ifndef __ARM_KVM_COPROC_LOCAL_H__
 20 #define __ARM_KVM_COPROC_LOCAL_H__
 21 
 22 struct coproc_params {
 23         unsigned long CRn;
 24         unsigned long CRm;
 25         unsigned long Op1;
 26         unsigned long Op2;
 27         unsigned long Rt1;
 28         unsigned long Rt2;
 29         bool is_64bit;
 30         bool is_write;
 31 };
 32 
 33 struct coproc_reg {
 34         /* MRC/MCR/MRRC/MCRR instruction which accesses it. */
 35         unsigned long CRn;
 36         unsigned long CRm;
 37         unsigned long Op1;
 38         unsigned long Op2;
 39 
 40         bool is_64;
 41 
 42         /* Trapped access from guest, if non-NULL. */
 43         bool (*access)(struct kvm_vcpu *,
 44                        const struct coproc_params *,
 45                        const struct coproc_reg *);
 46 
 47         /* Initialization for vcpu. */
 48         void (*reset)(struct kvm_vcpu *, const struct coproc_reg *);
 49 
 50         /* Index into vcpu->arch.cp15[], or 0 if we don't need to save it. */
 51         unsigned long reg;
 52 
 53         /* Value (usually reset value) */
 54         u64 val;
 55 };
 56 
 57 static inline void print_cp_instr(const struct coproc_params *p)
 58 {
 59         /* Look, we even formatted it for you to paste into the table! */
 60         if (p->is_64bit) {
 61                 kvm_pr_unimpl(" { CRm64(%2lu), Op1(%2lu), is64, func_%s },\n",
 62                               p->CRn, p->Op1, p->is_write ? "write" : "read");
 63         } else {
 64                 kvm_pr_unimpl(" { CRn(%2lu), CRm(%2lu), Op1(%2lu), Op2(%2lu), is32,"
 65                               " func_%s },\n",
 66                               p->CRn, p->CRm, p->Op1, p->Op2,
 67                               p->is_write ? "write" : "read");
 68         }
 69 }
 70 
 71 static inline bool ignore_write(struct kvm_vcpu *vcpu,
 72                                 const struct coproc_params *p)
 73 {
 74         return true;
 75 }
 76 
 77 static inline bool read_zero(struct kvm_vcpu *vcpu,
 78                              const struct coproc_params *p)
 79 {
 80         *vcpu_reg(vcpu, p->Rt1) = 0;
 81         return true;
 82 }
 83 
 84 static inline bool write_to_read_only(struct kvm_vcpu *vcpu,
 85                                       const struct coproc_params *params)
 86 {
 87         kvm_debug("CP15 write to read-only register at: %08lx\n",
 88                   *vcpu_pc(vcpu));
 89         print_cp_instr(params);
 90         return false;
 91 }
 92 
 93 static inline bool read_from_write_only(struct kvm_vcpu *vcpu,
 94                                         const struct coproc_params *params)
 95 {
 96         kvm_debug("CP15 read to write-only register at: %08lx\n",
 97                   *vcpu_pc(vcpu));
 98         print_cp_instr(params);
 99         return false;
100 }
101 
102 /* Reset functions */
103 static inline void reset_unknown(struct kvm_vcpu *vcpu,
104                                  const struct coproc_reg *r)
105 {
106         BUG_ON(!r->reg);
107         BUG_ON(r->reg >= ARRAY_SIZE(vcpu->arch.cp15));
108         vcpu->arch.cp15[r->reg] = 0xdecafbad;
109 }
110 
111 static inline void reset_val(struct kvm_vcpu *vcpu, const struct coproc_reg *r)
112 {
113         BUG_ON(!r->reg);
114         BUG_ON(r->reg >= ARRAY_SIZE(vcpu->arch.cp15));
115         vcpu->arch.cp15[r->reg] = r->val;
116 }
117 
118 static inline void reset_unknown64(struct kvm_vcpu *vcpu,
119                                    const struct coproc_reg *r)
120 {
121         BUG_ON(!r->reg);
122         BUG_ON(r->reg + 1 >= ARRAY_SIZE(vcpu->arch.cp15));
123 
124         vcpu->arch.cp15[r->reg] = 0xdecafbad;
125         vcpu->arch.cp15[r->reg+1] = 0xd0c0ffee;
126 }
127 
128 static inline int cmp_reg(const struct coproc_reg *i1,
129                           const struct coproc_reg *i2)
130 {
131         BUG_ON(i1 == i2);
132         if (!i1)
133                 return 1;
134         else if (!i2)
135                 return -1;
136         if (i1->CRn != i2->CRn)
137                 return i1->CRn - i2->CRn;
138         if (i1->CRm != i2->CRm)
139                 return i1->CRm - i2->CRm;
140         if (i1->Op1 != i2->Op1)
141                 return i1->Op1 - i2->Op1;
142         if (i1->Op2 != i2->Op2)
143                 return i1->Op2 - i2->Op2;
144         return i2->is_64 - i1->is_64;
145 }
146 
147 
148 #define CRn(_x)         .CRn = _x
149 #define CRm(_x)         .CRm = _x
150 #define CRm64(_x)       .CRn = _x, .CRm = 0
151 #define Op1(_x)         .Op1 = _x
152 #define Op2(_x)         .Op2 = _x
153 #define is64            .is_64 = true
154 #define is32            .is_64 = false
155 
156 bool access_sctlr(struct kvm_vcpu *vcpu,
157                   const struct coproc_params *p,
158                   const struct coproc_reg *r);
159 
160 #endif /* __ARM_KVM_COPROC_LOCAL_H__ */
161 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp