Commit 81fdc5f8d2d681da8d255baf0713144f8656bac9
1 parent
4fa551d7
The remainder of CRIS CPU emulation files, by Edgar E. Iglesias.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3361 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
6 changed files
with
680 additions
and
0 deletions
target-cris/cpu.h
0 โ 100644
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 | +typedef struct CPUCRISState { | |
78 | + uint32_t debug1; | |
79 | + uint32_t debug2; | |
80 | + uint32_t debug3; | |
81 | + | |
82 | + /* | |
83 | + * We just store the stores to the tlbset here for later evaluation | |
84 | + * when the hw needs access to them. | |
85 | + * | |
86 | + * One for I and another for D. | |
87 | + */ | |
88 | + struct | |
89 | + { | |
90 | + uint32_t hi; | |
91 | + uint32_t lo; | |
92 | + } tlbsets[2][4][16]; | |
93 | + | |
94 | + uint32_t sregs[256][16]; /* grrr why so many?? */ | |
95 | + uint32_t regs[16]; | |
96 | + uint32_t pregs[16]; | |
97 | + uint32_t pc; | |
98 | + uint32_t sr; | |
99 | + uint32_t flag_mask; /* Per insn mask of affected flags. */ | |
100 | + | |
101 | + /* SSP and USP. */ | |
102 | + int current_sp; | |
103 | + uint32_t sp[2]; | |
104 | + | |
105 | + /* These are setup up by the guest code just before transfering the | |
106 | + control back to the host. */ | |
107 | + int jmp; | |
108 | + uint32_t btarget; | |
109 | + int btaken; | |
110 | + | |
111 | + /* for traps. */ | |
112 | + int trapnr; | |
113 | + | |
114 | + /* Condition flag tracking. */ | |
115 | + uint32_t cc_op; | |
116 | + uint32_t cc_mask; | |
117 | + uint32_t cc_dest; | |
118 | + uint32_t cc_src; | |
119 | + uint32_t cc_result; | |
120 | + | |
121 | + /* size of the operation, 1 = byte, 2 = word, 4 = dword. */ | |
122 | + int cc_size; | |
123 | + | |
124 | + /* extended arithmetics. */ | |
125 | + int cc_x_live; | |
126 | + int cc_x; | |
127 | + | |
128 | + int features; | |
129 | + | |
130 | + uint64_t pending_interrupts; | |
131 | + int interrupt_request; | |
132 | + int exception_index; | |
133 | + int user_mode_only; | |
134 | + int halted; | |
135 | + | |
136 | + struct | |
137 | + { | |
138 | + int exec_insns; | |
139 | + int exec_loads; | |
140 | + int exec_stores; | |
141 | + } stats; | |
142 | + | |
143 | + | |
144 | + jmp_buf jmp_env; | |
145 | + CPU_COMMON | |
146 | +} CPUCRISState; | |
147 | + | |
148 | +CPUCRISState *cpu_cris_init(void); | |
149 | +int cpu_cris_exec(CPUCRISState *s); | |
150 | +void cpu_cris_close(CPUCRISState *s); | |
151 | +void do_interrupt(CPUCRISState *env); | |
152 | +/* you can call this signal handler from your SIGBUS and SIGSEGV | |
153 | + signal handlers to inform the virtual CPU of exceptions. non zero | |
154 | + is returned if the signal was handled by the virtual CPU. */ | |
155 | +int cpu_cris_signal_handler(int host_signum, void *pinfo, | |
156 | + void *puc); | |
157 | +void cpu_cris_flush_flags(CPUCRISState *, int); | |
158 | + | |
159 | + | |
160 | +void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec, | |
161 | + int is_asi); | |
162 | + | |
163 | +enum { | |
164 | + CC_OP_DYNAMIC, /* Use env->cc_op */ | |
165 | + CC_OP_FLAGS, | |
166 | + CC_OP_LOGIC, | |
167 | + CC_OP_CMP, | |
168 | + CC_OP_MOVE, | |
169 | + CC_OP_MOVE_PD, | |
170 | + CC_OP_MOVE_SD, | |
171 | + CC_OP_ADD, | |
172 | + CC_OP_ADDC, | |
173 | + CC_OP_MCP, | |
174 | + CC_OP_ADDU, | |
175 | + CC_OP_SUB, | |
176 | + CC_OP_SUBU, | |
177 | + CC_OP_NEG, | |
178 | + CC_OP_BTST, | |
179 | + CC_OP_MULS, | |
180 | + CC_OP_MULU, | |
181 | + CC_OP_DSTEP, | |
182 | + CC_OP_BOUND, | |
183 | + | |
184 | + CC_OP_OR, | |
185 | + CC_OP_AND, | |
186 | + CC_OP_XOR, | |
187 | + CC_OP_LSL, | |
188 | + CC_OP_LSR, | |
189 | + CC_OP_ASR, | |
190 | + CC_OP_LZ | |
191 | +}; | |
192 | + | |
193 | +#define CCF_C 0x01 | |
194 | +#define CCF_V 0x02 | |
195 | +#define CCF_Z 0x04 | |
196 | +#define CCF_N 0x08 | |
197 | +#define CCF_X 0x10 | |
198 | + | |
199 | +#define CRIS_SSP 0 | |
200 | +#define CRIS_USP 1 | |
201 | + | |
202 | +typedef struct cris_def_t cris_def_t; | |
203 | + | |
204 | +int cpu_cris_set_model(CPUCRISState *env, const char * name); | |
205 | + | |
206 | +void cris_set_irq_level(CPUCRISState *env, int level, uint8_t vector); | |
207 | +void cris_set_macsr(CPUCRISState *env, uint32_t val); | |
208 | +void cris_switch_sp(CPUCRISState *env); | |
209 | + | |
210 | +void do_cris_semihosting(CPUCRISState *env, int nr); | |
211 | + | |
212 | +enum cris_features { | |
213 | + CRIS_FEATURE_CF_ISA_MUL, | |
214 | +}; | |
215 | + | |
216 | +static inline int cris_feature(CPUCRISState *env, int feature) | |
217 | +{ | |
218 | + return (env->features & (1u << feature)) != 0; | |
219 | +} | |
220 | + | |
221 | +void register_cris_insns (CPUCRISState *env); | |
222 | + | |
223 | +/* CRIS uses 8k pages. */ | |
224 | +#define TARGET_PAGE_BITS 13 | |
225 | + | |
226 | +#define CPUState CPUCRISState | |
227 | +#define cpu_init cpu_cris_init | |
228 | +#define cpu_exec cpu_cris_exec | |
229 | +#define cpu_gen_code cpu_cris_gen_code | |
230 | +#define cpu_signal_handler cpu_cris_signal_handler | |
231 | + | |
232 | +#include "cpu-all.h" | |
233 | + | |
234 | +/* Register aliases. */ | |
235 | +#define REG_SP 14 | |
236 | +#define REG_ACR 15 | |
237 | +#define REG_MOF 7 | |
238 | + | |
239 | +/* Support regs. */ | |
240 | +#define SR_PID 2 | |
241 | +#define SR_SRS 3 | |
242 | +#define SR_EBP 9 | |
243 | +#define SR_ERP 10 | |
244 | +#define SR_CCS 13 | |
245 | + | |
246 | +/* Support func regs. */ | |
247 | +#define SFR_RW_GC_CFG 0][0 | |
248 | +#define SFR_RW_MM_CFG 1][0 | |
249 | +#define SFR_RW_MM_KBASE_LO 1][1 | |
250 | +#define SFR_RW_MM_KBASE_HI 1][2 | |
251 | +#define SFR_R_MM_CAUSE 1][3 | |
252 | +#define SFR_RW_MM_TLB_SEL 1][4 | |
253 | +#define SFR_RW_MM_TLB_LO 1][5 | |
254 | +#define SFR_RW_MM_TLB_HI 1][6 | |
255 | + | |
256 | +#endif | ... | ... |
target-cris/exec.h
0 โ 100644
1 | +/* | |
2 | + * CRIS execution defines | |
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 | +#include "dyngen-exec.h" | |
22 | + | |
23 | +#if 1 | |
24 | +register struct CPUCRISState *env asm(AREG0); | |
25 | +/* This is only used for tb lookup. */ | |
26 | +register uint32_t T0 asm(AREG1); | |
27 | +register uint32_t T1 asm(AREG2); | |
28 | +#else | |
29 | +struct CPUCRISState *env; | |
30 | +/* This is only used for tb lookup. */ | |
31 | +uint32_t T0; | |
32 | +uint32_t T1; | |
33 | +#endif | |
34 | +#include "cpu.h" | |
35 | +#include "exec-all.h" | |
36 | + | |
37 | +#define RETURN() __asm__ __volatile__("" : : : "memory"); | |
38 | + | |
39 | +static inline void env_to_regs(void) | |
40 | +{ | |
41 | +} | |
42 | + | |
43 | +static inline void regs_to_env(void) | |
44 | +{ | |
45 | +} | |
46 | + | |
47 | +int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | |
48 | + int is_user, int is_softmmu); | |
49 | +void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr); | |
50 | + | |
51 | +#if !defined(CONFIG_USER_ONLY) | |
52 | +#include "softmmu_exec.h" | |
53 | +#endif | |
54 | + | |
55 | +void cpu_cris_flush_flags(CPUCRISState *env, int cc_op); | |
56 | +void helper_movec(CPUCRISState *env, int reg, uint32_t val); | |
57 | + | |
58 | +void cpu_loop_exit(void); | |
59 | + | |
60 | +static inline int cpu_halted(CPUState *env) { | |
61 | + if (!env->halted) | |
62 | + return 0; | |
63 | + if (env->interrupt_request & CPU_INTERRUPT_HARD) { | |
64 | + env->halted = 0; | |
65 | + return 0; | |
66 | + } | |
67 | + return EXCP_HALTED; | |
68 | +} | ... | ... |
target-cris/helper.c
0 โ 100644
1 | +/* | |
2 | + * CRIS helper routines. | |
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 | + * Lesser 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 | + | |
22 | +#include <stdio.h> | |
23 | +#include <string.h> | |
24 | + | |
25 | +#include "config.h" | |
26 | +#include "cpu.h" | |
27 | +#include "mmu.h" | |
28 | +#include "exec-all.h" | |
29 | + | |
30 | +#if defined(CONFIG_USER_ONLY) | |
31 | + | |
32 | +void do_interrupt (CPUState *env) | |
33 | +{ | |
34 | + env->exception_index = -1; | |
35 | +} | |
36 | + | |
37 | +int cpu_cris_handle_mmu_fault(CPUState * env, target_ulong address, int rw, | |
38 | + int is_user, int is_softmmu) | |
39 | +{ | |
40 | + env->exception_index = 0xaa; | |
41 | + env->debug1 = address; | |
42 | + cpu_dump_state(env, stderr, fprintf, 0); | |
43 | + printf("%s addr=%x env->pc=%x\n", __func__, address, env->pc); | |
44 | + return 1; | |
45 | +} | |
46 | + | |
47 | +target_phys_addr_t cpu_get_phys_page_debug(CPUState * env, target_ulong addr) | |
48 | +{ | |
49 | + return addr; | |
50 | +} | |
51 | + | |
52 | +#else /* !CONFIG_USER_ONLY */ | |
53 | + | |
54 | +int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | |
55 | + int is_user, int is_softmmu) | |
56 | +{ | |
57 | + struct cris_mmu_result_t res; | |
58 | + int prot, miss; | |
59 | + target_ulong phy; | |
60 | + | |
61 | + address &= TARGET_PAGE_MASK; | |
62 | + prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; | |
63 | +// printf ("%s pc=%x %x w=%d smmu=%d\n", __func__, env->pc, address, rw, is_softmmu); | |
64 | + miss = cris_mmu_translate(&res, env, address, rw, is_user); | |
65 | + if (miss) | |
66 | + { | |
67 | + /* handle the miss. */ | |
68 | + phy = 0; | |
69 | + env->exception_index = EXCP_MMU_MISS; | |
70 | + } | |
71 | + else | |
72 | + { | |
73 | + phy = res.phy; | |
74 | + } | |
75 | +// printf ("a=%x phy=%x\n", address, phy); | |
76 | + return tlb_set_page(env, address, phy, prot, is_user, is_softmmu); | |
77 | +} | |
78 | + | |
79 | + | |
80 | +static void cris_shift_ccs(CPUState *env) | |
81 | +{ | |
82 | + uint32_t ccs; | |
83 | + /* Apply the ccs shift. */ | |
84 | + ccs = env->pregs[SR_CCS]; | |
85 | + ccs = (ccs & 0xc0000000) | ((ccs << 12) >> 2); | |
86 | +// printf ("ccs=%x %x\n", env->pregs[SR_CCS], ccs); | |
87 | + env->pregs[SR_CCS] = ccs; | |
88 | +} | |
89 | + | |
90 | +void do_interrupt(CPUState *env) | |
91 | +{ | |
92 | + uint32_t ebp, isr; | |
93 | + int irqnum; | |
94 | + | |
95 | + fflush(NULL); | |
96 | + | |
97 | +#if 0 | |
98 | + printf ("exception index=%d interrupt_req=%d\n", | |
99 | + env->exception_index, | |
100 | + env->interrupt_request); | |
101 | +#endif | |
102 | + | |
103 | + switch (env->exception_index) | |
104 | + { | |
105 | + case EXCP_BREAK: | |
106 | +// printf ("BREAK! %d\n", env->trapnr); | |
107 | + irqnum = env->trapnr; | |
108 | + ebp = env->pregs[SR_EBP]; | |
109 | + isr = ldl_code(ebp + irqnum * 4); | |
110 | + env->pregs[SR_ERP] = env->pc + 2; | |
111 | + env->pc = isr; | |
112 | + | |
113 | + cris_shift_ccs(env); | |
114 | + | |
115 | + break; | |
116 | + case EXCP_MMU_MISS: | |
117 | +// printf ("MMU miss\n"); | |
118 | + irqnum = 4; | |
119 | + ebp = env->pregs[SR_EBP]; | |
120 | + isr = ldl_code(ebp + irqnum * 4); | |
121 | + env->pregs[SR_ERP] = env->pc; | |
122 | + env->pc = isr; | |
123 | + cris_shift_ccs(env); | |
124 | + break; | |
125 | + | |
126 | + default: | |
127 | + { | |
128 | + /* Maybe the irq was acked by sw before we got a | |
129 | + change to take it. */ | |
130 | + if (env->interrupt_request & CPU_INTERRUPT_HARD) { | |
131 | + if (!env->pending_interrupts) | |
132 | + return; | |
133 | + if (!(env->pregs[SR_CCS] & I_FLAG)) { | |
134 | + return; | |
135 | + } | |
136 | + | |
137 | + irqnum = 31 - | |
138 | + __builtin_clz(env->pending_interrupts); | |
139 | + irqnum += 0x30; | |
140 | + ebp = env->pregs[SR_EBP]; | |
141 | + isr = ldl_code(ebp + irqnum * 4); | |
142 | + env->pregs[SR_ERP] = env->pc; | |
143 | + env->pc = isr; | |
144 | + | |
145 | + cris_shift_ccs(env); | |
146 | +#if 0 | |
147 | + printf ("%s ebp=%x %x isr=%x %d" | |
148 | + " ir=%x pending=%x\n", | |
149 | + __func__, | |
150 | + ebp, ebp + irqnum * 4, | |
151 | + isr, env->exception_index, | |
152 | + env->interrupt_request, | |
153 | + env->pending_interrupts); | |
154 | +#endif | |
155 | + } | |
156 | + | |
157 | + } | |
158 | + break; | |
159 | + } | |
160 | +} | |
161 | + | |
162 | +target_phys_addr_t cpu_get_phys_page_debug(CPUState * env, target_ulong addr) | |
163 | +{ | |
164 | +// printf ("%s\n", __func__); | |
165 | + uint32_t phy = addr; | |
166 | + struct cris_mmu_result_t res; | |
167 | + int miss; | |
168 | + miss = cris_mmu_translate(&res, env, addr, 0, 0); | |
169 | + if (!miss) | |
170 | + phy = res.phy; | |
171 | + return phy; | |
172 | +} | |
173 | +#endif | ... | ... |
target-cris/op_helper.c
0 โ 100644
1 | +/* | |
2 | + * CRIS helper routines | |
3 | + * | |
4 | + * Copyright (c) 2007 AXIS Communications | |
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 | + * Lesser 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 | + | |
22 | +#include <assert.h> | |
23 | +#include "exec.h" | |
24 | + | |
25 | +#define MMUSUFFIX _mmu | |
26 | +#define GETPC() (__builtin_return_address(0)) | |
27 | + | |
28 | +#define SHIFT 0 | |
29 | +#include "softmmu_template.h" | |
30 | + | |
31 | +#define SHIFT 1 | |
32 | +#include "softmmu_template.h" | |
33 | + | |
34 | +#define SHIFT 2 | |
35 | +#include "softmmu_template.h" | |
36 | + | |
37 | +#define SHIFT 3 | |
38 | +#include "softmmu_template.h" | |
39 | + | |
40 | +/* Try to fill the TLB and return an exception if error. If retaddr is | |
41 | + NULL, it means that the function was called in C code (i.e. not | |
42 | + from generated code or from helper.c) */ | |
43 | +/* XXX: fix it to restore all registers */ | |
44 | +void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr) | |
45 | +{ | |
46 | + TranslationBlock *tb; | |
47 | + CPUState *saved_env; | |
48 | + target_phys_addr_t pc; | |
49 | + int ret; | |
50 | + | |
51 | + /* XXX: hack to restore env in all cases, even if not called from | |
52 | + generated code */ | |
53 | + saved_env = env; | |
54 | + env = cpu_single_env; | |
55 | + ret = cpu_cris_handle_mmu_fault(env, addr, is_write, is_user, 1); | |
56 | + if (__builtin_expect(ret, 0)) { | |
57 | + if (retaddr) { | |
58 | + /* now we have a real cpu fault */ | |
59 | + pc = (target_phys_addr_t)retaddr; | |
60 | + tb = tb_find_pc(pc); | |
61 | + if (tb) { | |
62 | + /* the PC is inside the translated code. It means that we have | |
63 | + a virtual CPU fault */ | |
64 | + cpu_restore_state(tb, env, pc, NULL); | |
65 | + } | |
66 | + } | |
67 | + cpu_loop_exit(); | |
68 | + } | |
69 | + env = saved_env; | |
70 | +} | |
71 | + | |
72 | +void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec, | |
73 | + int is_asi) | |
74 | +{ | |
75 | + | |
76 | +} | ... | ... |
target-cris/op_mem.c
0 โ 100644
1 | +/* | |
2 | + * CRIS memory access (load and store) micro operations. | |
3 | + * | |
4 | + * Copyright (c) 2007 Edgar E. Iglesias, Axis Communications AB. | |
5 | + * | |
6 | + * This library is free software; you can redistribute it and/or | |
7 | + * modify it under the terms of the GNU Lesser General Public | |
8 | + * License as published by the Free Software Foundation; either | |
9 | + * version 2 of the License, or (at your option) any later version. | |
10 | + * | |
11 | + * This library is distributed in the hope that it will be useful, | |
12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | + * Lesser General Public License for more details. | |
15 | + * | |
16 | + * You should have received a copy of the GNU Lesser General Public | |
17 | + * License along with this library; if not, write to the Free Software | |
18 | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 | + */ | |
20 | + | |
21 | +void glue(op_ldb_T0_T0, MEMSUFFIX) (void) { | |
22 | + T0 = glue(ldsb, MEMSUFFIX) (T0); | |
23 | + RETURN(); | |
24 | +} | |
25 | + | |
26 | +void glue(op_ldub_T0_T0, MEMSUFFIX) (void) { | |
27 | + T0 = glue(ldub, MEMSUFFIX) (T0); | |
28 | + RETURN(); | |
29 | +} | |
30 | + | |
31 | +void glue(op_stb_T0_T1, MEMSUFFIX) (void) { | |
32 | + glue(stb, MEMSUFFIX) (T0, T1); | |
33 | + RETURN(); | |
34 | +} | |
35 | + | |
36 | +void glue(op_ldw_T0_T0, MEMSUFFIX) (void) { | |
37 | + T0 = glue(ldsw, MEMSUFFIX) (T0); | |
38 | + RETURN(); | |
39 | +} | |
40 | + | |
41 | +void glue(op_lduw_T0_T0, MEMSUFFIX) (void) { | |
42 | + T0 = glue(lduw, MEMSUFFIX) (T0); | |
43 | + RETURN(); | |
44 | +} | |
45 | + | |
46 | +void glue(op_stw_T0_T1, MEMSUFFIX) (void) { | |
47 | + glue(stw, MEMSUFFIX) (T0, T1); | |
48 | + RETURN(); | |
49 | +} | |
50 | + | |
51 | +void glue(op_ldl_T0_T0, MEMSUFFIX) (void) { | |
52 | + T0 = glue(ldl, MEMSUFFIX) (T0); | |
53 | + RETURN(); | |
54 | +} | |
55 | + | |
56 | +void glue(op_stl_T0_T1, MEMSUFFIX) (void) { | |
57 | + glue(stl, MEMSUFFIX) (T0, T1); | |
58 | + RETURN(); | |
59 | +} | ... | ... |
target-cris/op_template.h
0 โ 100644
1 | +/* | |
2 | + * CRIS micro operations (templates for various register related | |
3 | + * operations) | |
4 | + * | |
5 | + * Copyright (c) 2003 Fabrice Bellard | |
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 | + * Lesser 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 | + | |
22 | +#ifndef SET_REG | |
23 | +#define SET_REG(x) REG = x | |
24 | +#endif | |
25 | + | |
26 | +void OPPROTO glue(op_movl_T0_, REGNAME)(void) | |
27 | +{ | |
28 | + T0 = REG; | |
29 | +} | |
30 | + | |
31 | +void OPPROTO glue(op_movl_T1_, REGNAME)(void) | |
32 | +{ | |
33 | + T1 = REG; | |
34 | +} | |
35 | + | |
36 | +void OPPROTO glue(glue(op_movl_, REGNAME), _T0)(void) | |
37 | +{ | |
38 | + SET_REG (T0); | |
39 | +} | |
40 | + | |
41 | +void OPPROTO glue(glue(op_movl_, REGNAME), _T1)(void) | |
42 | +{ | |
43 | + SET_REG (T1); | |
44 | +} | |
45 | + | |
46 | +#undef REG | |
47 | +#undef REGNAME | |
48 | +#undef SET_REG | ... | ... |