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