|
|
1.1 root 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: #ifdef __s390__
27: # define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & 0x7fffffffUL))
28: #else
29: # define GETPC() (__builtin_return_address(0))
30: #endif
31:
32: #define SHIFT 0
33: #include "softmmu_template.h"
34:
35: #define SHIFT 1
36: #include "softmmu_template.h"
37:
38: #define SHIFT 2
39: #include "softmmu_template.h"
40:
41: #define SHIFT 3
42: #include "softmmu_template.h"
43:
44: /* Try to fill the TLB and return an exception if error. If retaddr is
45: NULL, it means that the function was called in C code (i.e. not
46: from generated code or from helper.c) */
47: /* XXX: fix it to restore all registers */
48: void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
49: {
50: TranslationBlock *tb;
51: CPUState *saved_env;
52: unsigned long pc;
53: int ret;
54:
55: /* XXX: hack to restore env in all cases, even if not called from
56: generated code */
57: saved_env = env;
58: env = cpu_single_env;
59: ret = cpu_cris_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
60: if (__builtin_expect(ret, 0)) {
61: if (retaddr) {
62: /* now we have a real cpu fault */
63: pc = (unsigned long)retaddr;
64: tb = tb_find_pc(pc);
65: if (tb) {
66: /* the PC is inside the translated code. It means that we have
67: a virtual CPU fault */
68: cpu_restore_state(tb, env, pc, NULL);
69: }
70: }
71: cpu_loop_exit();
72: }
73: env = saved_env;
74: }
75:
76: void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
77: int is_asi)
78: {
79:
80: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.