Statistics
| Branch: | Revision:

root / target-cris / cpu.h @ 0d84be5b

History | View | Annotate | Download (6.5 kB)

1 81fdc5f8 ths
/*
2 81fdc5f8 ths
 *  CRIS virtual CPU header
3 81fdc5f8 ths
 *
4 81fdc5f8 ths
 *  Copyright (c) 2007 AXIS Communications AB
5 81fdc5f8 ths
 *  Written by Edgar E. Iglesias
6 81fdc5f8 ths
 *
7 81fdc5f8 ths
 * This library is free software; you can redistribute it and/or
8 81fdc5f8 ths
 * modify it under the terms of the GNU Lesser General Public
9 81fdc5f8 ths
 * License as published by the Free Software Foundation; either
10 81fdc5f8 ths
 * version 2 of the License, or (at your option) any later version.
11 81fdc5f8 ths
 *
12 81fdc5f8 ths
 * This library is distributed in the hope that it will be useful,
13 81fdc5f8 ths
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 81fdc5f8 ths
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 81fdc5f8 ths
 * General Public License for more details.
16 81fdc5f8 ths
 *
17 81fdc5f8 ths
 * You should have received a copy of the GNU Lesser General Public
18 8167ee88 Blue Swirl
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19 81fdc5f8 ths
 */
