1*e49ee290SRichard Kuo /* 2*e49ee290SRichard Kuo * Declarations for to Hexagon Virtal Machine. 3*e49ee290SRichard Kuo * 4*e49ee290SRichard Kuo * Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved. 5*e49ee290SRichard Kuo * 6*e49ee290SRichard Kuo * This program is free software; you can redistribute it and/or modify 7*e49ee290SRichard Kuo * it under the terms of the GNU General Public License version 2 and 8*e49ee290SRichard Kuo * only version 2 as published by the Free Software Foundation. 9*e49ee290SRichard Kuo * 10*e49ee290SRichard Kuo * This program is distributed in the hope that it will be useful, 11*e49ee290SRichard Kuo * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*e49ee290SRichard Kuo * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*e49ee290SRichard Kuo * GNU General Public License for more details. 14*e49ee290SRichard Kuo * 15*e49ee290SRichard Kuo * You should have received a copy of the GNU General Public License 16*e49ee290SRichard Kuo * along with this program; if not, write to the Free Software 17*e49ee290SRichard Kuo * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18*e49ee290SRichard Kuo * 02110-1301, USA. 19*e49ee290SRichard Kuo */ 20*e49ee290SRichard Kuo 21*e49ee290SRichard Kuo #ifndef ASM_HEXAGON_VM_H 22*e49ee290SRichard Kuo #define ASM_HEXAGON_VM_H 23*e49ee290SRichard Kuo 24*e49ee290SRichard Kuo /* 25*e49ee290SRichard Kuo * In principle, a Linux kernel for the VM could 26*e49ee290SRichard Kuo * selectively define the virtual instructions 27*e49ee290SRichard Kuo * as inline assembler macros, but for a first pass, 28*e49ee290SRichard Kuo * we'll use subroutines for both the VM and the native 29*e49ee290SRichard Kuo * kernels. It's costing a subroutine call/return, 30*e49ee290SRichard Kuo * but it makes for a single set of entry points 31*e49ee290SRichard Kuo * for tracing/debugging. 32*e49ee290SRichard Kuo */ 33*e49ee290SRichard Kuo 34*e49ee290SRichard Kuo /* 35*e49ee290SRichard Kuo * Lets make this stuff visible only if configured, 36*e49ee290SRichard Kuo * so we can unconditionally include the file. 37*e49ee290SRichard Kuo */ 38*e49ee290SRichard Kuo 39*e49ee290SRichard Kuo #ifndef __ASSEMBLY__ 40*e49ee290SRichard Kuo 41*e49ee290SRichard Kuo enum VM_CACHE_OPS { 42*e49ee290SRichard Kuo ickill, 43*e49ee290SRichard Kuo dckill, 44*e49ee290SRichard Kuo l2kill, 45*e49ee290SRichard Kuo dccleaninva, 46*e49ee290SRichard Kuo icinva, 47*e49ee290SRichard Kuo idsync, 48*e49ee290SRichard Kuo fetch_cfg 49*e49ee290SRichard Kuo }; 50*e49ee290SRichard Kuo 51*e49ee290SRichard Kuo enum VM_INT_OPS { 52*e49ee290SRichard Kuo nop, 53*e49ee290SRichard Kuo globen, 54*e49ee290SRichard Kuo globdis, 55*e49ee290SRichard Kuo locen, 56*e49ee290SRichard Kuo locdis, 57*e49ee290SRichard Kuo affinity, 58*e49ee290SRichard Kuo get, 59*e49ee290SRichard Kuo peek, 60*e49ee290SRichard Kuo status, 61*e49ee290SRichard Kuo post, 62*e49ee290SRichard Kuo clear 63*e49ee290SRichard Kuo }; 64*e49ee290SRichard Kuo 65*e49ee290SRichard Kuo extern void _K_VM_event_vector(void); 66*e49ee290SRichard Kuo 67*e49ee290SRichard Kuo void __vmrte(void); 68*e49ee290SRichard Kuo long __vmsetvec(void *); 69*e49ee290SRichard Kuo long __vmsetie(long); 70*e49ee290SRichard Kuo long __vmgetie(void); 71*e49ee290SRichard Kuo long __vmintop(enum VM_INT_OPS, long, long, long, long); 72*e49ee290SRichard Kuo long __vmclrmap(void *, unsigned long); 73*e49ee290SRichard Kuo long __vmnewmap(void *); 74*e49ee290SRichard Kuo long __vmcache(enum VM_CACHE_OPS op, unsigned long addr, unsigned long len); 75*e49ee290SRichard Kuo unsigned long long __vmgettime(void); 76*e49ee290SRichard Kuo long __vmsettime(unsigned long long); 77*e49ee290SRichard Kuo long __vmstart(void *, void *); 78*e49ee290SRichard Kuo void __vmstop(void); 79*e49ee290SRichard Kuo long __vmwait(void); 80*e49ee290SRichard Kuo void __vmyield(void); 81*e49ee290SRichard Kuo long __vmvpid(void); 82*e49ee290SRichard Kuo 83*e49ee290SRichard Kuo static inline long __vmcache_ickill(void) 84*e49ee290SRichard Kuo { 85*e49ee290SRichard Kuo return __vmcache(ickill, 0, 0); 86*e49ee290SRichard Kuo } 87*e49ee290SRichard Kuo 88*e49ee290SRichard Kuo static inline long __vmcache_dckill(void) 89*e49ee290SRichard Kuo { 90*e49ee290SRichard Kuo return __vmcache(dckill, 0, 0); 91*e49ee290SRichard Kuo } 92*e49ee290SRichard Kuo 93*e49ee290SRichard Kuo static inline long __vmcache_l2kill(void) 94*e49ee290SRichard Kuo { 95*e49ee290SRichard Kuo return __vmcache(l2kill, 0, 0); 96*e49ee290SRichard Kuo } 97*e49ee290SRichard Kuo 98*e49ee290SRichard Kuo static inline long __vmcache_dccleaninva(unsigned long addr, unsigned long len) 99*e49ee290SRichard Kuo { 100*e49ee290SRichard Kuo return __vmcache(dccleaninva, addr, len); 101*e49ee290SRichard Kuo } 102*e49ee290SRichard Kuo 103*e49ee290SRichard Kuo static inline long __vmcache_icinva(unsigned long addr, unsigned long len) 104*e49ee290SRichard Kuo { 105*e49ee290SRichard Kuo return __vmcache(icinva, addr, len); 106*e49ee290SRichard Kuo } 107*e49ee290SRichard Kuo 108*e49ee290SRichard Kuo static inline long __vmcache_idsync(unsigned long addr, 109*e49ee290SRichard Kuo unsigned long len) 110*e49ee290SRichard Kuo { 111*e49ee290SRichard Kuo return __vmcache(idsync, addr, len); 112*e49ee290SRichard Kuo } 113*e49ee290SRichard Kuo 114*e49ee290SRichard Kuo static inline long __vmcache_fetch_cfg(unsigned long val) 115*e49ee290SRichard Kuo { 116*e49ee290SRichard Kuo return __vmcache(fetch_cfg, val, 0); 117*e49ee290SRichard Kuo } 118*e49ee290SRichard Kuo 119*e49ee290SRichard Kuo /* interrupt operations */ 120*e49ee290SRichard Kuo 121*e49ee290SRichard Kuo static inline long __vmintop_nop(void) 122*e49ee290SRichard Kuo { 123*e49ee290SRichard Kuo return __vmintop(nop, 0, 0, 0, 0); 124*e49ee290SRichard Kuo } 125*e49ee290SRichard Kuo 126*e49ee290SRichard Kuo static inline long __vmintop_globen(long i) 127*e49ee290SRichard Kuo { 128*e49ee290SRichard Kuo return __vmintop(globen, i, 0, 0, 0); 129*e49ee290SRichard Kuo } 130*e49ee290SRichard Kuo 131*e49ee290SRichard Kuo static inline long __vmintop_globdis(long i) 132*e49ee290SRichard Kuo { 133*e49ee290SRichard Kuo return __vmintop(globdis, i, 0, 0, 0); 134*e49ee290SRichard Kuo } 135*e49ee290SRichard Kuo 136*e49ee290SRichard Kuo static inline long __vmintop_locen(long i) 137*e49ee290SRichard Kuo { 138*e49ee290SRichard Kuo return __vmintop(locen, i, 0, 0, 0); 139*e49ee290SRichard Kuo } 140*e49ee290SRichard Kuo 141*e49ee290SRichard Kuo static inline long __vmintop_locdis(long i) 142*e49ee290SRichard Kuo { 143*e49ee290SRichard Kuo return __vmintop(locdis, i, 0, 0, 0); 144*e49ee290SRichard Kuo } 145*e49ee290SRichard Kuo 146*e49ee290SRichard Kuo static inline long __vmintop_affinity(long i, long cpu) 147*e49ee290SRichard Kuo { 148*e49ee290SRichard Kuo return __vmintop(locdis, i, cpu, 0, 0); 149*e49ee290SRichard Kuo } 150*e49ee290SRichard Kuo 151*e49ee290SRichard Kuo static inline long __vmintop_get(void) 152*e49ee290SRichard Kuo { 153*e49ee290SRichard Kuo return __vmintop(get, 0, 0, 0, 0); 154*e49ee290SRichard Kuo } 155*e49ee290SRichard Kuo 156*e49ee290SRichard Kuo static inline long __vmintop_peek(void) 157*e49ee290SRichard Kuo { 158*e49ee290SRichard Kuo return __vmintop(peek, 0, 0, 0, 0); 159*e49ee290SRichard Kuo } 160*e49ee290SRichard Kuo 161*e49ee290SRichard Kuo static inline long __vmintop_status(long i) 162*e49ee290SRichard Kuo { 163*e49ee290SRichard Kuo return __vmintop(status, i, 0, 0, 0); 164*e49ee290SRichard Kuo } 165*e49ee290SRichard Kuo 166*e49ee290SRichard Kuo static inline long __vmintop_post(long i) 167*e49ee290SRichard Kuo { 168*e49ee290SRichard Kuo return __vmintop(post, i, 0, 0, 0); 169*e49ee290SRichard Kuo } 170*e49ee290SRichard Kuo 171*e49ee290SRichard Kuo static inline long __vmintop_clear(long i) 172*e49ee290SRichard Kuo { 173*e49ee290SRichard Kuo return __vmintop(clear, i, 0, 0, 0); 174*e49ee290SRichard Kuo } 175*e49ee290SRichard Kuo 176*e49ee290SRichard Kuo #else /* Only assembly code should reference these */ 177*e49ee290SRichard Kuo 178*e49ee290SRichard Kuo #define HVM_TRAP1_VMRTE 1 179*e49ee290SRichard Kuo #define HVM_TRAP1_VMSETVEC 2 180*e49ee290SRichard Kuo #define HVM_TRAP1_VMSETIE 3 181*e49ee290SRichard Kuo #define HVM_TRAP1_VMGETIE 4 182*e49ee290SRichard Kuo #define HVM_TRAP1_VMINTOP 5 183*e49ee290SRichard Kuo #define HVM_TRAP1_VMCLRMAP 10 184*e49ee290SRichard Kuo #define HVM_TRAP1_VMNEWMAP 11 185*e49ee290SRichard Kuo #define HVM_TRAP1_FORMERLY_VMWIRE 12 186*e49ee290SRichard Kuo #define HVM_TRAP1_VMCACHE 13 187*e49ee290SRichard Kuo #define HVM_TRAP1_VMGETTIME 14 188*e49ee290SRichard Kuo #define HVM_TRAP1_VMSETTIME 15 189*e49ee290SRichard Kuo #define HVM_TRAP1_VMWAIT 16 190*e49ee290SRichard Kuo #define HVM_TRAP1_VMYIELD 17 191*e49ee290SRichard Kuo #define HVM_TRAP1_VMSTART 18 192*e49ee290SRichard Kuo #define HVM_TRAP1_VMSTOP 19 193*e49ee290SRichard Kuo #define HVM_TRAP1_VMVPID 20 194*e49ee290SRichard Kuo #define HVM_TRAP1_VMSETREGS 21 195*e49ee290SRichard Kuo #define HVM_TRAP1_VMGETREGS 22 196*e49ee290SRichard Kuo 197*e49ee290SRichard Kuo #endif /* __ASSEMBLY__ */ 198*e49ee290SRichard Kuo 199*e49ee290SRichard Kuo /* 200*e49ee290SRichard Kuo * Constants for virtual instruction parameters and return values 201*e49ee290SRichard Kuo */ 202*e49ee290SRichard Kuo 203*e49ee290SRichard Kuo /* vmsetie arguments */ 204*e49ee290SRichard Kuo 205*e49ee290SRichard Kuo #define VM_INT_DISABLE 0 206*e49ee290SRichard Kuo #define VM_INT_ENABLE 1 207*e49ee290SRichard Kuo 208*e49ee290SRichard Kuo /* vmsetimask arguments */ 209*e49ee290SRichard Kuo 210*e49ee290SRichard Kuo #define VM_INT_UNMASK 0 211*e49ee290SRichard Kuo #define VM_INT_MASK 1 212*e49ee290SRichard Kuo 213*e49ee290SRichard Kuo #define VM_NEWMAP_TYPE_LINEAR 0 214*e49ee290SRichard Kuo #define VM_NEWMAP_TYPE_PGTABLES 1 215*e49ee290SRichard Kuo 216*e49ee290SRichard Kuo 217*e49ee290SRichard Kuo /* 218*e49ee290SRichard Kuo * Event Record definitions useful to both C and Assembler 219*e49ee290SRichard Kuo */ 220*e49ee290SRichard Kuo 221*e49ee290SRichard Kuo /* VMEST Layout */ 222*e49ee290SRichard Kuo 223*e49ee290SRichard Kuo #define HVM_VMEST_UM_SFT 31 224*e49ee290SRichard Kuo #define HVM_VMEST_UM_MSK 1 225*e49ee290SRichard Kuo #define HVM_VMEST_IE_SFT 30 226*e49ee290SRichard Kuo #define HVM_VMEST_IE_MSK 1 227*e49ee290SRichard Kuo #define HVM_VMEST_EVENTNUM_SFT 16 228*e49ee290SRichard Kuo #define HVM_VMEST_EVENTNUM_MSK 0xff 229*e49ee290SRichard Kuo #define HVM_VMEST_CAUSE_SFT 0 230*e49ee290SRichard Kuo #define HVM_VMEST_CAUSE_MSK 0xffff 231*e49ee290SRichard Kuo 232*e49ee290SRichard Kuo /* 233*e49ee290SRichard Kuo * The initial program gets to find a system environment descriptor 234*e49ee290SRichard Kuo * on its stack when it begins exection. The first word is a version 235*e49ee290SRichard Kuo * code to indicate what is there. Zero means nothing more. 236*e49ee290SRichard Kuo */ 237*e49ee290SRichard Kuo 238*e49ee290SRichard Kuo #define HEXAGON_VM_SED_NULL 0 239*e49ee290SRichard Kuo 240*e49ee290SRichard Kuo /* 241*e49ee290SRichard Kuo * Event numbers for vector binding 242*e49ee290SRichard Kuo */ 243*e49ee290SRichard Kuo 244*e49ee290SRichard Kuo #define HVM_EV_RESET 0 245*e49ee290SRichard Kuo #define HVM_EV_MACHCHECK 1 246*e49ee290SRichard Kuo #define HVM_EV_GENEX 2 247*e49ee290SRichard Kuo #define HVM_EV_TRAP 8 248*e49ee290SRichard Kuo #define HVM_EV_INTR 15 249*e49ee290SRichard Kuo /* These shoud be nuked as soon as we know the VM is up to spec v0.1.1 */ 250*e49ee290SRichard Kuo #define HVM_EV_INTR_0 16 251*e49ee290SRichard Kuo #define HVM_MAX_INTR 240 252*e49ee290SRichard Kuo 253*e49ee290SRichard Kuo /* 254*e49ee290SRichard Kuo * Cause values for General Exception 255*e49ee290SRichard Kuo */ 256*e49ee290SRichard Kuo 257*e49ee290SRichard Kuo #define HVM_GE_C_BUS 0x01 258*e49ee290SRichard Kuo #define HVM_GE_C_XPROT 0x11 259*e49ee290SRichard Kuo #define HVM_GE_C_XUSER 0x14 260*e49ee290SRichard Kuo #define HVM_GE_C_INVI 0x15 261*e49ee290SRichard Kuo #define HVM_GE_C_PRIVI 0x1B 262*e49ee290SRichard Kuo #define HVM_GE_C_XMAL 0x1C 263*e49ee290SRichard Kuo #define HVM_GE_C_RMAL 0x20 264*e49ee290SRichard Kuo #define HVM_GE_C_WMAL 0x21 265*e49ee290SRichard Kuo #define HVM_GE_C_RPROT 0x22 266*e49ee290SRichard Kuo #define HVM_GE_C_WPROT 0x23 267*e49ee290SRichard Kuo #define HVM_GE_C_RUSER 0x24 268*e49ee290SRichard Kuo #define HVM_GE_C_WUSER 0x25 269*e49ee290SRichard Kuo #define HVM_GE_C_CACHE 0x28 270*e49ee290SRichard Kuo 271*e49ee290SRichard Kuo /* 272*e49ee290SRichard Kuo * Cause codes for Machine Check 273*e49ee290SRichard Kuo */ 274*e49ee290SRichard Kuo 275*e49ee290SRichard Kuo #define HVM_MCHK_C_DOWN 0x00 276*e49ee290SRichard Kuo #define HVM_MCHK_C_BADSP 0x01 277*e49ee290SRichard Kuo #define HVM_MCHK_C_BADEX 0x02 278*e49ee290SRichard Kuo #define HVM_MCHK_C_BADPT 0x03 279*e49ee290SRichard Kuo #define HVM_MCHK_C_REGWR 0x29 280*e49ee290SRichard Kuo 281*e49ee290SRichard Kuo #endif 282