Path: blob/master/arch/hexagon/include/asm/hexagon_vm.h
26481 views
/* SPDX-License-Identifier: GPL-2.0-only */1/*2* Declarations for to Hexagon Virtal Machine.3*4* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.5*/67#ifndef ASM_HEXAGON_VM_H8#define ASM_HEXAGON_VM_H910/*11* In principle, a Linux kernel for the VM could12* selectively define the virtual instructions13* as inline assembler macros, but for a first pass,14* we'll use subroutines for both the VM and the native15* kernels. It's costing a subroutine call/return,16* but it makes for a single set of entry points17* for tracing/debugging.18*/1920#define HVM_TRAP1_VMVERSION 021#define HVM_TRAP1_VMRTE 122#define HVM_TRAP1_VMSETVEC 223#define HVM_TRAP1_VMSETIE 324#define HVM_TRAP1_VMGETIE 425#define HVM_TRAP1_VMINTOP 526#define HVM_TRAP1_VMCLRMAP 1027#define HVM_TRAP1_VMNEWMAP 1128#define HVM_TRAP1_FORMERLY_VMWIRE 1229#define HVM_TRAP1_VMCACHE 1330#define HVM_TRAP1_VMGETTIME 1431#define HVM_TRAP1_VMSETTIME 1532#define HVM_TRAP1_VMWAIT 1633#define HVM_TRAP1_VMYIELD 1734#define HVM_TRAP1_VMSTART 1835#define HVM_TRAP1_VMSTOP 1936#define HVM_TRAP1_VMVPID 2037#define HVM_TRAP1_VMSETREGS 2138#define HVM_TRAP1_VMGETREGS 2239#define HVM_TRAP1_VMTIMEROP 244041#ifndef __ASSEMBLY__4243enum VM_CACHE_OPS {44hvmc_ickill,45hvmc_dckill,46hvmc_l2kill,47hvmc_dccleaninva,48hvmc_icinva,49hvmc_idsync,50hvmc_fetch_cfg51};5253enum VM_INT_OPS {54hvmi_nop,55hvmi_globen,56hvmi_globdis,57hvmi_locen,58hvmi_locdis,59hvmi_affinity,60hvmi_get,61hvmi_peek,62hvmi_status,63hvmi_post,64hvmi_clear65};6667extern void _K_VM_event_vector(void);6869void __vmrte(void);70long __vmsetvec(void *);71long __vmsetie(long);72long __vmgetie(void);73long __vmintop(enum VM_INT_OPS, long, long, long, long);74long __vmclrmap(void *, unsigned long);75long __vmnewmap(void *);76long __vmcache(enum VM_CACHE_OPS op, unsigned long addr, unsigned long len);77unsigned long long __vmgettime(void);78long __vmsettime(unsigned long long);79long __vmstart(void *, void *);80void __vmstop(void);81long __vmwait(void);82void __vmyield(void);83long __vmvpid(void);8485static inline long __vmcache_ickill(void)86{87return __vmcache(hvmc_ickill, 0, 0);88}8990static inline long __vmcache_dckill(void)91{92return __vmcache(hvmc_dckill, 0, 0);93}9495static inline long __vmcache_l2kill(void)96{97return __vmcache(hvmc_l2kill, 0, 0);98}99100static inline long __vmcache_dccleaninva(unsigned long addr, unsigned long len)101{102return __vmcache(hvmc_dccleaninva, addr, len);103}104105static inline long __vmcache_icinva(unsigned long addr, unsigned long len)106{107return __vmcache(hvmc_icinva, addr, len);108}109110static inline long __vmcache_idsync(unsigned long addr,111unsigned long len)112{113return __vmcache(hvmc_idsync, addr, len);114}115116static inline long __vmcache_fetch_cfg(unsigned long val)117{118return __vmcache(hvmc_fetch_cfg, val, 0);119}120121/* interrupt operations */122123static inline long __vmintop_nop(void)124{125return __vmintop(hvmi_nop, 0, 0, 0, 0);126}127128static inline long __vmintop_globen(long i)129{130return __vmintop(hvmi_globen, i, 0, 0, 0);131}132133static inline long __vmintop_globdis(long i)134{135return __vmintop(hvmi_globdis, i, 0, 0, 0);136}137138static inline long __vmintop_locen(long i)139{140return __vmintop(hvmi_locen, i, 0, 0, 0);141}142143static inline long __vmintop_locdis(long i)144{145return __vmintop(hvmi_locdis, i, 0, 0, 0);146}147148static inline long __vmintop_affinity(long i, long cpu)149{150return __vmintop(hvmi_affinity, i, cpu, 0, 0);151}152153static inline long __vmintop_get(void)154{155return __vmintop(hvmi_get, 0, 0, 0, 0);156}157158static inline long __vmintop_peek(void)159{160return __vmintop(hvmi_peek, 0, 0, 0, 0);161}162163static inline long __vmintop_status(long i)164{165return __vmintop(hvmi_status, i, 0, 0, 0);166}167168static inline long __vmintop_post(long i)169{170return __vmintop(hvmi_post, i, 0, 0, 0);171}172173static inline long __vmintop_clear(long i)174{175return __vmintop(hvmi_clear, i, 0, 0, 0);176}177178#else /* Only assembly code should reference these */179180#endif /* __ASSEMBLY__ */181182/*183* Constants for virtual instruction parameters and return values184*/185186/* vmnewmap arguments */187188#define VM_TRANS_TYPE_LINEAR 0189#define VM_TRANS_TYPE_TABLE 1190#define VM_TLB_INVALIDATE_FALSE 0191#define VM_TLB_INVALIDATE_TRUE 1192193/* vmsetie arguments */194195#define VM_INT_DISABLE 0196#define VM_INT_ENABLE 1197198/* vmsetimask arguments */199200#define VM_INT_UNMASK 0201#define VM_INT_MASK 1202203#define VM_NEWMAP_TYPE_LINEAR 0204#define VM_NEWMAP_TYPE_PGTABLES 1205206207/*208* Event Record definitions useful to both C and Assembler209*/210211/* VMEST Layout */212213#define HVM_VMEST_UM_SFT 31214#define HVM_VMEST_UM_MSK 1215#define HVM_VMEST_IE_SFT 30216#define HVM_VMEST_IE_MSK 1217#define HVM_VMEST_SS_SFT 29218#define HVM_VMEST_SS_MSK 1219#define HVM_VMEST_EVENTNUM_SFT 16220#define HVM_VMEST_EVENTNUM_MSK 0xff221#define HVM_VMEST_CAUSE_SFT 0222#define HVM_VMEST_CAUSE_MSK 0xffff223224/*225* The initial program gets to find a system environment descriptor226* on its stack when it begins execution. The first word is a version227* code to indicate what is there. Zero means nothing more.228*/229230#define HEXAGON_VM_SED_NULL 0231232/*233* Event numbers for vector binding234*/235236#define HVM_EV_RESET 0237#define HVM_EV_MACHCHECK 1238#define HVM_EV_GENEX 2239#define HVM_EV_TRAP 8240#define HVM_EV_INTR 15241/* These shoud be nuked as soon as we know the VM is up to spec v0.1.1 */242#define HVM_EV_INTR_0 16243#define HVM_MAX_INTR 240244245/*246* Cause values for General Exception247*/248249#define HVM_GE_C_BUS 0x01250#define HVM_GE_C_XPROT 0x11251#define HVM_GE_C_XUSER 0x14252#define HVM_GE_C_INVI 0x15253#define HVM_GE_C_PRIVI 0x1B254#define HVM_GE_C_XMAL 0x1C255#define HVM_GE_C_WREG 0x1D256#define HVM_GE_C_PCAL 0x1E257#define HVM_GE_C_RMAL 0x20258#define HVM_GE_C_WMAL 0x21259#define HVM_GE_C_RPROT 0x22260#define HVM_GE_C_WPROT 0x23261#define HVM_GE_C_RUSER 0x24262#define HVM_GE_C_WUSER 0x25263#define HVM_GE_C_CACHE 0x28264265/*266* Cause codes for Machine Check267*/268269#define HVM_MCHK_C_DOWN 0x00270#define HVM_MCHK_C_BADSP 0x01271#define HVM_MCHK_C_BADEX 0x02272#define HVM_MCHK_C_BADPT 0x03273#define HVM_MCHK_C_REGWR 0x29274275#endif276277278