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 |