root / target-alpha / mem_helper.c @ c08d7424
History | View | Annotate | Download (3.6 kB)
1 | 4c9649a9 | j_mayer | /*
|
---|---|---|---|
2 | c3082755 | Richard Henderson | * Helpers for loads and stores
|
3 | 5fafdf24 | ths | *
|
4 | 4c9649a9 | j_mayer | * Copyright (c) 2007 Jocelyn Mayer
|
5 | 4c9649a9 | j_mayer | *
|
6 | 4c9649a9 | j_mayer | * This library is free software; you can redistribute it and/or
|
7 | 4c9649a9 | j_mayer | * modify it under the terms of the GNU Lesser General Public
|
8 | 4c9649a9 | j_mayer | * License as published by the Free Software Foundation; either
|
9 | 4c9649a9 | j_mayer | * version 2 of the License, or (at your option) any later version.
|
10 | 4c9649a9 | j_mayer | *
|
11 | 4c9649a9 | j_mayer | * This library is distributed in the hope that it will be useful,
|
12 | 4c9649a9 | j_mayer | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 4c9649a9 | j_mayer | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 4c9649a9 | j_mayer | * Lesser General Public License for more details.
|
15 | 4c9649a9 | j_mayer | *
|
16 | 4c9649a9 | j_mayer | * You should have received a copy of the GNU Lesser General Public
|
17 | 8167ee88 | Blue Swirl | * License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
18 | 4c9649a9 | j_mayer | */
|
19 | 4c9649a9 | j_mayer | |
20 | 3e457172 | Blue Swirl | #include "cpu.h" |
21 | a7812ae4 | pbrook | #include "helper.h" |
22 | 4c9649a9 | j_mayer | |
23 | 4c9649a9 | j_mayer | |
24 | 4c9649a9 | j_mayer | /* Softmmu support */
|
25 | c3082755 | Richard Henderson | #ifndef CONFIG_USER_ONLY
|
26 | c3082755 | Richard Henderson | |
27 | 2374e73e | Richard Henderson | uint64_t helper_ldl_phys(uint64_t p) |
28 | 8bb6e981 | aurel32 | { |
29 | 2374e73e | Richard Henderson | return (int32_t)ldl_phys(p);
|
30 | 8bb6e981 | aurel32 | } |
31 | 8bb6e981 | aurel32 | |
32 | 2374e73e | Richard Henderson | uint64_t helper_ldq_phys(uint64_t p) |
33 | 8bb6e981 | aurel32 | { |
34 | 2374e73e | Richard Henderson | return ldq_phys(p);
|
35 | 8bb6e981 | aurel32 | } |
36 | 8bb6e981 | aurel32 | |
37 | c3082755 | Richard Henderson | uint64_t helper_ldl_l_phys(CPUAlphaState *env, uint64_t p) |
38 | 8bb6e981 | aurel32 | { |
39 | 2374e73e | Richard Henderson | env->lock_addr = p; |
40 | 2374e73e | Richard Henderson | return env->lock_value = (int32_t)ldl_phys(p);
|
41 | 8bb6e981 | aurel32 | } |
42 | 8bb6e981 | aurel32 | |
43 | c3082755 | Richard Henderson | uint64_t helper_ldq_l_phys(CPUAlphaState *env, uint64_t p) |
44 | 8bb6e981 | aurel32 | { |
45 | 2374e73e | Richard Henderson | env->lock_addr = p; |
46 | c3082755 | Richard Henderson | return env->lock_value = ldq_phys(p);
|
47 | 8bb6e981 | aurel32 | } |
48 | 8bb6e981 | aurel32 | |
49 | 2374e73e | Richard Henderson | void helper_stl_phys(uint64_t p, uint64_t v)
|
50 | 8bb6e981 | aurel32 | { |
51 | 2374e73e | Richard Henderson | stl_phys(p, v); |
52 | 8bb6e981 | aurel32 | } |
53 | 8bb6e981 | aurel32 | |
54 | 2374e73e | Richard Henderson | void helper_stq_phys(uint64_t p, uint64_t v)
|
55 | 8bb6e981 | aurel32 | { |
56 | 2374e73e | Richard Henderson | stq_phys(p, v); |
57 | 8bb6e981 | aurel32 | } |
58 | 8bb6e981 | aurel32 | |
59 | c3082755 | Richard Henderson | uint64_t helper_stl_c_phys(CPUAlphaState *env, uint64_t p, uint64_t v) |
60 | 8bb6e981 | aurel32 | { |
61 | 2374e73e | Richard Henderson | uint64_t ret = 0;
|
62 | 8bb6e981 | aurel32 | |
63 | 2374e73e | Richard Henderson | if (p == env->lock_addr) {
|
64 | 2374e73e | Richard Henderson | int32_t old = ldl_phys(p); |
65 | 2374e73e | Richard Henderson | if (old == (int32_t)env->lock_value) {
|
66 | 2374e73e | Richard Henderson | stl_phys(p, v); |
67 | 2374e73e | Richard Henderson | ret = 1;
|
68 | 2374e73e | Richard Henderson | } |
69 | 2374e73e | Richard Henderson | } |
70 | 2374e73e | Richard Henderson | env->lock_addr = -1;
|
71 | 8bb6e981 | aurel32 | |
72 | 8bb6e981 | aurel32 | return ret;
|
73 | 8bb6e981 | aurel32 | } |
74 | 8bb6e981 | aurel32 | |
75 | c3082755 | Richard Henderson | uint64_t helper_stq_c_phys(CPUAlphaState *env, uint64_t p, uint64_t v) |
76 | 8bb6e981 | aurel32 | { |
77 | 2374e73e | Richard Henderson | uint64_t ret = 0;
|
78 | 8bb6e981 | aurel32 | |
79 | 2374e73e | Richard Henderson | if (p == env->lock_addr) {
|
80 | 2374e73e | Richard Henderson | uint64_t old = ldq_phys(p); |
81 | 2374e73e | Richard Henderson | if (old == env->lock_value) {
|
82 | 2374e73e | Richard Henderson | stq_phys(p, v); |
83 | 2374e73e | Richard Henderson | ret = 1;
|
84 | 2374e73e | Richard Henderson | } |
85 | 2374e73e | Richard Henderson | } |
86 | 2374e73e | Richard Henderson | env->lock_addr = -1;
|
87 | 8bb6e981 | aurel32 | |
88 | 8bb6e981 | aurel32 | return ret;
|
89 | 4c9649a9 | j_mayer | } |
90 | 4c9649a9 | j_mayer | |
91 | c3082755 | Richard Henderson | static void do_unaligned_access(CPUAlphaState *env, target_ulong addr, |
92 | 20503968 | Blue Swirl | int is_write, int is_user, uintptr_t retaddr) |
93 | 5b450407 | Richard Henderson | { |
94 | 5b450407 | Richard Henderson | uint64_t pc; |
95 | 5b450407 | Richard Henderson | uint32_t insn; |
96 | 5b450407 | Richard Henderson | |
97 | b9f0923e | Richard Henderson | do_restore_state(env, retaddr); |
98 | 5b450407 | Richard Henderson | |
99 | 5b450407 | Richard Henderson | pc = env->pc; |
100 | c3082755 | Richard Henderson | insn = cpu_ldl_code(env, pc); |
101 | 5b450407 | Richard Henderson | |
102 | 5b450407 | Richard Henderson | env->trap_arg0 = addr; |
103 | 5b450407 | Richard Henderson | env->trap_arg1 = insn >> 26; /* opcode */ |
104 | 5b450407 | Richard Henderson | env->trap_arg2 = (insn >> 21) & 31; /* dest regno */ |
105 | b9f0923e | Richard Henderson | env->exception_index = EXCP_UNALIGN; |
106 | b9f0923e | Richard Henderson | env->error_code = 0;
|
107 | b9f0923e | Richard Henderson | cpu_loop_exit(env); |
108 | 5b450407 | Richard Henderson | } |
109 | 5b450407 | Richard Henderson | |
110 | a8170e5e | Avi Kivity | void cpu_unassigned_access(CPUAlphaState *env, hwaddr addr,
|
111 | c3082755 | Richard Henderson | int is_write, int is_exec, int unused, int size) |
112 | 5b450407 | Richard Henderson | { |
113 | 5b450407 | Richard Henderson | env->trap_arg0 = addr; |
114 | 5b450407 | Richard Henderson | env->trap_arg1 = is_write; |
115 | 20503968 | Blue Swirl | dynamic_excp(env, 0, EXCP_MCHK, 0); |
116 | 5b450407 | Richard Henderson | } |
117 | 5b450407 | Richard Henderson | |
118 | 3e457172 | Blue Swirl | #include "softmmu_exec.h" |
119 | 3e457172 | Blue Swirl | |
120 | 4c9649a9 | j_mayer | #define MMUSUFFIX _mmu
|
121 | 5b450407 | Richard Henderson | #define ALIGNED_ONLY
|
122 | 4c9649a9 | j_mayer | |
123 | 4c9649a9 | j_mayer | #define SHIFT 0 |
124 | 4c9649a9 | j_mayer | #include "softmmu_template.h" |
125 | 4c9649a9 | j_mayer | |
126 | 4c9649a9 | j_mayer | #define SHIFT 1 |
127 | 4c9649a9 | j_mayer | #include "softmmu_template.h" |
128 | 4c9649a9 | j_mayer | |
129 | 4c9649a9 | j_mayer | #define SHIFT 2 |
130 | 4c9649a9 | j_mayer | #include "softmmu_template.h" |
131 | 4c9649a9 | j_mayer | |
132 | 4c9649a9 | j_mayer | #define SHIFT 3 |
133 | 4c9649a9 | j_mayer | #include "softmmu_template.h" |
134 | 4c9649a9 | j_mayer | |
135 | 4c9649a9 | j_mayer | /* try to fill the TLB and return an exception if error. If retaddr is
|
136 | 4c9649a9 | j_mayer | NULL, it means that the function was called in C code (i.e. not
|
137 | 4c9649a9 | j_mayer | from generated code or from helper.c) */
|
138 | 4c9649a9 | j_mayer | /* XXX: fix it to restore all registers */
|
139 | c3082755 | Richard Henderson | void tlb_fill(CPUAlphaState *env, target_ulong addr, int is_write, |
140 | 20503968 | Blue Swirl | int mmu_idx, uintptr_t retaddr)
|
141 | 4c9649a9 | j_mayer | { |
142 | 4c9649a9 | j_mayer | int ret;
|
143 | 4c9649a9 | j_mayer | |
144 | 97b348e7 | Blue Swirl | ret = cpu_alpha_handle_mmu_fault(env, addr, is_write, mmu_idx); |
145 | 2d9671d3 | Richard Henderson | if (unlikely(ret != 0)) { |
146 | b9f0923e | Richard Henderson | do_restore_state(env, retaddr); |
147 | 4c9649a9 | j_mayer | /* Exception index and error code are already set */
|
148 | 1162c041 | Blue Swirl | cpu_loop_exit(env); |
149 | 4c9649a9 | j_mayer | } |
150 | 4c9649a9 | j_mayer | } |
151 | c3082755 | Richard Henderson | #endif /* CONFIG_USER_ONLY */ |