20 81fdc5f8 ths
#ifndef CPU_CRIS_H
21 81fdc5f8 ths
#define CPU_CRIS_H
22 81fdc5f8 ths
23 81fdc5f8 ths
#define TARGET_LONG_BITS 32
24 81fdc5f8 ths
25 c2764719 pbrook
#define CPUState struct CPUCRISState
26 c2764719 pbrook
27 81fdc5f8 ths
#include "cpu-defs.h"
28 81fdc5f8 ths
29 81fdc5f8 ths
#define TARGET_HAS_ICE 1
30 81fdc5f8 ths
31 81fdc5f8 ths
#define ELF_MACHINE        EM_CRIS
32 81fdc5f8 ths
33 1b1a38b0 edgar_igl
#define EXCP_NMI        1
34 1b1a38b0 edgar_igl
#define EXCP_GURU       2
35 1b1a38b0 edgar_igl
#define EXCP_BUSFAULT   3
36 1b1a38b0 edgar_igl
#define EXCP_IRQ        4
37 1b1a38b0 edgar_igl
#define EXCP_BREAK      5
38 81fdc5f8 ths
39 b41f7df0 edgar_igl
/* Register aliases. R0 - R15 */
40 b41f7df0 edgar_igl
#define R_FP  8
41 b41f7df0 edgar_igl
#define R_SP  14
42 b41f7df0 edgar_igl
#define R_ACR 15
43 b41f7df0 edgar_igl
44 b41f7df0 edgar_igl
/* Support regs, P0 - P15  */
45 b41f7df0 edgar_igl
#define PR_BZ  0
46 b41f7df0 edgar_igl
#define PR_VR  1
47 b41f7df0 edgar_igl
#define PR_PID 2
48 b41f7df0 edgar_igl
#define PR_SRS 3
49 b41f7df0 edgar_igl
#define PR_WZ  4
50 b41f7df0 edgar_igl
#define PR_EXS 5
51 b41f7df0 edgar_igl
#define PR_EDA 6
52 fb9fb692 Edgar E. Iglesias
#define PR_PREFIX 6    /* On CRISv10 P6 is reserved, we use it as prefix.  */
53 b41f7df0 edgar_igl
#define PR_MOF 7
54 b41f7df0 edgar_igl
#define PR_DZ  8
55 b41f7df0 edgar_igl
#define PR_EBP 9
56 b41f7df0 edgar_igl
#define PR_ERP 10
57 b41f7df0 edgar_igl
#define PR_SRP 11
58 1b1a38b0 edgar_igl
#define PR_NRP 12
59 b41f7df0 edgar_igl
#define PR_CCS 13
60 b41f7df0 edgar_igl
#define PR_USP 14
61 b41f7df0 edgar_igl
#define PR_SPC 15
62 b41f7df0 edgar_igl
63 81fdc5f8 ths
/* CPU flags.  */
64 1b1a38b0 edgar_igl
#define Q_FLAG 0x80000000
65 1b1a38b0 edgar_igl
#define M_FLAG 0x40000000
66 fb9fb692 Edgar E. Iglesias
#define PFIX_FLAG 0x800      /* CRISv10 Only.  */
67 81fdc5f8 ths
#define S_FLAG 0x200
68 81fdc5f8 ths
#define R_FLAG 0x100
69 81fdc5f8 ths
#define P_FLAG 0x80
70 81fdc5f8 ths
#define U_FLAG 0x40
71 81fdc5f8 ths
#define I_FLAG 0x20
72 81fdc5f8 ths
#define X_FLAG 0x10
73 81fdc5f8 ths
#define N_FLAG 0x08
74 81fdc5f8 ths
#define Z_FLAG 0x04
75 81fdc5f8 ths
#define V_FLAG 0x02
76 81fdc5f8 ths
#define C_FLAG 0x01
77 81fdc5f8 ths
#define ALU_FLAGS 0x1F
78 81fdc5f8 ths
79 81fdc5f8 ths
/* Condition codes.  */
80 81fdc5f8 ths
#define CC_CC   0
81 81fdc5f8 ths
#define CC_CS   1
82 81fdc5f8 ths
#define CC_NE   2
83 81fdc5f8 ths
#define CC_EQ   3
84 81fdc5f8 ths
#define CC_VC   4
85 81fdc5f8 ths
#define CC_VS   5
86 81fdc5f8 ths
#define CC_PL   6
87 81fdc5f8 ths
#define CC_MI   7
88 81fdc5f8 ths
#define CC_LS   8
89 81fdc5f8 ths
#define CC_HI   9
90 81fdc5f8 ths
#define CC_GE  10
91 81fdc5f8 ths
#define CC_LT  11
92 81fdc5f8 ths
#define CC_GT  12
93 81fdc5f8 ths
#define CC_LE  13
94 81fdc5f8 ths
#define CC_A   14
95 81fdc5f8 ths
#define CC_P   15
96 81fdc5f8 ths
97 6ebbf390 j_mayer
#define NB_MMU_MODES 2
98 6ebbf390 j_mayer
99 81fdc5f8 ths
typedef struct CPUCRISState {
100 81fdc5f8 ths
        uint32_t regs[16];
101 b41f7df0 edgar_igl
        /* P0 - P15 are referred to as special registers in the docs.  */
102 81fdc5f8 ths
        uint32_t pregs[16];
103 b41f7df0 edgar_igl
104 b41f7df0 edgar_igl
        /* Pseudo register for the PC. Not directly accessable on CRIS.  */
105 81fdc5f8 ths
        uint32_t pc;
106 81fdc5f8 ths
107 b41f7df0 edgar_igl
        /* Pseudo register for the kernel stack.  */
108 b41f7df0 edgar_igl
        uint32_t ksp;
109 b41f7df0 edgar_igl
110 cf1d97f0 edgar_igl
        /* Branch.  */
111 cf1d97f0 edgar_igl
        int dslot;
112 81fdc5f8 ths
        int btaken;
113 cf1d97f0 edgar_igl
        uint32_t btarget;
114 81fdc5f8 ths
115 81fdc5f8 ths
        /* Condition flag tracking.  */
116 81fdc5f8 ths
        uint32_t cc_op;
117 81fdc5f8 ths
        uint32_t cc_mask;
118 81fdc5f8 ths
        uint32_t cc_dest;
119 81fdc5f8 ths
        uint32_t cc_src;
120 81fdc5f8 ths
        uint32_t cc_result;
121 81fdc5f8 ths
        /* size of the operation, 1 = byte, 2 = word, 4 = dword.  */
122 81fdc5f8 ths
        int cc_size;
123 30abcfc7 edgar_igl
        /* X flag at the time of cc snapshot.  */
124 81fdc5f8 ths
        int cc_x;
125 81fdc5f8 ths
126 fb9fb692 Edgar E. Iglesias
        /* CRIS has certain insns that lockout interrupts.  */
127 fb9fb692 Edgar E. Iglesias
        int locked_irq;
128 786c02f1 edgar_igl
        int interrupt_vector;
129 786c02f1 edgar_igl
        int fault_vector;
130 786c02f1 edgar_igl
        int trap_vector;
131 786c02f1 edgar_igl
132 b41f7df0 edgar_igl
        /* FIXME: add a check in the translator to avoid writing to support
133 b41f7df0 edgar_igl
           register sets beyond the 4th. The ISA allows up to 256! but in
134 b41f7df0 edgar_igl
           practice there is no core that implements more than 4.
135 b41f7df0 edgar_igl

136 b41f7df0 edgar_igl
           Support function registers are used to control units close to the
137 b41f7df0 edgar_igl
           core. Accesses do not pass down the normal hierarchy.
138 b41f7df0 edgar_igl
        */
139 b41f7df0 edgar_igl
        uint32_t sregs[4][16];
140 b41f7df0 edgar_igl
141 44cd42ee edgar_igl
        /* Linear feedback shift reg in the mmu. Used to provide pseudo
142 44cd42ee edgar_igl
           randomness for the 'hint' the mmu gives to sw for chosing valid
143 44cd42ee edgar_igl
           sets on TLB refills.  */
144 44cd42ee edgar_igl
        uint32_t mmu_rand_lfsr;
145 44cd42ee edgar_igl
146 b41f7df0 edgar_igl
        /*
147 b41f7df0 edgar_igl
         * We just store the stores to the tlbset here for later evaluation
148 b41f7df0 edgar_igl
         * when the hw needs access to them.
149 b41f7df0 edgar_igl
         *
150 b41f7df0 edgar_igl
         * One for I and another for D.
151 b41f7df0 edgar_igl
         */
152 b41f7df0 edgar_igl
        struct
153 b41f7df0 edgar_igl
        {
154 b41f7df0 edgar_igl
                uint32_t hi;
155 b41f7df0 edgar_igl
                uint32_t lo;
156 b41f7df0 edgar_igl
        } tlbsets[2][4][16];
157 b41f7df0 edgar_igl
158 81fdc5f8 ths
        CPU_COMMON
159 81fdc5f8 ths
} CPUCRISState;
160 81fdc5f8 ths
161 aaed909a bellard
CPUCRISState *cpu_cris_init(const char *cpu_model);
162 81fdc5f8 ths
int cpu_cris_exec(CPUCRISState *s);
163 81fdc5f8 ths
void cpu_cris_close(CPUCRISState *s);
164 81fdc5f8 ths
void do_interrupt(CPUCRISState *env);
165 81fdc5f8 ths
/* you can call this signal handler from your SIGBUS and SIGSEGV
166 81fdc5f8 ths
   signal handlers to inform the virtual CPU of exceptions. non zero
167 81fdc5f8 ths
   is returned if the signal was handled by the virtual CPU.  */
