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