11
14
#include "helper.h"
12
15
#include "host-utils.h"
14
static inline void set_feature(CPUState *env, int feature)
16
env->features |= feature;
24
static const struct uc32_cpu_t uc32_cpu_names[] = {
25
{ UC32_CPUID_UCV2, "UniCore-II"},
26
{ UC32_CPUID_ANY, "any"},
30
/* return 0 if not found */
31
static uint32_t uc32_cpu_find_by_name(const char *name)
37
for (i = 0; uc32_cpu_names[i].name; i++) {
38
if (strcmp(name, uc32_cpu_names[i].name) == 0) {
39
id = uc32_cpu_names[i].id;
46
CPUState *uc32_cpu_init(const char *cpu_model)
17
CPUUniCore32State *uc32_cpu_init(const char *cpu_model)
20
CPUUniCore32State *env;
50
21
static int inited = 1;
52
env = g_malloc0(sizeof(CPUState));
55
id = uc32_cpu_find_by_name(cpu_model);
58
set_feature(env, UC32_HWCAP_CMOV);
59
set_feature(env, UC32_HWCAP_UCF64);
60
env->ucf64.xregs[UC32_UCF64_FPSCR] = 0;
61
env->cp0.c0_cachetype = 0x1dd20d2;
62
env->cp0.c1_sys = 0x00090078;
64
case UC32_CPUID_ANY: /* For userspace emulation. */
65
set_feature(env, UC32_HWCAP_CMOV);
66
set_feature(env, UC32_HWCAP_UCF64);
69
cpu_abort(env, "Bad CPU ID: %x\n", id);
23
if (object_class_by_name(cpu_model) == NULL) {
72
env->cpu_model_str = cpu_model;
73
env->cp0.c0_cpuid = id;
74
env->uncached_asr = ASR_MODE_USER;
26
cpu = UNICORE32_CPU(object_new(cpu_model));
79
31
uc32_translate_init();
83
34
qemu_init_vcpu(env);
97
void do_interrupt(CPUState *env)
48
void do_interrupt(CPUUniCore32State *env)
99
50
env->exception_index = -1;
102
int uc32_cpu_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
53
int uc32_cpu_handle_mmu_fault(CPUUniCore32State *env, target_ulong address, int rw,
105
56
env->exception_index = UC32_EXCP_TRAP;
110
61
/* These should probably raise undefined insn exceptions. */
111
void HELPER(set_cp)(CPUState *env, uint32_t insn, uint32_t val)
62
void HELPER(set_cp)(CPUUniCore32State *env, uint32_t insn, uint32_t val)
113
64
int op1 = (insn >> 8) & 0xf;
114
65
cpu_abort(env, "cp%i insn %08x\n", op1, insn);
118
uint32_t HELPER(get_cp)(CPUState *env, uint32_t insn)
69
uint32_t HELPER(get_cp)(CPUUniCore32State *env, uint32_t insn)
120
71
int op1 = (insn >> 8) & 0xf;
121
72
cpu_abort(env, "cp%i insn %08x\n", op1, insn);
125
void HELPER(set_cp0)(CPUState *env, uint32_t insn, uint32_t val)
76
void HELPER(set_cp0)(CPUUniCore32State *env, uint32_t insn, uint32_t val)
127
78
cpu_abort(env, "cp0 insn %08x\n", insn);
130
uint32_t HELPER(get_cp0)(CPUState *env, uint32_t insn)
81
uint32_t HELPER(get_cp0)(CPUUniCore32State *env, uint32_t insn)
132
83
cpu_abort(env, "cp0 insn %08x\n", insn);
136
void switch_mode(CPUState *env, int mode)
87
void switch_mode(CPUUniCore32State *env, int mode)
138
89
if (mode != ASR_MODE_USER) {
139
90
cpu_abort(env, "Tried to switch out of user mode\n");
143
void HELPER(set_r29_banked)(CPUState *env, uint32_t mode, uint32_t val)
94
void HELPER(set_r29_banked)(CPUUniCore32State *env, uint32_t mode, uint32_t val)
145
96
cpu_abort(env, "banked r29 write\n");
148
uint32_t HELPER(get_r29_banked)(CPUState *env, uint32_t mode)
99
uint32_t HELPER(get_r29_banked)(CPUUniCore32State *env, uint32_t mode)
150
101
cpu_abort(env, "banked r29 read\n");
246
197
set_float_exception_flags(i, &env->ucf64.fp_status);
249
float32 HELPER(ucf64_adds)(float32 a, float32 b, CPUState *env)
200
float32 HELPER(ucf64_adds)(float32 a, float32 b, CPUUniCore32State *env)
251
202
return float32_add(a, b, &env->ucf64.fp_status);
254
float64 HELPER(ucf64_addd)(float64 a, float64 b, CPUState *env)
205
float64 HELPER(ucf64_addd)(float64 a, float64 b, CPUUniCore32State *env)
256
207
return float64_add(a, b, &env->ucf64.fp_status);
259
float32 HELPER(ucf64_subs)(float32 a, float32 b, CPUState *env)
210
float32 HELPER(ucf64_subs)(float32 a, float32 b, CPUUniCore32State *env)
261
212
return float32_sub(a, b, &env->ucf64.fp_status);
264
float64 HELPER(ucf64_subd)(float64 a, float64 b, CPUState *env)
215
float64 HELPER(ucf64_subd)(float64 a, float64 b, CPUUniCore32State *env)
266
217
return float64_sub(a, b, &env->ucf64.fp_status);
269
float32 HELPER(ucf64_muls)(float32 a, float32 b, CPUState *env)
220
float32 HELPER(ucf64_muls)(float32 a, float32 b, CPUUniCore32State *env)
271
222
return float32_mul(a, b, &env->ucf64.fp_status);
274
float64 HELPER(ucf64_muld)(float64 a, float64 b, CPUState *env)
225
float64 HELPER(ucf64_muld)(float64 a, float64 b, CPUUniCore32State *env)
276
227
return float64_mul(a, b, &env->ucf64.fp_status);
279
float32 HELPER(ucf64_divs)(float32 a, float32 b, CPUState *env)
230
float32 HELPER(ucf64_divs)(float32 a, float32 b, CPUUniCore32State *env)
281
232
return float32_div(a, b, &env->ucf64.fp_status);
284
float64 HELPER(ucf64_divd)(float64 a, float64 b, CPUState *env)
235
float64 HELPER(ucf64_divd)(float64 a, float64 b, CPUUniCore32State *env)
286
237
return float64_div(a, b, &env->ucf64.fp_status);
309
260
/* XXX: check quiet/signaling case */
310
void HELPER(ucf64_cmps)(float32 a, float32 b, uint32_t c, CPUState *env)
261
void HELPER(ucf64_cmps)(float32 a, float32 b, uint32_t c, CPUUniCore32State *env)
313
264
flag = float32_compare_quiet(a, b, &env->ucf64.fp_status);
355
306
| (env->ucf64.xregs[UC32_UCF64_FPSCR] & 0x0fffffff);
358
void HELPER(ucf64_cmpd)(float64 a, float64 b, uint32_t c, CPUState *env)
309
void HELPER(ucf64_cmpd)(float64 a, float64 b, uint32_t c, CPUUniCore32State *env)
361
312
flag = float64_compare_quiet(a, b, &env->ucf64.fp_status);
451
402
/* Integer to float conversion. */
452
float32 HELPER(ucf64_si2sf)(float32 x, CPUState *env)
403
float32 HELPER(ucf64_si2sf)(float32 x, CPUUniCore32State *env)
454
405
return int32_to_float32(ucf64_stoi(x), &env->ucf64.fp_status);
457
float64 HELPER(ucf64_si2df)(float32 x, CPUState *env)
408
float64 HELPER(ucf64_si2df)(float32 x, CPUUniCore32State *env)
459
410
return int32_to_float64(ucf64_stoi(x), &env->ucf64.fp_status);
462
413
/* Float to integer conversion. */
463
float32 HELPER(ucf64_sf2si)(float32 x, CPUState *env)
414
float32 HELPER(ucf64_sf2si)(float32 x, CPUUniCore32State *env)
465
416
return ucf64_itos(float32_to_int32(x, &env->ucf64.fp_status));
468
float32 HELPER(ucf64_df2si)(float64 x, CPUState *env)
419
float32 HELPER(ucf64_df2si)(float64 x, CPUUniCore32State *env)
470
421
return ucf64_itos(float64_to_int32(x, &env->ucf64.fp_status));
473
424
/* floating point conversion */
474
float64 HELPER(ucf64_sf2df)(float32 x, CPUState *env)
425
float64 HELPER(ucf64_sf2df)(float32 x, CPUUniCore32State *env)
476
427
return float32_to_float64(x, &env->ucf64.fp_status);
479
float32 HELPER(ucf64_df2sf)(float64 x, CPUState *env)
430
float32 HELPER(ucf64_df2sf)(float64 x, CPUUniCore32State *env)
481
432
return float64_to_float32(x, &env->ucf64.fp_status);