translate.c (05a9a6519c9127b5fb0b13481ecc0e72331c8a38) translate.c (f0f7e7f7b284f536389a3c5b67de681055325317)
1/*
2 * Xilinx MicroBlaze emulation for qemu: main translation routines.
3 *
4 * Copyright (c) 2009 Edgar E. Iglesias.
5 * Copyright (c) 2009-2012 PetaLogix Qld Pty Ltd.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public

--- 445 unchanged lines hidden (view full) ---

454 tcg_temp_free_i64(t);
455}
456
457static void dec_msr(DisasContext *dc)
458{
459 CPUState *cs = CPU(dc->cpu);
460 TCGv_i32 t0, t1;
461 unsigned int sr, rn;
1/*
2 * Xilinx MicroBlaze emulation for qemu: main translation routines.
3 *
4 * Copyright (c) 2009 Edgar E. Iglesias.
5 * Copyright (c) 2009-2012 PetaLogix Qld Pty Ltd.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public

--- 445 unchanged lines hidden (view full) ---

454 tcg_temp_free_i64(t);
455}
456
457static void dec_msr(DisasContext *dc)
458{
459 CPUState *cs = CPU(dc->cpu);
460 TCGv_i32 t0, t1;
461 unsigned int sr, rn;
462 bool to, clrset, extended;
462 bool to, clrset, extended = false;
463
464 sr = extract32(dc->imm, 0, 14);
465 to = extract32(dc->imm, 14, 1);
466 clrset = extract32(dc->imm, 15, 1) == 0;
467 dc->type_b = 1;
468 if (to) {
469 dc->cpustate_changed = 1;
463
464 sr = extract32(dc->imm, 0, 14);
465 to = extract32(dc->imm, 14, 1);
466 clrset = extract32(dc->imm, 15, 1) == 0;
467 dc->type_b = 1;
468 if (to) {
469 dc->cpustate_changed = 1;
470 extended = extract32(dc->imm, 24, 1);
471 } else {
472 extended = extract32(dc->imm, 19, 1);
473 }
474
470 }
471
472 /* Extended MSRs are only available if addr_size > 32. */
473 if (dc->cpu->cfg.addr_size > 32) {
474 /* The E-bit is encoded differently for To/From MSR. */
475 static const unsigned int e_bit[] = { 19, 24 };
476
477 extended = extract32(dc->imm, e_bit[to], 1);
478 }
479
475 /* msrclr and msrset. */
476 if (clrset) {
477 bool clr = extract32(dc->ir, 16, 1);
478
479 LOG_DIS("msr%s r%d imm=%x\n", clr ? "clr" : "set",
480 dc->rd, dc->imm);
481
482 if (!dc->cpu->cfg.use_msr_instr) {

--- 28 unchanged lines hidden (view full) ---

511
512 if (trap_userspace(dc, to)) {
513 return;
514 }
515
516#if !defined(CONFIG_USER_ONLY)
517 /* Catch read/writes to the mmu block. */
518 if ((sr & ~0xff) == 0x1000) {
480 /* msrclr and msrset. */
481 if (clrset) {
482 bool clr = extract32(dc->ir, 16, 1);
483
484 LOG_DIS("msr%s r%d imm=%x\n", clr ? "clr" : "set",
485 dc->rd, dc->imm);
486
487 if (!dc->cpu->cfg.use_msr_instr) {

--- 28 unchanged lines hidden (view full) ---

516
517 if (trap_userspace(dc, to)) {
518 return;
519 }
520
521#if !defined(CONFIG_USER_ONLY)
522 /* Catch read/writes to the mmu block. */
523 if ((sr & ~0xff) == 0x1000) {
524 TCGv_i32 tmp_ext = tcg_const_i32(extended);
519 TCGv_i32 tmp_sr;
520
521 sr &= 7;
522 tmp_sr = tcg_const_i32(sr);
523 LOG_DIS("m%ss sr%d r%d imm=%x\n", to ? "t" : "f", sr, dc->ra, dc->imm);
524 if (to) {
525 TCGv_i32 tmp_sr;
526
527 sr &= 7;
528 tmp_sr = tcg_const_i32(sr);
529 LOG_DIS("m%ss sr%d r%d imm=%x\n", to ? "t" : "f", sr, dc->ra, dc->imm);
530 if (to) {
525 gen_helper_mmu_write(cpu_env, tmp_sr, cpu_R[dc->ra]);
531 gen_helper_mmu_write(cpu_env, tmp_ext, tmp_sr, cpu_R[dc->ra]);
526 } else {
532 } else {
527 gen_helper_mmu_read(cpu_R[dc->rd], cpu_env, tmp_sr);
533 gen_helper_mmu_read(cpu_R[dc->rd], cpu_env, tmp_ext, tmp_sr);
528 }
529 tcg_temp_free_i32(tmp_sr);
534 }
535 tcg_temp_free_i32(tmp_sr);
536 tcg_temp_free_i32(tmp_ext);
530 return;
531 }
532#endif
533
534 if (to) {
535 LOG_DIS("m%ss sr%x r%d imm=%x\n", to ? "t" : "f", sr, dc->ra, dc->imm);
536 switch (sr) {
537 case 0:

--- 1316 unchanged lines hidden ---
537 return;
538 }
539#endif
540
541 if (to) {
542 LOG_DIS("m%ss sr%x r%d imm=%x\n", to ? "t" : "f", sr, dc->ra, dc->imm);
543 switch (sr) {
544 case 0:

--- 1316 unchanged lines hidden ---