Revision ccd4a219

b/target-sparc/cpu.h
320 320
void raise_exception(int tt);
321 321
void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
322 322
                          int is_asi);
323
void do_tick_set_count(void *opaque, uint64_t count);
324
uint64_t do_tick_get_count(void *opaque);
325
void do_tick_set_limit(void *opaque, uint64_t limit);
326 323
void cpu_check_irqs(CPUSPARCState *env);
327 324

  
328 325
#define CPUState CPUSPARCState
b/target-sparc/helper.c
612 612
#include "qemu-timer.h"
613 613
#endif
614 614

  
615
void do_tick_set_count(void *opaque, uint64_t count)
615
void helper_tick_set_count(void *opaque, uint64_t count)
616 616
{
617 617
#if !defined(CONFIG_USER_ONLY)
618 618
    ptimer_set_count(opaque, -count);
619 619
#endif
620 620
}
621 621

  
622
uint64_t do_tick_get_count(void *opaque)
622
uint64_t helper_tick_get_count(void *opaque)
623 623
{
624 624
#if !defined(CONFIG_USER_ONLY)
625 625
    return -ptimer_get_count(opaque);
......
628 628
#endif
629 629
}
630 630

  
631
void do_tick_set_limit(void *opaque, uint64_t limit)
631
void helper_tick_set_limit(void *opaque, uint64_t limit)
632 632
{
633 633
#if !defined(CONFIG_USER_ONLY)
634 634
    ptimer_set_limit(opaque, -limit, 0);
b/target-sparc/helper.h
19 19
target_ulong  TCG_HELPER_PROTO
20 20
helper_casx_asi(target_ulong addr, target_ulong val1,
21 21
                target_ulong val2, uint32_t asi);
22
void TCG_HELPER_PROTO helper_tick_set_count(void *opaque, uint64_t count);
23
uint64_t TCG_HELPER_PROTO helper_tick_get_count(void *opaque);
24
void TCG_HELPER_PROTO helper_tick_set_limit(void *opaque, uint64_t limit);
22 25
#endif
23 26
void TCG_HELPER_PROTO helper_trap(target_ulong nb_trap);
24 27
void TCG_HELPER_PROTO helper_trapcc(target_ulong nb_trap,
b/target-sparc/op.c
806 806
    PUT_CCR(env, T0);
807 807
}
808 808

  
809
void OPPROTO op_rdtick(void)
810
{
811
    T0 = do_tick_get_count(env->tick);
812
}
813

  
814
void OPPROTO op_wrtick(void)
815
{
816
    do_tick_set_count(env->tick, T0);
817
}
818

  
819
void OPPROTO op_wrtick_cmpr(void)
820
{
821
    do_tick_set_limit(env->tick, T0);
822
}
823

  
824
void OPPROTO op_rdstick(void)
825
{
826
    T0 = do_tick_get_count(env->stick);
827
}
828

  
829
void OPPROTO op_wrstick(void)
830
{
831
    do_tick_set_count(env->stick, T0);
832
    do_tick_set_count(env->hstick, T0);
833
}
834

  
835
void OPPROTO op_wrstick_cmpr(void)
836
{
837
    do_tick_set_limit(env->stick, T0);
838
}
839

  
840
void OPPROTO op_wrhstick_cmpr(void)
841
{
842
    do_tick_set_limit(env->hstick, T0);
843
}
844

  
845 809
void OPPROTO op_rdtpc(void)
846 810
{
847 811
    T0 = env->tpc[env->tl];
b/target-sparc/translate.c
1204 1204
                    gen_movl_T0_reg(rd);
1205 1205
                    break;
1206 1206
                case 0x4: /* V9 rdtick */
1207
                    gen_op_rdtick();
1208
                    gen_movl_T0_reg(rd);
1207
                    {
1208
                        TCGv r_tickptr;
1209

  
1210
                        r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
1211
                        tcg_gen_ld_ptr(r_tickptr, cpu_env,
1212
                                       offsetof(CPUState, tick));
1213
                        tcg_gen_helper_1_1(helper_tick_get_count, cpu_T[0],
1214
                                           r_tickptr);
1215
                        gen_movl_T0_reg(rd);
1216
                    }
1209 1217
                    break;
1210 1218
                case 0x5: /* V9 rdpc */
1211 1219
                    tcg_gen_movi_tl(cpu_T[0], dc->pc);
......
1228 1236
                    gen_movl_T0_reg(rd);
1229 1237
                    break;
1230 1238
                case 0x18: /* System tick */
1231
                    gen_op_rdstick();
1232
                    gen_movl_T0_reg(rd);
1239
                    {
1240
                        TCGv r_tickptr;
1241

  
1242
                        r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
1243
                        tcg_gen_ld_ptr(r_tickptr, cpu_env,
1244
                                       offsetof(CPUState, stick));
1245
                        tcg_gen_helper_1_1(helper_tick_get_count, cpu_T[0],
1246
                                           r_tickptr);
1247
                        gen_movl_T0_reg(rd);
1248
                    }
1233 1249
                    break;
1234 1250
                case 0x19: /* System tick compare */
1235 1251
                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, stick_cmpr));
