|
|
1.1 ! root 1: /* ! 2: * CRIS virtual CPU header ! 3: * ! 4: * Copyright (c) 2007 AXIS Communications AB ! 5: * Written by Edgar E. Iglesias ! 6: * ! 7: * This library is free software; you can redistribute it and/or ! 8: * modify it under the terms of the GNU Lesser General Public ! 9: * License as published by the Free Software Foundation; either ! 10: * version 2 of the License, or (at your option) any later version. ! 11: * ! 12: * This library is distributed in the hope that it will be useful, ! 13: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 15: * General Public License for more details. ! 16: * ! 17: * You should have received a copy of the GNU Lesser General Public ! 18: * License along with this library; if not, write to the Free Software ! 19: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! 20: */ ! 21: #ifndef CPU_CRIS_H ! 22: #define CPU_CRIS_H ! 23: ! 24: #define TARGET_LONG_BITS 32 ! 25: ! 26: #include "cpu-defs.h" ! 27: ! 28: #include "softfloat.h" ! 29: ! 30: #define TARGET_HAS_ICE 1 ! 31: ! 32: #define ELF_MACHINE EM_CRIS ! 33: ! 34: #define EXCP_MMU_EXEC 0 ! 35: #define EXCP_MMU_READ 1 ! 36: #define EXCP_MMU_WRITE 2 ! 37: #define EXCP_MMU_FLUSH 3 ! 38: #define EXCP_MMU_MISS 4 ! 39: #define EXCP_BREAK 16 /* trap. */ ! 40: ! 41: /* CPU flags. */ ! 42: #define S_FLAG 0x200 ! 43: #define R_FLAG 0x100 ! 44: #define P_FLAG 0x80 ! 45: #define U_FLAG 0x40 ! 46: #define P_FLAG 0x80 ! 47: #define U_FLAG 0x40 ! 48: #define I_FLAG 0x20 ! 49: #define X_FLAG 0x10 ! 50: #define N_FLAG 0x08 ! 51: #define Z_FLAG 0x04 ! 52: #define V_FLAG 0x02 ! 53: #define C_FLAG 0x01 ! 54: #define ALU_FLAGS 0x1F ! 55: ! 56: /* Condition codes. */ ! 57: #define CC_CC 0 ! 58: #define CC_CS 1 ! 59: #define CC_NE 2 ! 60: #define CC_EQ 3 ! 61: #define CC_VC 4 ! 62: #define CC_VS 5 ! 63: #define CC_PL 6 ! 64: #define CC_MI 7 ! 65: #define CC_LS 8 ! 66: #define CC_HI 9 ! 67: #define CC_GE 10 ! 68: #define CC_LT 11 ! 69: #define CC_GT 12 ! 70: #define CC_LE 13 ! 71: #define CC_A 14 ! 72: #define CC_P 15 ! 73: ! 74: /* Internal flags for the implementation. */ ! 75: #define F_DELAYSLOT 1 ! 76: ! 77: #define NB_MMU_MODES 2 ! 78: ! 79: typedef struct CPUCRISState { ! 80: uint32_t debug1; ! 81: uint32_t debug2; ! 82: uint32_t debug3; ! 83: ! 84: /* ! 85: * We just store the stores to the tlbset here for later evaluation ! 86: * when the hw needs access to them. ! 87: * ! 88: * One for I and another for D. ! 89: */ ! 90: struct ! 91: { ! 92: uint32_t hi; ! 93: uint32_t lo; ! 94: } tlbsets[2][4][16]; ! 95: ! 96: uint32_t sregs[256][16]; /* grrr why so many?? */ ! 97: uint32_t regs[16]; ! 98: uint32_t pregs[16]; ! 99: uint32_t pc; ! 100: uint32_t sr; ! 101: uint32_t flag_mask; /* Per insn mask of affected flags. */ ! 102: ! 103: /* SSP and USP. */ ! 104: int current_sp; ! 105: uint32_t sp[2]; ! 106: ! 107: /* These are setup up by the guest code just before transfering the ! 108: control back to the host. */ ! 109: int jmp; ! 110: uint32_t btarget; ! 111: int btaken; ! 112: ! 113: /* for traps. */ ! 114: int trapnr; ! 115: ! 116: /* Condition flag tracking. */ ! 117: uint32_t cc_op; ! 118: uint32_t cc_mask; ! 119: uint32_t cc_dest; ! 120: uint32_t cc_src; ! 121: uint32_t cc_result; ! 122: ! 123: /* size of the operation, 1 = byte, 2 = word, 4 = dword. */ ! 124: int cc_size; ! 125: ! 126: /* extended arithmetics. */ ! 127: int cc_x_live; ! 128: int cc_x; ! 129: ! 130: int features; ! 131: ! 132: uint64_t pending_interrupts; ! 133: int interrupt_request; ! 134: int exception_index; ! 135: int user_mode_only; ! 136: int halted; ! 137: ! 138: struct ! 139: { ! 140: int exec_insns; ! 141: int exec_loads; ! 142: int exec_stores; ! 143: } stats; ! 144: ! 145: ! 146: jmp_buf jmp_env; ! 147: CPU_COMMON ! 148: } CPUCRISState; ! 149: ! 150: CPUCRISState *cpu_cris_init(const char *cpu_model); ! 151: int cpu_cris_exec(CPUCRISState *s); ! 152: void cpu_cris_close(CPUCRISState *s); ! 153: void do_interrupt(CPUCRISState *env); ! 154: /* you can call this signal handler from your SIGBUS and SIGSEGV ! 155: signal handlers to inform the virtual CPU of exceptions. non zero ! 156: is returned if the signal was handled by the virtual CPU. */ ! 157: int cpu_cris_signal_handler(int host_signum, void *pinfo, ! 158: void *puc); ! 159: void cpu_cris_flush_flags(CPUCRISState *, int); ! 160: ! 161: ! 162: void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec, ! 163: int is_asi); ! 164: ! 165: enum { ! 166: CC_OP_DYNAMIC, /* Use env->cc_op */ ! 167: CC_OP_FLAGS, ! 168: CC_OP_LOGIC, ! 169: CC_OP_CMP, ! 170: CC_OP_MOVE, ! 171: CC_OP_MOVE_PD, ! 172: CC_OP_MOVE_SD, ! 173: CC_OP_ADD, ! 174: CC_OP_ADDC, ! 175: CC_OP_MCP, ! 176: CC_OP_ADDU, ! 177: CC_OP_SUB, ! 178: CC_OP_SUBU, ! 179: CC_OP_NEG, ! 180: CC_OP_BTST, ! 181: CC_OP_MULS, ! 182: CC_OP_MULU, ! 183: CC_OP_DSTEP, ! 184: CC_OP_BOUND, ! 185: ! 186: CC_OP_OR, ! 187: CC_OP_AND, ! 188: CC_OP_XOR, ! 189: CC_OP_LSL, ! 190: CC_OP_LSR, ! 191: CC_OP_ASR, ! 192: CC_OP_LZ ! 193: }; ! 194: ! 195: #define CCF_C 0x01 ! 196: #define CCF_V 0x02 ! 197: #define CCF_Z 0x04 ! 198: #define CCF_N 0x08 ! 199: #define CCF_X 0x10 ! 200: ! 201: #define CRIS_SSP 0 ! 202: #define CRIS_USP 1 ! 203: ! 204: void cris_set_irq_level(CPUCRISState *env, int level, uint8_t vector); ! 205: void cris_set_macsr(CPUCRISState *env, uint32_t val); ! 206: void cris_switch_sp(CPUCRISState *env); ! 207: ! 208: void do_cris_semihosting(CPUCRISState *env, int nr); ! 209: ! 210: enum cris_features { ! 211: CRIS_FEATURE_CF_ISA_MUL, ! 212: }; ! 213: ! 214: static inline int cris_feature(CPUCRISState *env, int feature) ! 215: { ! 216: return (env->features & (1u << feature)) != 0; ! 217: } ! 218: ! 219: void register_cris_insns (CPUCRISState *env); ! 220: ! 221: /* CRIS uses 8k pages. */ ! 222: #define TARGET_PAGE_BITS 13 ! 223: ! 224: #define CPUState CPUCRISState ! 225: #define cpu_init cpu_cris_init ! 226: #define cpu_exec cpu_cris_exec ! 227: #define cpu_gen_code cpu_cris_gen_code ! 228: #define cpu_signal_handler cpu_cris_signal_handler ! 229: ! 230: /* MMU modes definitions */ ! 231: #define MMU_MODE0_SUFFIX _kernel ! 232: #define MMU_MODE1_SUFFIX _user ! 233: #define MMU_USER_IDX 1 ! 234: /* CRIS FIXME: I guess we want to validate supervisor mode acceses here. */ ! 235: static inline int cpu_mmu_index (CPUState *env) ! 236: { ! 237: return 0; ! 238: } ! 239: ! 240: #include "cpu-all.h" ! 241: ! 242: /* Register aliases. */ ! 243: #define REG_SP 14 ! 244: #define REG_ACR 15 ! 245: #define REG_MOF 7 ! 246: ! 247: /* Support regs. */ ! 248: #define SR_PID 2 ! 249: #define SR_SRS 3 ! 250: #define SR_EBP 9 ! 251: #define SR_ERP 10 ! 252: #define SR_CCS 13 ! 253: ! 254: /* Support func regs. */ ! 255: #define SFR_RW_GC_CFG 0][0 ! 256: #define SFR_RW_MM_CFG 1][0 ! 257: #define SFR_RW_MM_KBASE_LO 1][1 ! 258: #define SFR_RW_MM_KBASE_HI 1][2 ! 259: #define SFR_R_MM_CAUSE 1][3 ! 260: #define SFR_RW_MM_TLB_SEL 1][4 ! 261: #define SFR_RW_MM_TLB_LO 1][5 ! 262: #define SFR_RW_MM_TLB_HI 1][6 ! 263: ! 264: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.