168 81fdc5f8 ths
int cpu_cris_signal_handler(int host_signum, void *pinfo,
169 81fdc5f8 ths
                           void *puc);
170 81fdc5f8 ths
171 81fdc5f8 ths
enum {
172 81fdc5f8 ths
    CC_OP_DYNAMIC, /* Use env->cc_op  */
173 81fdc5f8 ths
    CC_OP_FLAGS,
174 81fdc5f8 ths
    CC_OP_CMP,
175 81fdc5f8 ths
    CC_OP_MOVE,
176 81fdc5f8 ths
    CC_OP_ADD,
177 81fdc5f8 ths
    CC_OP_ADDC,
178 81fdc5f8 ths
    CC_OP_MCP,
179 81fdc5f8 ths
    CC_OP_ADDU,
180 81fdc5f8 ths
    CC_OP_SUB,
181 81fdc5f8 ths
    CC_OP_SUBU,
182 81fdc5f8 ths
    CC_OP_NEG,
183 81fdc5f8 ths
    CC_OP_BTST,
184 81fdc5f8 ths
    CC_OP_MULS,
185 81fdc5f8 ths
    CC_OP_MULU,
186 81fdc5f8 ths
    CC_OP_DSTEP,
187 fb9fb692 Edgar E. Iglesias
    CC_OP_MSTEP,
188 81fdc5f8 ths
    CC_OP_BOUND,
189 81fdc5f8 ths
190 81fdc5f8 ths
    CC_OP_OR,
191 81fdc5f8 ths
    CC_OP_AND,
192 81fdc5f8 ths
    CC_OP_XOR,
193 81fdc5f8 ths
    CC_OP_LSL,
194 81fdc5f8 ths
    CC_OP_LSR,
195 81fdc5f8 ths
    CC_OP_ASR,
196 81fdc5f8 ths
    CC_OP_LZ
197 81fdc5f8 ths
};
198 81fdc5f8 ths
199 81fdc5f8 ths
/* CRIS uses 8k pages.  */
200 81fdc5f8 ths
#define TARGET_PAGE_BITS 13
201 bb7ec043 pbrook
#define MMAP_SHIFT TARGET_PAGE_BITS
202 81fdc5f8 ths
203 52705890 Richard Henderson
#define TARGET_PHYS_ADDR_SPACE_BITS 32
204 52705890 Richard Henderson
#define TARGET_VIRT_ADDR_SPACE_BITS 32
205 52705890 Richard Henderson
206 81fdc5f8 ths
#define cpu_init cpu_cris_init
207 81fdc5f8 ths
#define cpu_exec cpu_cris_exec
208 81fdc5f8 ths
#define cpu_gen_code cpu_cris_gen_code
209 81fdc5f8 ths
#define cpu_signal_handler cpu_cris_signal_handler
210 81fdc5f8 ths
211 b3c7724c pbrook
#define CPU_SAVE_VERSION 1
212 b3c7724c pbrook
213 6ebbf390 j_mayer
/* MMU modes definitions */
214 6ebbf390 j_mayer
#define MMU_MODE0_SUFFIX _kernel
215 6ebbf390 j_mayer
#define MMU_MODE1_SUFFIX _user
216 6ebbf390 j_mayer
#define MMU_USER_IDX 1
217 6ebbf390 j_mayer
static inline int cpu_mmu_index (CPUState *env)
218 6ebbf390 j_mayer
{
219 b41f7df0 edgar_igl
        return !!(env->pregs[PR_CCS] & U_FLAG);
220 6ebbf390 j_mayer
}
221 6ebbf390 j_mayer
222 cc53adbc edgar_igl
int cpu_cris_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
223 cc53adbc edgar_igl
                              int mmu_idx, int is_softmmu);