......
1299 1315
                    gen_op_rdtt();
1300 1316
                    break;
1301 1317
                case 4: // tick
1302
                    gen_op_rdtick();
1318
                    {
1319
                        TCGv r_tickptr;
1320

  
1321
                        r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
1322
                        tcg_gen_ld_ptr(r_tickptr, cpu_env,
1323
                                       offsetof(CPUState, tick));
1324
                        tcg_gen_helper_1_1(helper_tick_get_count, cpu_T[0],
1325
                                           r_tickptr);
1326
                        gen_movl_T0_reg(rd);
1327
                    }
1303 1328
                    break;
1304 1329
                case 5: // tba
1305 1330
                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, tbr));
......
2281 2306
                                if (!supervisor(dc))
2282 2307
                                    goto illegal_insn;
2283 2308
#endif
2284
                                gen_op_xor_T1_T0();
2285
                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, tick_cmpr));
2286
                                gen_op_wrtick_cmpr();
2309
                                {
2310
                                    TCGv r_tickptr;
2311

  
2312
                                    gen_op_xor_T1_T0();
2313
                                    gen_op_movtl_env_T0(offsetof(CPUSPARCState,
2314
                                                                 tick_cmpr));
2315
                                    r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
2316
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
2317
                                                   offsetof(CPUState, tick));
2318
                                    tcg_gen_helper_0_2(helper_tick_set_limit,
2319
                                                       r_tickptr, cpu_T[0]);
2320
                                }
2287 2321
                                break;
2288 2322
                            case 0x18: /* System tick */
2289 2323
#if !defined(CONFIG_USER_ONLY)
2290 2324
                                if (!supervisor(dc))
2291 2325
                                    goto illegal_insn;
2292 2326
#endif
2293
                                gen_op_xor_T1_T0();
2294
                                gen_op_wrstick();
2327
                                {
2328
                                    TCGv r_tickptr;
2329

  
2330
                                    gen_op_xor_T1_T0();
2331
                                    r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
2332
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
2333
                                                   offsetof(CPUState, stick));
2334
                                    tcg_gen_helper_0_2(helper_tick_set_count,
2335
                                                       r_tickptr, cpu_T[0]);
2336
                                }
2295 2337
                                break;
2296 2338
                            case 0x19: /* System tick compare */
2297 2339
#if !defined(CONFIG_USER_ONLY)
2298 2340
                                if (!supervisor(dc))
2299 2341
                                    goto illegal_insn;
2300 2342
#endif
2301
                                gen_op_xor_T1_T0();
2302
                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, stick_cmpr));
2303
                                gen_op_wrstick_cmpr();
2343
                                {
2344
                                    TCGv r_tickptr;
2345

  
2346
                                    gen_op_xor_T1_T0();
2347
                                    gen_op_movtl_env_T0(offsetof(CPUSPARCState,
2348
                                                                 stick_cmpr));
2349
                                    r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
2350
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
2351
                                                   offsetof(CPUState, stick));
2352
                                    tcg_gen_helper_0_2(helper_tick_set_limit,
2353
                                                       r_tickptr, cpu_T[0]);
2354
                                }
2304 2355
                                break;
2305 2356

  
2306 2357
                            case 0x10: /* Performance Control */
......
2366 2417
                                gen_op_wrtt();
2367 2418
                                break;
2368 2419
                            case 4: // tick
2369
                                gen_op_wrtick();
2420
                                {
2421
                                    TCGv r_tickptr;
2422

  
2423
                                    r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
2424
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
2425
                                                   offsetof(CPUState, tick));
2426
                                    tcg_gen_helper_0_2(helper_tick_set_count,
2427
                                                       r_tickptr, cpu_T[0]);
2428
                                }
2370 2429
                                break;
2371 2430
                            case 5: // tba
2372 2431
                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, tbr));
......
2448 2507
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, htba));
2449 2508
                                break;
2450 2509
                            case 31: // hstick_cmpr
2451
                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, hstick_cmpr));
2452
                                gen_op_wrhstick_cmpr();
2510
                                {
2511
                                    TCGv r_tickptr;
2512

  
2513
                                    gen_op_movtl_env_T0(offsetof(CPUSPARCState,
2514
                                                                 hstick_cmpr));
2515
                                    r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
2516
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
2517
                                                   offsetof(CPUState, hstick));
2518
                                    tcg_gen_helper_0_2(helper_tick_set_limit,
2519
                                                       r_tickptr, cpu_T[0]);
2520
                                }
2453 2521
                                break;
2454 2522
                            case 6: // hver readonly
2455 2523
                            default:

Also available in: Unified diff