Statistics
| Branch: | Revision:

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 */