Statistics
| Branch: | Revision:

root / target-alpha / helper.c @ b5f1aa64

History | View | Annotate | Download (5.3 kB)

1 4c9649a9 j_mayer
/*
2 4c9649a9 j_mayer
 *  Alpha emulation cpu helpers for qemu.
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 4c9649a9 j_mayer
#include <stdint.h>
21 4c9649a9 j_mayer
#include <stdlib.h>
22 4c9649a9 j_mayer
#include <stdio.h>
23 4c9649a9 j_mayer
24 4c9649a9 j_mayer
#include "cpu.h"
25 4c9649a9 j_mayer
#include "exec-all.h"
26 ba0e276d Richard Henderson
#include "softfloat.h"
27 ba0e276d Richard Henderson
28 ba0e276d Richard Henderson
uint64_t cpu_alpha_load_fpcr (CPUState *env)
29 ba0e276d Richard Henderson
{
30 8443effb Richard Henderson
    uint64_t r = 0;
31 8443effb Richard Henderson
    uint8_t t;
32 8443effb Richard Henderson
33 8443effb Richard Henderson
    t = env->fpcr_exc_status;
34 8443effb Richard Henderson
    if (t) {
35 8443effb Richard Henderson
        r = FPCR_SUM;
36 8443effb Richard Henderson
        if (t & float_flag_invalid) {
37 8443effb Richard Henderson
            r |= FPCR_INV;
38 8443effb Richard Henderson
        }
39 8443effb Richard Henderson
        if (t & float_flag_divbyzero) {
40 8443effb Richard Henderson
            r |= FPCR_DZE;
41 8443effb Richard Henderson
        }
42 8443effb Richard Henderson
        if (t & float_flag_overflow) {
43 8443effb Richard Henderson
            r |= FPCR_OVF;
44 8443effb Richard Henderson
        }
45 8443effb Richard Henderson
        if (t & float_flag_underflow) {
46 8443effb Richard Henderson
            r |= FPCR_UNF;
47 8443effb Richard Henderson
        }
48 8443effb Richard Henderson
        if (t & float_flag_inexact) {
49 8443effb Richard Henderson
            r |= FPCR_INE;
50 8443effb Richard Henderson
        }
51 8443effb Richard Henderson
    }
52 8443effb Richard Henderson
53 8443effb Richard Henderson
    t = env->fpcr_exc_mask;
54 8443effb Richard Henderson
    if (t & float_flag_invalid) {
55 8443effb Richard Henderson
        r |= FPCR_INVD;
56 8443effb Richard Henderson
    }
57 8443effb Richard Henderson
    if (t & float_flag_divbyzero) {
58 8443effb Richard Henderson
        r |= FPCR_DZED;
59 8443effb Richard Henderson
    }
60 8443effb Richard Henderson
    if (t & float_flag_overflow) {
61 8443effb Richard Henderson
        r |= FPCR_OVFD;
62 8443effb Richard Henderson
    }
63 8443effb Richard Henderson
    if (t & float_flag_underflow) {
64 8443effb Richard Henderson
        r |= FPCR_UNFD;
65 8443effb Richard Henderson
    }
66 8443effb Richard Henderson
    if (t & float_flag_inexact) {
67 8443effb Richard Henderson
        r |= FPCR_INED;
68 8443effb Richard Henderson
    }
69 8443effb Richard Henderson
70 8443effb Richard Henderson
    switch (env->fpcr_dyn_round) {
71 ba0e276d Richard Henderson
    case float_round_nearest_even:
72 8443effb Richard Henderson
        r |= FPCR_DYN_NORMAL;
73 ba0e276d Richard Henderson
        break;
74 ba0e276d Richard Henderson
    case float_round_down:
75 8443effb Richard Henderson
        r |= FPCR_DYN_MINUS;
76 ba0e276d Richard Henderson
        break;
77 ba0e276d Richard Henderson
    case float_round_up:
78 8443effb Richard Henderson
        r |= FPCR_DYN_PLUS;
79 ba0e276d Richard Henderson
        break;
80 ba0e276d Richard Henderson
    case float_round_to_zero:
81 8443effb Richard Henderson
        r |= FPCR_DYN_CHOPPED;
82 ba0e276d Richard Henderson
        break;
83 ba0e276d Richard Henderson
    }
84 8443effb Richard Henderson
85 8443effb Richard Henderson
    if (env->fpcr_dnz) {
86 8443effb Richard Henderson
        r |= FPCR_DNZ;
87 8443effb Richard Henderson
    }
88 8443effb Richard Henderson
    if (env->fpcr_dnod) {
89 8443effb Richard Henderson
        r |= FPCR_DNOD;
90 8443effb Richard Henderson
    }
91 8443effb Richard Henderson
    if (env->fpcr_undz) {
92 8443effb Richard Henderson
        r |= FPCR_UNDZ;
93 8443effb Richard Henderson
    }
94 8443effb Richard Henderson
95 8443effb Richard Henderson
    return r;
96 ba0e276d Richard Henderson
}
97 ba0e276d Richard Henderson
98 ba0e276d Richard Henderson
void cpu_alpha_store_fpcr (CPUState *env, uint64_t val)
99 ba0e276d Richard Henderson
{
100 8443effb Richard Henderson
    uint8_t t;
101 8443effb Richard Henderson
102 8443effb Richard Henderson
    t = 0;
103 8443effb Richard Henderson
    if (val & FPCR_INV) {
104 8443effb Richard Henderson
        t |= float_flag_invalid;
105 8443effb Richard Henderson
    }
106 8443effb Richard Henderson
    if (val & FPCR_DZE) {
107 8443effb Richard Henderson
        t |= float_flag_divbyzero;
108 8443effb Richard Henderson
    }
109 8443effb Richard Henderson
    if (val & FPCR_OVF) {
110 8443effb Richard Henderson
        t |= float_flag_overflow;
111 8443effb Richard Henderson
    }
112 8443effb Richard Henderson
    if (val & FPCR_UNF) {
113 8443effb Richard Henderson
        t |= float_flag_underflow;
114 8443effb Richard Henderson
    }
115 8443effb Richard Henderson
    if (val & FPCR_INE) {
116 8443effb Richard Henderson
        t |= float_flag_inexact;
117 8443effb Richard Henderson
    }
118 8443effb Richard Henderson
    env->fpcr_exc_status = t;
119 8443effb Richard Henderson
120 8443effb Richard Henderson
    t = 0;
121 8443effb Richard Henderson
    if (val & FPCR_INVD) {
122 8443effb Richard Henderson
        t |= float_flag_invalid;
123 8443effb Richard Henderson
    }
124 8443effb Richard Henderson
    if (val & FPCR_DZED) {
125 8443effb Richard Henderson
        t |= float_flag_divbyzero;
126 8443effb Richard Henderson
    }
127 8443effb Richard Henderson
    if (val & FPCR_OVFD) {
128 8443effb Richard Henderson
        t |= float_flag_overflow;
129 8443effb Richard Henderson
    }
130 8443effb Richard Henderson
    if (val & FPCR_UNFD) {
131 8443effb Richard Henderson
        t |= float_flag_underflow;
132 8443effb Richard Henderson
    }
133 8443effb Richard Henderson
    if (val & FPCR_INED) {
134 8443effb Richard Henderson
        t |= float_flag_inexact;
135 8443effb Richard Henderson
    }
136 8443effb Richard Henderson
    env->fpcr_exc_mask = t;
137 8443effb Richard Henderson
138 8443effb Richard Henderson
    switch (val & FPCR_DYN_MASK) {
139 8443effb Richard Henderson
    case FPCR_DYN_CHOPPED:
140 8443effb Richard Henderson
        t = float_round_to_zero;
141 ba0e276d Richard Henderson
        break;
142 8443effb Richard Henderson
    case FPCR_DYN_MINUS:
143 8443effb Richard Henderson
        t = float_round_down;
144 ba0e276d Richard Henderson
        break;
145 8443effb Richard Henderson
    case FPCR_DYN_NORMAL:
146 8443effb Richard Henderson
        t = float_round_nearest_even;
147 ba0e276d Richard Henderson
        break;
148 8443effb Richard Henderson
    case FPCR_DYN_PLUS:
149 8443effb Richard Henderson
        t = float_round_up;
150 ba0e276d Richard Henderson
        break;
151 ba0e276d Richard Henderson
    }
152 8443effb Richard Henderson
    env->fpcr_dyn_round = t;
153 8443effb Richard Henderson
154 8443effb Richard Henderson
    env->fpcr_flush_to_zero
155 8443effb Richard Henderson
      = (val & (FPCR_UNDZ|FPCR_UNFD)) == (FPCR_UNDZ|FPCR_UNFD);
156 8443effb Richard Henderson
157 8443effb Richard Henderson
    env->fpcr_dnz = (val & FPCR_DNZ) != 0;
158 8443effb Richard Henderson
    env->fpcr_dnod = (val & FPCR_DNOD) != 0;
159 8443effb Richard Henderson
    env->fpcr_undz = (val & FPCR_UNDZ) != 0;
160 ba0e276d Richard Henderson
}
161 4c9649a9 j_mayer
162 5fafdf24 ths
#if defined(CONFIG_USER_ONLY)
163 4c9649a9 j_mayer
164 4c9649a9 j_mayer
int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
165 6ebbf390 j_mayer
                                int mmu_idx, int is_softmmu)
166 4c9649a9 j_mayer
{
167 07b6c13b Richard Henderson
    env->exception_index = EXCP_MMFAULT;
168 129d8aa5 Richard Henderson
    env->trap_arg0 = address;
169 4c9649a9 j_mayer
    return 1;
170 4c9649a9 j_mayer
}
171 4c9649a9 j_mayer
172 4c9649a9 j_mayer
void do_interrupt (CPUState *env)
173 4c9649a9 j_mayer
{
174 4c9649a9 j_mayer
    env->exception_index = -1;
175 4c9649a9 j_mayer
}
176 4c9649a9 j_mayer
177 4c9649a9 j_mayer
#else
178 4c9649a9 j_mayer
179 c227f099 Anthony Liguori
target_phys_addr_t cpu_get_phys_page_debug (CPUState *env, target_ulong addr)
180 4c9649a9 j_mayer
{
181 4c9649a9 j_mayer
    return -1;
182 4c9649a9 j_mayer
}
183 4c9649a9 j_mayer
184 4c9649a9 j_mayer
int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
185 6ebbf390 j_mayer
                                int mmu_idx, int is_softmmu)
186 4c9649a9 j_mayer
{
187 129d8aa5 Richard Henderson
    return 0;
188 4c9649a9 j_mayer
}
189 4c9649a9 j_mayer
190 4c9649a9 j_mayer
void do_interrupt (CPUState *env)
191 4c9649a9 j_mayer
{
192 129d8aa5 Richard Henderson
    abort();
193 4c9649a9 j_mayer
}
194 4c9649a9 j_mayer
#endif
195 4c9649a9 j_mayer
196 9a78eead Stefan Weil
void cpu_dump_state (CPUState *env, FILE *f, fprintf_function cpu_fprintf,
197 4c9649a9 j_mayer
                     int flags)
198 4c9649a9 j_mayer
{
199 b55266b5 blueswir1
    static const char *linux_reg_names[] = {
200 4c9649a9 j_mayer
        "v0 ", "t0 ", "t1 ", "t2 ", "t3 ", "t4 ", "t5 ", "t6 ",
201 4c9649a9 j_mayer
        "t7 ", "s0 ", "s1 ", "s2 ", "s3 ", "s4 ", "s5 ", "fp ",
202 4c9649a9 j_mayer
        "a0 ", "a1 ", "a2 ", "a3 ", "a4 ", "a5 ", "t8 ", "t9 ",
203 4c9649a9 j_mayer
        "t10", "t11", "ra ", "t12", "at ", "gp ", "sp ", "zero",
204 4c9649a9 j_mayer
    };
205 4c9649a9 j_mayer
    int i;
206 4c9649a9 j_mayer
207 129d8aa5 Richard Henderson
    cpu_fprintf(f, "     PC  " TARGET_FMT_lx "      PS  %02x\n",
208 4c9649a9 j_mayer
                env->pc, env->ps);
209 4c9649a9 j_mayer
    for (i = 0; i < 31; i++) {
210 4c9649a9 j_mayer
        cpu_fprintf(f, "IR%02d %s " TARGET_FMT_lx " ", i,
211 4c9649a9 j_mayer
                    linux_reg_names[i], env->ir[i]);
212 4c9649a9 j_mayer
        if ((i % 3) == 2)
213 4c9649a9 j_mayer
            cpu_fprintf(f, "\n");
214 4c9649a9 j_mayer
    }
215 6910b8f6 Richard Henderson
216 6910b8f6 Richard Henderson
    cpu_fprintf(f, "lock_a   " TARGET_FMT_lx " lock_v   " TARGET_FMT_lx "\n",
217 6910b8f6 Richard Henderson
                env->lock_addr, env->lock_value);
218 6910b8f6 Richard Henderson
219 4c9649a9 j_mayer
    for (i = 0; i < 31; i++) {
220 4c9649a9 j_mayer
        cpu_fprintf(f, "FIR%02d    " TARGET_FMT_lx " ", i,
221 4c9649a9 j_mayer
                    *((uint64_t *)(&env->fir[i])));
222 4c9649a9 j_mayer
        if ((i % 3) == 2)
223 4c9649a9 j_mayer
            cpu_fprintf(f, "\n");
224 4c9649a9 j_mayer
    }
225 6910b8f6 Richard Henderson
    cpu_fprintf(f, "\n");
226 4c9649a9 j_mayer
}