224 0b5c1ce8 Nathan Froyd
#define cpu_handle_mmu_fault cpu_cris_handle_mmu_fault
225 cc53adbc edgar_igl
226 6e68e076 pbrook
#if defined(CONFIG_USER_ONLY)
227 6e68e076 pbrook
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp)
228 6e68e076 pbrook
{
229 f8ed7070 pbrook
    if (newsp)
230 6e68e076 pbrook
        env->regs[14] = newsp;
231 6e68e076 pbrook
    env->regs[10] = 0;
232 6e68e076 pbrook
}
233 6e68e076 pbrook
#endif
234 6e68e076 pbrook
235 ef96779b edgar_igl
static inline void cpu_set_tls(CPUCRISState *env, target_ulong newtls)
236 ef96779b edgar_igl
{
237 ef96779b edgar_igl
        env->pregs[PR_PID] = (env->pregs[PR_PID] & 0xff) | newtls;
238 ef96779b edgar_igl
}
239 ef96779b edgar_igl
240 9004627f edgar_igl
/* Support function regs.  */
241 81fdc5f8 ths
#define SFR_RW_GC_CFG      0][0
242 b41f7df0 edgar_igl
#define SFR_RW_MM_CFG      env->pregs[PR_SRS]][0
243 b41f7df0 edgar_igl
#define SFR_RW_MM_KBASE_LO env->pregs[PR_SRS]][1
244 b41f7df0 edgar_igl
#define SFR_RW_MM_KBASE_HI env->pregs[PR_SRS]][2
245 b41f7df0 edgar_igl
#define SFR_R_MM_CAUSE     env->pregs[PR_SRS]][3
246 b41f7df0 edgar_igl
#define SFR_RW_MM_TLB_SEL  env->pregs[PR_SRS]][4
247 b41f7df0 edgar_igl
#define SFR_RW_MM_TLB_LO   env->pregs[PR_SRS]][5
248 b41f7df0 edgar_igl
#define SFR_RW_MM_TLB_HI   env->pregs[PR_SRS]][6
249 81fdc5f8 ths
250 b41f7df0 edgar_igl
#include "cpu-all.h"
251 622ed360 aliguori
#include "exec-all.h"
252 622ed360 aliguori
253 622ed360 aliguori
static inline void cpu_pc_from_tb(CPUState *env, TranslationBlock *tb)
254 622ed360 aliguori
{
255 622ed360 aliguori
    env->pc = tb->pc;
256 622ed360 aliguori
}
257 622ed360 aliguori
258 6b917547 aliguori
static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc,
259 6b917547 aliguori
                                        target_ulong *cs_base, int *flags)
260 6b917547 aliguori
{
261 6b917547 aliguori
    *pc = env->pc;
262 6b917547 aliguori
    *cs_base = 0;
263 6b917547 aliguori
    *flags = env->dslot |
264 fb9fb692 Edgar E. Iglesias
            (env->pregs[PR_CCS] & (S_FLAG | P_FLAG | U_FLAG
265 fb9fb692 Edgar E. Iglesias
                                     | X_FLAG | PFIX_FLAG));
266 6b917547 aliguori
}
267 6b917547 aliguori
268 40e9eddd Edgar E. Iglesias
#define cpu_list cris_cpu_list
269 40e9eddd Edgar E. Iglesias
void cris_cpu_list(FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
270 40e9eddd Edgar E. Iglesias
271 81fdc5f8 ths
#endif