Commit c48fcb47518befb79b5cc75a2cad024c2d6e4bef

Authored by blueswir1
1 parent 1d8cde5b

Move CPU stuff unrelated to translation to helper.c


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4133 c046a42c-6fe2-441c-8c8c-71466251a162
target-sparc/cpu.h
... ... @@ -286,6 +286,7 @@ typedef struct CPUSPARCState {
286 286 #endif
287 287  
288 288 CPUSPARCState *cpu_sparc_init(const char *cpu_model);
  289 +void gen_intermediate_code_init(CPUSPARCState *env);
289 290 int cpu_sparc_exec(CPUSPARCState *s);
290 291 int cpu_sparc_close(CPUSPARCState *s);
291 292 void sparc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt,
... ...
target-sparc/helper.c
... ... @@ -30,6 +30,22 @@
30 30  
31 31 //#define DEBUG_MMU
32 32  
  33 +typedef struct sparc_def_t sparc_def_t;
  34 +
  35 +struct sparc_def_t {
  36 + const unsigned char *name;
  37 + target_ulong iu_version;
  38 + uint32_t fpu_version;
  39 + uint32_t mmu_version;
  40 + uint32_t mmu_bm;
  41 + uint32_t mmu_ctpr_mask;
  42 + uint32_t mmu_cxr_mask;
  43 + uint32_t mmu_sfsr_mask;
  44 + uint32_t mmu_trcr_mask;
  45 +};
  46 +
  47 +static const sparc_def_t *cpu_sparc_find_by_name(const unsigned char *name);
  48 +
33 49 /* Sparc MMU emulation */
34 50  
35 51 /* thread support */
... ... @@ -98,9 +114,9 @@ static const int perm_table[2][8] = {
98 114 }
99 115 };
100 116  
101   -int get_physical_address (CPUState *env, target_phys_addr_t *physical, int *prot,
102   - int *access_index, target_ulong address, int rw,
103   - int mmu_idx)
  117 +static int get_physical_address(CPUState *env, target_phys_addr_t *physical,
  118 + int *prot, int *access_index,
  119 + target_ulong address, int rw, int mmu_idx)
104 120 {
105 121 int access_perms = 0;
106 122 target_phys_addr_t pde_ptr;
... ... @@ -483,9 +499,9 @@ static int get_physical_address_code(CPUState *env, target_phys_addr_t *physical
483 499 return 1;
484 500 }
485 501  
486   -int get_physical_address(CPUState *env, target_phys_addr_t *physical, int *prot,
487   - int *access_index, target_ulong address, int rw,
488   - int mmu_idx)
  502 +static int get_physical_address(CPUState *env, target_phys_addr_t *physical,
  503 + int *prot, int *access_index,
  504 + target_ulong address, int rw, int mmu_idx)
489 505 {
490 506 int is_user = mmu_idx == MMU_USER_IDX;
491 507  
... ... @@ -593,6 +609,30 @@ void dump_mmu(CPUState *env)
593 609 #endif /* TARGET_SPARC64 */
594 610 #endif /* !CONFIG_USER_ONLY */
595 611  
  612 +
  613 +#if defined(CONFIG_USER_ONLY)
  614 +target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
  615 +{
  616 + return addr;
  617 +}
  618 +
  619 +#else
  620 +target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
  621 +{
  622 + target_phys_addr_t phys_addr;
  623 + int prot, access_index;
  624 +
  625 + if (get_physical_address(env, &phys_addr, &prot, &access_index, addr, 2,
  626 + MMU_KERNEL_IDX) != 0)
  627 + if (get_physical_address(env, &phys_addr, &prot, &access_index, addr,
  628 + 0, MMU_KERNEL_IDX) != 0)
  629 + return -1;
  630 + if (cpu_get_physical_page_desc(phys_addr) == IO_MEM_UNASSIGNED)
  631 + return -1;
  632 + return phys_addr;
  633 +}
  634 +#endif
  635 +
596 636 void memcpy32(target_ulong *dst, const target_ulong *src)
597 637 {
598 638 dst[0] = src[0];
... ... @@ -605,6 +645,481 @@ void memcpy32(target_ulong *dst, const target_ulong *src)
605 645 dst[7] = src[7];
606 646 }
607 647  
  648 +void helper_flush(target_ulong addr)
  649 +{
  650 + addr &= ~7;
  651 + tb_invalidate_page_range(addr, addr + 8);
  652 +}
  653 +
  654 +void cpu_reset(CPUSPARCState *env)
  655 +{
  656 + tlb_flush(env, 1);
  657 + env->cwp = 0;
  658 + env->wim = 1;
  659 + env->regwptr = env->regbase + (env->cwp * 16);
  660 +#if defined(CONFIG_USER_ONLY)
  661 + env->user_mode_only = 1;
  662 +#ifdef TARGET_SPARC64
  663 + env->cleanwin = NWINDOWS - 2;
  664 + env->cansave = NWINDOWS - 2;
  665 + env->pstate = PS_RMO | PS_PEF | PS_IE;
  666 + env->asi = 0x82; // Primary no-fault
  667 +#endif
  668 +#else
  669 + env->psret = 0;
  670 + env->psrs = 1;
  671 + env->psrps = 1;
  672 +#ifdef TARGET_SPARC64
  673 + env->pstate = PS_PRIV;
  674 + env->hpstate = HS_PRIV;
  675 + env->pc = 0x1fff0000000ULL;
  676 + env->tsptr = &env->ts[env->tl];
  677 +#else
  678 + env->pc = 0;
  679 + env->mmuregs[0] &= ~(MMU_E | MMU_NF);
  680 + env->mmuregs[0] |= env->mmu_bm;
  681 +#endif
  682 + env->npc = env->pc + 4;
  683 +#endif
  684 +}
  685 +
  686 +CPUSPARCState *cpu_sparc_init(const char *cpu_model)
  687 +{
  688 + CPUSPARCState *env;
  689 + const sparc_def_t *def;
  690 +
  691 + def = cpu_sparc_find_by_name(cpu_model);
  692 + if (!def)
  693 + return NULL;
  694 +
  695 + env = qemu_mallocz(sizeof(CPUSPARCState));
  696 + if (!env)
  697 + return NULL;
  698 + cpu_exec_init(env);
  699 + env->cpu_model_str = cpu_model;
  700 + env->version = def->iu_version;
  701 + env->fsr = def->fpu_version;
  702 +#if !defined(TARGET_SPARC64)
  703 + env->mmu_bm = def->mmu_bm;
  704 + env->mmu_ctpr_mask = def->mmu_ctpr_mask;
  705 + env->mmu_cxr_mask = def->mmu_cxr_mask;
  706 + env->mmu_sfsr_mask = def->mmu_sfsr_mask;
  707 + env->mmu_trcr_mask = def->mmu_trcr_mask;
  708 + env->mmuregs[0] |= def->mmu_version;
  709 + cpu_sparc_set_id(env, 0);
  710 +#endif
  711 +
  712 + gen_intermediate_code_init(env);
  713 +
  714 + cpu_reset(env);
  715 +
  716 + return env;
  717 +}
  718 +
  719 +void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu)
  720 +{
  721 +#if !defined(TARGET_SPARC64)
  722 + env->mxccregs[7] = ((cpu + 8) & 0xf) << 24;
  723 +#endif
  724 +}
  725 +
  726 +static const sparc_def_t sparc_defs[] = {
  727 +#ifdef TARGET_SPARC64
  728 + {
  729 + .name = "Fujitsu Sparc64",
  730 + .iu_version = ((0x04ULL << 48) | (0x02ULL << 32) | (0ULL << 24)
  731 + | (MAXTL << 8) | (NWINDOWS - 1)),
  732 + .fpu_version = 0x00000000,
  733 + .mmu_version = 0,
  734 + },
  735 + {
  736 + .name = "Fujitsu Sparc64 III",
  737 + .iu_version = ((0x04ULL << 48) | (0x03ULL << 32) | (0ULL << 24)
  738 + | (MAXTL << 8) | (NWINDOWS - 1)),
  739 + .fpu_version = 0x00000000,
  740 + .mmu_version = 0,
  741 + },
  742 + {
  743 + .name = "Fujitsu Sparc64 IV",
  744 + .iu_version = ((0x04ULL << 48) | (0x04ULL << 32) | (0ULL << 24)
  745 + | (MAXTL << 8) | (NWINDOWS - 1)),
  746 + .fpu_version = 0x00000000,
  747 + .mmu_version = 0,
  748 + },
  749 + {
  750 + .name = "Fujitsu Sparc64 V",
  751 + .iu_version = ((0x04ULL << 48) | (0x05ULL << 32) | (0x51ULL << 24)
  752 + | (MAXTL << 8) | (NWINDOWS - 1)),
  753 + .fpu_version = 0x00000000,
  754 + .mmu_version = 0,
  755 + },
  756 + {
  757 + .name = "TI UltraSparc I",
  758 + .iu_version = ((0x17ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)
  759 + | (MAXTL << 8) | (NWINDOWS - 1)),
  760 + .fpu_version = 0x00000000,
  761 + .mmu_version = 0,
  762 + },
  763 + {
  764 + .name = "TI UltraSparc II",
  765 + .iu_version = ((0x17ULL << 48) | (0x11ULL << 32) | (0x20ULL << 24)
  766 + | (MAXTL << 8) | (NWINDOWS - 1)),
  767 + .fpu_version = 0x00000000,
  768 + .mmu_version = 0,
  769 + },
  770 + {
  771 + .name = "TI UltraSparc IIi",
  772 + .iu_version = ((0x17ULL << 48) | (0x12ULL << 32) | (0x91ULL << 24)
  773 + | (MAXTL << 8) | (NWINDOWS - 1)),
  774 + .fpu_version = 0x00000000,
  775 + .mmu_version = 0,
  776 + },
  777 + {
  778 + .name = "TI UltraSparc IIe",
  779 + .iu_version = ((0x17ULL << 48) | (0x13ULL << 32) | (0x14ULL << 24)
  780 + | (MAXTL << 8) | (NWINDOWS - 1)),
  781 + .fpu_version = 0x00000000,
  782 + .mmu_version = 0,
  783 + },
  784 + {
  785 + .name = "Sun UltraSparc III",
  786 + .iu_version = ((0x3eULL << 48) | (0x14ULL << 32) | (0x34ULL << 24)
  787 + | (MAXTL << 8) | (NWINDOWS - 1)),
  788 + .fpu_version = 0x00000000,
  789 + .mmu_version = 0,
  790 + },
  791 + {
  792 + .name = "Sun UltraSparc III Cu",
  793 + .iu_version = ((0x3eULL << 48) | (0x15ULL << 32) | (0x41ULL << 24)
  794 + | (MAXTL << 8) | (NWINDOWS - 1)),
  795 + .fpu_version = 0x00000000,
  796 + .mmu_version = 0,
  797 + },
  798 + {
  799 + .name = "Sun UltraSparc IIIi",
  800 + .iu_version = ((0x3eULL << 48) | (0x16ULL << 32) | (0x34ULL << 24)
  801 + | (MAXTL << 8) | (NWINDOWS - 1)),
  802 + .fpu_version = 0x00000000,
  803 + .mmu_version = 0,
  804 + },
  805 + {
  806 + .name = "Sun UltraSparc IV",
  807 + .iu_version = ((0x3eULL << 48) | (0x18ULL << 32) | (0x31ULL << 24)
  808 + | (MAXTL << 8) | (NWINDOWS - 1)),
  809 + .fpu_version = 0x00000000,
  810 + .mmu_version = 0,
  811 + },
  812 + {
  813 + .name = "Sun UltraSparc IV+",
  814 + .iu_version = ((0x3eULL << 48) | (0x19ULL << 32) | (0x22ULL << 24)
  815 + | (MAXTL << 8) | (NWINDOWS - 1)),
  816 + .fpu_version = 0x00000000,
  817 + .mmu_version = 0,
  818 + },
  819 + {
  820 + .name = "Sun UltraSparc IIIi+",
  821 + .iu_version = ((0x3eULL << 48) | (0x22ULL << 32) | (0ULL << 24)
  822 + | (MAXTL << 8) | (NWINDOWS - 1)),
  823 + .fpu_version = 0x00000000,
  824 + .mmu_version = 0,
  825 + },
  826 + {
  827 + .name = "NEC UltraSparc I",
  828 + .iu_version = ((0x22ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)
  829 + | (MAXTL << 8) | (NWINDOWS - 1)),
  830 + .fpu_version = 0x00000000,
  831 + .mmu_version = 0,
  832 + },
  833 +#else
  834 + {
  835 + .name = "Fujitsu MB86900",
  836 + .iu_version = 0x00 << 24, /* Impl 0, ver 0 */
  837 + .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
  838 + .mmu_version = 0x00 << 24, /* Impl 0, ver 0 */
  839 + .mmu_bm = 0x00004000,
  840 + .mmu_ctpr_mask = 0x007ffff0,
  841 + .mmu_cxr_mask = 0x0000003f,
  842 + .mmu_sfsr_mask = 0xffffffff,
  843 + .mmu_trcr_mask = 0xffffffff,
  844 + },
  845 + {
  846 + .name = "Fujitsu MB86904",
  847 + .iu_version = 0x04 << 24, /* Impl 0, ver 4 */
  848 + .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
  849 + .mmu_version = 0x04 << 24, /* Impl 0, ver 4 */
  850 + .mmu_bm = 0x00004000,
  851 + .mmu_ctpr_mask = 0x00ffffc0,
  852 + .mmu_cxr_mask = 0x000000ff,
  853 + .mmu_sfsr_mask = 0x00016fff,
  854 + .mmu_trcr_mask = 0x00ffffff,
  855 + },
  856 + {
  857 + .name = "Fujitsu MB86907",
  858 + .iu_version = 0x05 << 24, /* Impl 0, ver 5 */
  859 + .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
  860 + .mmu_version = 0x05 << 24, /* Impl 0, ver 5 */
  861 + .mmu_bm = 0x00004000,
  862 + .mmu_ctpr_mask = 0xffffffc0,
  863 + .mmu_cxr_mask = 0x000000ff,
  864 + .mmu_sfsr_mask = 0x00016fff,
  865 + .mmu_trcr_mask = 0xffffffff,
  866 + },
  867 + {
  868 + .name = "LSI L64811",
  869 + .iu_version = 0x10 << 24, /* Impl 1, ver 0 */
  870 + .fpu_version = 1 << 17, /* FPU version 1 (LSI L64814) */
  871 + .mmu_version = 0x10 << 24,
  872 + .mmu_bm = 0x00004000,
  873 + .mmu_ctpr_mask = 0x007ffff0,
  874 + .mmu_cxr_mask = 0x0000003f,
  875 + .mmu_sfsr_mask = 0xffffffff,
  876 + .mmu_trcr_mask = 0xffffffff,
  877 + },
  878 + {
  879 + .name = "Cypress CY7C601",
  880 + .iu_version = 0x11 << 24, /* Impl 1, ver 1 */
  881 + .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */
  882 + .mmu_version = 0x10 << 24,
  883 + .mmu_bm = 0x00004000,
  884 + .mmu_ctpr_mask = 0x007ffff0,
  885 + .mmu_cxr_mask = 0x0000003f,
  886 + .mmu_sfsr_mask = 0xffffffff,
  887 + .mmu_trcr_mask = 0xffffffff,
  888 + },
  889 + {
  890 + .name = "Cypress CY7C611",
  891 + .iu_version = 0x13 << 24, /* Impl 1, ver 3 */
  892 + .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */
  893 + .mmu_version = 0x10 << 24,
  894 + .mmu_bm = 0x00004000,
  895 + .mmu_ctpr_mask = 0x007ffff0,
  896 + .mmu_cxr_mask = 0x0000003f,
  897 + .mmu_sfsr_mask = 0xffffffff,
  898 + .mmu_trcr_mask = 0xffffffff,
  899 + },
  900 + {
  901 + .name = "TI SuperSparc II",
  902 + .iu_version = 0x40000000,
  903 + .fpu_version = 0 << 17,
  904 + .mmu_version = 0x04000000,
  905 + .mmu_bm = 0x00002000,
  906 + .mmu_ctpr_mask = 0xffffffc0,
  907 + .mmu_cxr_mask = 0x0000ffff,
  908 + .mmu_sfsr_mask = 0xffffffff,
  909 + .mmu_trcr_mask = 0xffffffff,
  910 + },
  911 + {
  912 + .name = "TI MicroSparc I",
  913 + .iu_version = 0x41000000,
  914 + .fpu_version = 4 << 17,
  915 + .mmu_version = 0x41000000,
  916 + .mmu_bm = 0x00004000,
  917 + .mmu_ctpr_mask = 0x007ffff0,
  918 + .mmu_cxr_mask = 0x0000003f,
  919 + .mmu_sfsr_mask = 0x00016fff,
  920 + .mmu_trcr_mask = 0x0000003f,
  921 + },
  922 + {
  923 + .name = "TI MicroSparc II",
  924 + .iu_version = 0x42000000,
  925 + .fpu_version = 4 << 17,
  926 + .mmu_version = 0x02000000,
  927 + .mmu_bm = 0x00004000,
  928 + .mmu_ctpr_mask = 0x00ffffc0,
  929 + .mmu_cxr_mask = 0x000000ff,
  930 + .mmu_sfsr_mask = 0x00016fff,
  931 + .mmu_trcr_mask = 0x00ffffff,
  932 + },
  933 + {
  934 + .name = "TI MicroSparc IIep",
  935 + .iu_version = 0x42000000,
  936 + .fpu_version = 4 << 17,
  937 + .mmu_version = 0x04000000,
  938 + .mmu_bm = 0x00004000,
  939 + .mmu_ctpr_mask = 0x00ffffc0,
  940 + .mmu_cxr_mask = 0x000000ff,
  941 + .mmu_sfsr_mask = 0x00016bff,
  942 + .mmu_trcr_mask = 0x00ffffff,
  943 + },
  944 + {
  945 + .name = "TI SuperSparc 51",
  946 + .iu_version = 0x43000000,
  947 + .fpu_version = 0 << 17,
  948 + .mmu_version = 0x04000000,
  949 + .mmu_bm = 0x00002000,
  950 + .mmu_ctpr_mask = 0xffffffc0,
  951 + .mmu_cxr_mask = 0x0000ffff,
  952 + .mmu_sfsr_mask = 0xffffffff,
  953 + .mmu_trcr_mask = 0xffffffff,
  954 + },
  955 + {
  956 + .name = "TI SuperSparc 61",
  957 + .iu_version = 0x44000000,
  958 + .fpu_version = 0 << 17,
  959 + .mmu_version = 0x04000000,
  960 + .mmu_bm = 0x00002000,
  961 + .mmu_ctpr_mask = 0xffffffc0,
  962 + .mmu_cxr_mask = 0x0000ffff,
  963 + .mmu_sfsr_mask = 0xffffffff,
  964 + .mmu_trcr_mask = 0xffffffff,
  965 + },
  966 + {
  967 + .name = "Ross RT625",
  968 + .iu_version = 0x1e000000,
  969 + .fpu_version = 1 << 17,
  970 + .mmu_version = 0x1e000000,
  971 + .mmu_bm = 0x00004000,
  972 + .mmu_ctpr_mask = 0x007ffff0,
  973 + .mmu_cxr_mask = 0x0000003f,
  974 + .mmu_sfsr_mask = 0xffffffff,
  975 + .mmu_trcr_mask = 0xffffffff,
  976 + },
  977 + {
  978 + .name = "Ross RT620",
  979 + .iu_version = 0x1f000000,
  980 + .fpu_version = 1 << 17,
  981 + .mmu_version = 0x1f000000,
  982 + .mmu_bm = 0x00004000,
  983 + .mmu_ctpr_mask = 0x007ffff0,
  984 + .mmu_cxr_mask = 0x0000003f,
  985 + .mmu_sfsr_mask = 0xffffffff,
  986 + .mmu_trcr_mask = 0xffffffff,
  987 + },
  988 + {
  989 + .name = "BIT B5010",
  990 + .iu_version = 0x20000000,
  991 + .fpu_version = 0 << 17, /* B5010/B5110/B5120/B5210 */
  992 + .mmu_version = 0x20000000,
  993 + .mmu_bm = 0x00004000,
  994 + .mmu_ctpr_mask = 0x007ffff0,
  995 + .mmu_cxr_mask = 0x0000003f,
  996 + .mmu_sfsr_mask = 0xffffffff,
  997 + .mmu_trcr_mask = 0xffffffff,
  998 + },
  999 + {
  1000 + .name = "Matsushita MN10501",
  1001 + .iu_version = 0x50000000,
  1002 + .fpu_version = 0 << 17,
  1003 + .mmu_version = 0x50000000,
  1004 + .mmu_bm = 0x00004000,
  1005 + .mmu_ctpr_mask = 0x007ffff0,
  1006 + .mmu_cxr_mask = 0x0000003f,
  1007 + .mmu_sfsr_mask = 0xffffffff,
  1008 + .mmu_trcr_mask = 0xffffffff,
  1009 + },
  1010 + {
  1011 + .name = "Weitek W8601",
  1012 + .iu_version = 0x90 << 24, /* Impl 9, ver 0 */
  1013 + .fpu_version = 3 << 17, /* FPU version 3 (Weitek WTL3170/2) */
  1014 + .mmu_version = 0x10 << 24,
  1015 + .mmu_bm = 0x00004000,
  1016 + .mmu_ctpr_mask = 0x007ffff0,
  1017 + .mmu_cxr_mask = 0x0000003f,
  1018 + .mmu_sfsr_mask = 0xffffffff,
  1019 + .mmu_trcr_mask = 0xffffffff,
  1020 + },
  1021 + {
  1022 + .name = "LEON2",
  1023 + .iu_version = 0xf2000000,
  1024 + .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
  1025 + .mmu_version = 0xf2000000,
  1026 + .mmu_bm = 0x00004000,
  1027 + .mmu_ctpr_mask = 0x007ffff0,
  1028 + .mmu_cxr_mask = 0x0000003f,
  1029 + .mmu_sfsr_mask = 0xffffffff,
  1030 + .mmu_trcr_mask = 0xffffffff,
  1031 + },
  1032 + {
  1033 + .name = "LEON3",
  1034 + .iu_version = 0xf3000000,
  1035 + .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
  1036 + .mmu_version = 0xf3000000,
  1037 + .mmu_bm = 0x00004000,
  1038 + .mmu_ctpr_mask = 0x007ffff0,
  1039 + .mmu_cxr_mask = 0x0000003f,
  1040 + .mmu_sfsr_mask = 0xffffffff,
  1041 + .mmu_trcr_mask = 0xffffffff,
  1042 + },
  1043 +#endif
  1044 +};
  1045 +
  1046 +static const sparc_def_t *cpu_sparc_find_by_name(const unsigned char *name)
  1047 +{
  1048 + unsigned int i;
  1049 +
  1050 + for (i = 0; i < sizeof(sparc_defs) / sizeof(sparc_def_t); i++) {
  1051 + if (strcasecmp(name, sparc_defs[i].name) == 0) {
  1052 + return &sparc_defs[i];
  1053 + }
  1054 + }
  1055 + return NULL;
  1056 +}
  1057 +
  1058 +void sparc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
  1059 +{
  1060 + unsigned int i;
  1061 +
  1062 + for (i = 0; i < sizeof(sparc_defs) / sizeof(sparc_def_t); i++) {
  1063 + (*cpu_fprintf)(f, "Sparc %16s IU " TARGET_FMT_lx " FPU %08x MMU %08x\n",
  1064 + sparc_defs[i].name,
  1065 + sparc_defs[i].iu_version,
  1066 + sparc_defs[i].fpu_version,
  1067 + sparc_defs[i].mmu_version);
  1068 + }
  1069 +}
  1070 +
  1071 +#define GET_FLAG(a,b) ((env->psr & a)?b:'-')
  1072 +
  1073 +void cpu_dump_state(CPUState *env, FILE *f,
  1074 + int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
  1075 + int flags)
  1076 +{
  1077 + int i, x;
  1078 +
  1079 + cpu_fprintf(f, "pc: " TARGET_FMT_lx " npc: " TARGET_FMT_lx "\n", env->pc, env->npc);
  1080 + cpu_fprintf(f, "General Registers:\n");
  1081 + for (i = 0; i < 4; i++)
  1082 + cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
  1083 + cpu_fprintf(f, "\n");
  1084 + for (; i < 8; i++)
  1085 + cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
  1086 + cpu_fprintf(f, "\nCurrent Register Window:\n");
  1087 + for (x = 0; x < 3; x++) {
  1088 + for (i = 0; i < 4; i++)
  1089 + cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
  1090 + (x == 0 ? 'o' : (x == 1 ? 'l' : 'i')), i,
  1091 + env->regwptr[i + x * 8]);
  1092 + cpu_fprintf(f, "\n");
  1093 + for (; i < 8; i++)
  1094 + cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
  1095 + (x == 0 ? 'o' : x == 1 ? 'l' : 'i'), i,
  1096 + env->regwptr[i + x * 8]);
  1097 + cpu_fprintf(f, "\n");
  1098 + }
  1099 + cpu_fprintf(f, "\nFloating Point Registers:\n");
  1100 + for (i = 0; i < 32; i++) {
  1101 + if ((i & 3) == 0)
  1102 + cpu_fprintf(f, "%%f%02d:", i);
  1103 + cpu_fprintf(f, " %016lf", env->fpr[i]);
  1104 + if ((i & 3) == 3)
  1105 + cpu_fprintf(f, "\n");
  1106 + }
  1107 +#ifdef TARGET_SPARC64
  1108 + cpu_fprintf(f, "pstate: 0x%08x ccr: 0x%02x asi: 0x%02x tl: %d fprs: %d\n",
  1109 + env->pstate, GET_CCR(env), env->asi, env->tl, env->fprs);
  1110 + cpu_fprintf(f, "cansave: %d canrestore: %d otherwin: %d wstate %d cleanwin %d cwp %d\n",
  1111 + env->cansave, env->canrestore, env->otherwin, env->wstate,
  1112 + env->cleanwin, NWINDOWS - 1 - env->cwp);
  1113 +#else
  1114 + cpu_fprintf(f, "psr: 0x%08x -> %c%c%c%c %c%c%c wim: 0x%08x\n", GET_PSR(env),
  1115 + GET_FLAG(PSR_ZERO, 'Z'), GET_FLAG(PSR_OVF, 'V'),
  1116 + GET_FLAG(PSR_NEG, 'N'), GET_FLAG(PSR_CARRY, 'C'),
  1117 + env->psrs?'S':'-', env->psrps?'P':'-',
  1118 + env->psret?'E':'-', env->wim);
  1119 +#endif
  1120 + cpu_fprintf(f, "fsr: 0x%08x\n", GET_FSR32(env));
  1121 +}
  1122 +
608 1123 #ifdef TARGET_SPARC64
609 1124 #if !defined(CONFIG_USER_ONLY)
610 1125 #include "qemu-common.h"
... ...
target-sparc/translate.c
... ... @@ -65,22 +65,6 @@ typedef struct DisasContext {
65 65 struct TranslationBlock *tb;
66 66 } DisasContext;
67 67  
68   -typedef struct sparc_def_t sparc_def_t;
69   -
70   -struct sparc_def_t {
71   - const unsigned char *name;
72   - target_ulong iu_version;
73   - uint32_t fpu_version;
74   - uint32_t mmu_version;
75   - uint32_t mmu_bm;
76   - uint32_t mmu_ctpr_mask;
77   - uint32_t mmu_cxr_mask;
78   - uint32_t mmu_sfsr_mask;
79   - uint32_t mmu_trcr_mask;
80   -};
81   -
82   -static const sparc_def_t *cpu_sparc_find_by_name(const unsigned char *name);
83   -
84 68 extern FILE *logfile;
85 69 extern int loglevel;
86 70  
... ... @@ -4661,44 +4645,10 @@ int gen_intermediate_code_pc(CPUSPARCState * env, TranslationBlock * tb)
4661 4645 return gen_intermediate_code_internal(tb, 1, env);
4662 4646 }
4663 4647  
4664   -void cpu_reset(CPUSPARCState *env)
4665   -{
4666   - tlb_flush(env, 1);
4667   - env->cwp = 0;
4668   - env->wim = 1;
4669   - env->regwptr = env->regbase + (env->cwp * 16);
4670   -#if defined(CONFIG_USER_ONLY)
4671   - env->user_mode_only = 1;
4672   -#ifdef TARGET_SPARC64
4673   - env->cleanwin = NWINDOWS - 2;
4674   - env->cansave = NWINDOWS - 2;
4675   - env->pstate = PS_RMO | PS_PEF | PS_IE;
4676   - env->asi = 0x82; // Primary no-fault
4677   -#endif
4678   -#else
4679   - env->psret = 0;
4680   - env->psrs = 1;
4681   - env->psrps = 1;
4682   -#ifdef TARGET_SPARC64
4683   - env->pstate = PS_PRIV;
4684   - env->hpstate = HS_PRIV;
4685   - env->pc = 0x1fff0000000ULL;
4686   - env->tsptr = &env->ts[env->tl];
4687   -#else
4688   - env->pc = 0;
4689   - env->mmuregs[0] &= ~(MMU_E | MMU_NF);
4690   - env->mmuregs[0] |= env->mmu_bm;
4691   -#endif
4692   - env->npc = env->pc + 4;
4693   -#endif
4694   -}
4695   -
4696   -CPUSPARCState *cpu_sparc_init(const char *cpu_model)
  4648 +void gen_intermediate_code_init(CPUSPARCState *env)
4697 4649 {
4698   - CPUSPARCState *env;
4699   - const sparc_def_t *def;
4700   - static int inited;
4701 4650 unsigned int i;
  4651 + static int inited;
4702 4652 static const char * const gregnames[8] = {
4703 4653 NULL, // g0 not used
4704 4654 "g1",
... ... @@ -4710,27 +4660,6 @@ CPUSPARCState *cpu_sparc_init(const char *cpu_model)
4710 4660 "g7",
4711 4661 };
4712 4662  
4713   - def = cpu_sparc_find_by_name(cpu_model);
4714   - if (!def)
4715   - return NULL;
4716   -
4717   - env = qemu_mallocz(sizeof(CPUSPARCState));
4718   - if (!env)
4719   - return NULL;
4720   - cpu_exec_init(env);
4721   - env->cpu_model_str = cpu_model;
4722   - env->version = def->iu_version;
4723   - env->fsr = def->fpu_version;
4724   -#if !defined(TARGET_SPARC64)
4725   - env->mmu_bm = def->mmu_bm;
4726   - env->mmu_ctpr_mask = def->mmu_ctpr_mask;
4727   - env->mmu_cxr_mask = def->mmu_cxr_mask;
4728   - env->mmu_sfsr_mask = def->mmu_sfsr_mask;
4729   - env->mmu_trcr_mask = def->mmu_trcr_mask;
4730   - env->mmuregs[0] |= def->mmu_version;
4731   - cpu_sparc_set_id(env, 0);
4732   -#endif
4733   -
4734 4663 /* init various static tables */
4735 4664 if (!inited) {
4736 4665 inited = 1;
... ... @@ -4782,445 +4711,4 @@ CPUSPARCState *cpu_sparc_init(const char *cpu_model)
4782 4711 offsetof(CPUState, gregs[i]),
4783 4712 gregnames[i]);
4784 4713 }
4785   -
4786   - cpu_reset(env);
4787   -
4788   - return env;
4789   -}
4790   -
4791   -void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu)
4792   -{
4793   -#if !defined(TARGET_SPARC64)
4794   - env->mxccregs[7] = ((cpu + 8) & 0xf) << 24;
4795   -#endif
4796   -}
4797   -
4798   -static const sparc_def_t sparc_defs[] = {
4799   -#ifdef TARGET_SPARC64
4800   - {
4801   - .name = "Fujitsu Sparc64",
4802   - .iu_version = ((0x04ULL << 48) | (0x02ULL << 32) | (0ULL << 24)
4803   - | (MAXTL << 8) | (NWINDOWS - 1)),
4804   - .fpu_version = 0x00000000,
4805   - .mmu_version = 0,
4806   - },
4807   - {
4808   - .name = "Fujitsu Sparc64 III",
4809   - .iu_version = ((0x04ULL << 48) | (0x03ULL << 32) | (0ULL << 24)
4810   - | (MAXTL << 8) | (NWINDOWS - 1)),
4811   - .fpu_version = 0x00000000,
4812   - .mmu_version = 0,
4813   - },
4814   - {
4815   - .name = "Fujitsu Sparc64 IV",
4816   - .iu_version = ((0x04ULL << 48) | (0x04ULL << 32) | (0ULL << 24)
4817   - | (MAXTL << 8) | (NWINDOWS - 1)),
4818   - .fpu_version = 0x00000000,
4819   - .mmu_version = 0,
4820   - },
4821   - {
4822   - .name = "Fujitsu Sparc64 V",
4823   - .iu_version = ((0x04ULL << 48) | (0x05ULL << 32) | (0x51ULL << 24)
4824   - | (MAXTL << 8) | (NWINDOWS - 1)),
4825   - .fpu_version = 0x00000000,
4826   - .mmu_version = 0,
4827   - },
4828   - {
4829   - .name = "TI UltraSparc I",
4830   - .iu_version = ((0x17ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)
4831   - | (MAXTL << 8) | (NWINDOWS - 1)),
4832   - .fpu_version = 0x00000000,
4833   - .mmu_version = 0,
4834   - },
4835   - {
4836   - .name = "TI UltraSparc II",
4837   - .iu_version = ((0x17ULL << 48) | (0x11ULL << 32) | (0x20ULL << 24)
4838   - | (MAXTL << 8) | (NWINDOWS - 1)),
4839   - .fpu_version = 0x00000000,
4840   - .mmu_version = 0,
4841   - },
4842   - {
4843   - .name = "TI UltraSparc IIi",
4844   - .iu_version = ((0x17ULL << 48) | (0x12ULL << 32) | (0x91ULL << 24)
4845   - | (MAXTL << 8) | (NWINDOWS - 1)),
4846   - .fpu_version = 0x00000000,
4847   - .mmu_version = 0,
4848   - },
4849   - {
4850   - .name = "TI UltraSparc IIe",
4851   - .iu_version = ((0x17ULL << 48) | (0x13ULL << 32) | (0x14ULL << 24)
4852   - | (MAXTL << 8) | (NWINDOWS - 1)),
4853   - .fpu_version = 0x00000000,
4854   - .mmu_version = 0,
4855   - },
4856   - {
4857   - .name = "Sun UltraSparc III",
4858   - .iu_version = ((0x3eULL << 48) | (0x14ULL << 32) | (0x34ULL << 24)
4859   - | (MAXTL << 8) | (NWINDOWS - 1)),
4860   - .fpu_version = 0x00000000,
4861   - .mmu_version = 0,
4862   - },
4863   - {
4864   - .name = "Sun UltraSparc III Cu",
4865   - .iu_version = ((0x3eULL << 48) | (0x15ULL << 32) | (0x41ULL << 24)
4866   - | (MAXTL << 8) | (NWINDOWS - 1)),
4867   - .fpu_version = 0x00000000,
4868   - .mmu_version = 0,
4869   - },
4870   - {
4871   - .name = "Sun UltraSparc IIIi",
4872   - .iu_version = ((0x3eULL << 48) | (0x16ULL << 32) | (0x34ULL << 24)
4873   - | (MAXTL << 8) | (NWINDOWS - 1)),
4874   - .fpu_version = 0x00000000,
4875   - .mmu_version = 0,
4876   - },
4877   - {
4878   - .name = "Sun UltraSparc IV",
4879   - .iu_version = ((0x3eULL << 48) | (0x18ULL << 32) | (0x31ULL << 24)
4880   - | (MAXTL << 8) | (NWINDOWS - 1)),
4881   - .fpu_version = 0x00000000,
4882   - .mmu_version = 0,
4883   - },
4884   - {
4885   - .name = "Sun UltraSparc IV+",
4886   - .iu_version = ((0x3eULL << 48) | (0x19ULL << 32) | (0x22ULL << 24)
4887   - | (MAXTL << 8) | (NWINDOWS - 1)),
4888   - .fpu_version = 0x00000000,
4889   - .mmu_version = 0,
4890   - },
4891   - {
4892   - .name = "Sun UltraSparc IIIi+",
4893   - .iu_version = ((0x3eULL << 48) | (0x22ULL << 32) | (0ULL << 24)
4894   - | (MAXTL << 8) | (NWINDOWS - 1)),
4895   - .fpu_version = 0x00000000,
4896   - .mmu_version = 0,
4897   - },
4898   - {
4899   - .name = "NEC UltraSparc I",
4900   - .iu_version = ((0x22ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)
4901   - | (MAXTL << 8) | (NWINDOWS - 1)),
4902   - .fpu_version = 0x00000000,
4903   - .mmu_version = 0,
4904   - },
4905   -#else
4906   - {
4907   - .name = "Fujitsu MB86900",
4908   - .iu_version = 0x00 << 24, /* Impl 0, ver 0 */
4909   - .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
4910   - .mmu_version = 0x00 << 24, /* Impl 0, ver 0 */
4911   - .mmu_bm = 0x00004000,
4912   - .mmu_ctpr_mask = 0x007ffff0,
4913   - .mmu_cxr_mask = 0x0000003f,
4914   - .mmu_sfsr_mask = 0xffffffff,
4915   - .mmu_trcr_mask = 0xffffffff,
4916   - },
4917   - {
4918   - .name = "Fujitsu MB86904",
4919   - .iu_version = 0x04 << 24, /* Impl 0, ver 4 */
4920   - .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
4921   - .mmu_version = 0x04 << 24, /* Impl 0, ver 4 */
4922   - .mmu_bm = 0x00004000,
4923   - .mmu_ctpr_mask = 0x00ffffc0,
4924   - .mmu_cxr_mask = 0x000000ff,
4925   - .mmu_sfsr_mask = 0x00016fff,
4926   - .mmu_trcr_mask = 0x00ffffff,
4927   - },
4928   - {
4929   - .name = "Fujitsu MB86907",
4930   - .iu_version = 0x05 << 24, /* Impl 0, ver 5 */
4931   - .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
4932   - .mmu_version = 0x05 << 24, /* Impl 0, ver 5 */
4933   - .mmu_bm = 0x00004000,
4934   - .mmu_ctpr_mask = 0xffffffc0,
4935   - .mmu_cxr_mask = 0x000000ff,
4936   - .mmu_sfsr_mask = 0x00016fff,
4937   - .mmu_trcr_mask = 0xffffffff,
4938   - },
4939   - {
4940   - .name = "LSI L64811",
4941   - .iu_version = 0x10 << 24, /* Impl 1, ver 0 */
4942   - .fpu_version = 1 << 17, /* FPU version 1 (LSI L64814) */
4943   - .mmu_version = 0x10 << 24,
4944   - .mmu_bm = 0x00004000,
4945   - .mmu_ctpr_mask = 0x007ffff0,
4946   - .mmu_cxr_mask = 0x0000003f,
4947   - .mmu_sfsr_mask = 0xffffffff,
4948   - .mmu_trcr_mask = 0xffffffff,
4949   - },
4950   - {
4951   - .name = "Cypress CY7C601",
4952   - .iu_version = 0x11 << 24, /* Impl 1, ver 1 */
4953   - .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */
4954   - .mmu_version = 0x10 << 24,
4955   - .mmu_bm = 0x00004000,
4956   - .mmu_ctpr_mask = 0x007ffff0,
4957   - .mmu_cxr_mask = 0x0000003f,
4958   - .mmu_sfsr_mask = 0xffffffff,
4959   - .mmu_trcr_mask = 0xffffffff,
4960   - },
4961   - {
4962   - .name = "Cypress CY7C611",
4963   - .iu_version = 0x13 << 24, /* Impl 1, ver 3 */
4964   - .fpu_version = 3 << 17, /* FPU version 3 (Cypress CY7C602) */
4965   - .mmu_version = 0x10 << 24,
4966   - .mmu_bm = 0x00004000,
4967   - .mmu_ctpr_mask = 0x007ffff0,
4968   - .mmu_cxr_mask = 0x0000003f,
4969   - .mmu_sfsr_mask = 0xffffffff,
4970   - .mmu_trcr_mask = 0xffffffff,
4971   - },
4972   - {
4973   - .name = "TI SuperSparc II",
4974   - .iu_version = 0x40000000,
4975   - .fpu_version = 0 << 17,
4976   - .mmu_version = 0x04000000,
4977   - .mmu_bm = 0x00002000,
4978   - .mmu_ctpr_mask = 0xffffffc0,
4979   - .mmu_cxr_mask = 0x0000ffff,
4980   - .mmu_sfsr_mask = 0xffffffff,
4981   - .mmu_trcr_mask = 0xffffffff,
4982   - },
4983   - {
4984   - .name = "TI MicroSparc I",
4985   - .iu_version = 0x41000000,
4986   - .fpu_version = 4 << 17,
4987   - .mmu_version = 0x41000000,
4988   - .mmu_bm = 0x00004000,
4989   - .mmu_ctpr_mask = 0x007ffff0,
4990   - .mmu_cxr_mask = 0x0000003f,
4991   - .mmu_sfsr_mask = 0x00016fff,
4992   - .mmu_trcr_mask = 0x0000003f,
4993   - },
4994   - {
4995   - .name = "TI MicroSparc II",
4996   - .iu_version = 0x42000000,
4997   - .fpu_version = 4 << 17,
4998   - .mmu_version = 0x02000000,
4999   - .mmu_bm = 0x00004000,
5000   - .mmu_ctpr_mask = 0x00ffffc0,
5001   - .mmu_cxr_mask = 0x000000ff,
5002   - .mmu_sfsr_mask = 0x00016fff,
5003   - .mmu_trcr_mask = 0x00ffffff,
5004   - },
5005   - {
5006   - .name = "TI MicroSparc IIep",
5007   - .iu_version = 0x42000000,
5008   - .fpu_version = 4 << 17,
5009   - .mmu_version = 0x04000000,
5010   - .mmu_bm = 0x00004000,
5011   - .mmu_ctpr_mask = 0x00ffffc0,
5012   - .mmu_cxr_mask = 0x000000ff,
5013   - .mmu_sfsr_mask = 0x00016bff,
5014   - .mmu_trcr_mask = 0x00ffffff,
5015   - },
5016   - {
5017   - .name = "TI SuperSparc 51",
5018   - .iu_version = 0x43000000,
5019   - .fpu_version = 0 << 17,
5020   - .mmu_version = 0x04000000,
5021   - .mmu_bm = 0x00002000,
5022   - .mmu_ctpr_mask = 0xffffffc0,
5023   - .mmu_cxr_mask = 0x0000ffff,
5024   - .mmu_sfsr_mask = 0xffffffff,
5025   - .mmu_trcr_mask = 0xffffffff,
5026   - },
5027   - {
5028   - .name = "TI SuperSparc 61",
5029   - .iu_version = 0x44000000,
5030   - .fpu_version = 0 << 17,
5031   - .mmu_version = 0x04000000,
5032   - .mmu_bm = 0x00002000,
5033   - .mmu_ctpr_mask = 0xffffffc0,
5034   - .mmu_cxr_mask = 0x0000ffff,
5035   - .mmu_sfsr_mask = 0xffffffff,
5036   - .mmu_trcr_mask = 0xffffffff,
5037   - },
5038   - {
5039   - .name = "Ross RT625",
5040   - .iu_version = 0x1e000000,
5041   - .fpu_version = 1 << 17,
5042   - .mmu_version = 0x1e000000,
5043   - .mmu_bm = 0x00004000,
5044   - .mmu_ctpr_mask = 0x007ffff0,
5045   - .mmu_cxr_mask = 0x0000003f,
5046   - .mmu_sfsr_mask = 0xffffffff,
5047   - .mmu_trcr_mask = 0xffffffff,
5048   - },
5049   - {
5050   - .name = "Ross RT620",
5051   - .iu_version = 0x1f000000,
5052   - .fpu_version = 1 << 17,
5053   - .mmu_version = 0x1f000000,
5054   - .mmu_bm = 0x00004000,
5055   - .mmu_ctpr_mask = 0x007ffff0,
5056   - .mmu_cxr_mask = 0x0000003f,
5057   - .mmu_sfsr_mask = 0xffffffff,
5058   - .mmu_trcr_mask = 0xffffffff,
5059   - },
5060   - {
5061   - .name = "BIT B5010",
5062   - .iu_version = 0x20000000,
5063   - .fpu_version = 0 << 17, /* B5010/B5110/B5120/B5210 */
5064   - .mmu_version = 0x20000000,
5065   - .mmu_bm = 0x00004000,
5066   - .mmu_ctpr_mask = 0x007ffff0,
5067   - .mmu_cxr_mask = 0x0000003f,
5068   - .mmu_sfsr_mask = 0xffffffff,
5069   - .mmu_trcr_mask = 0xffffffff,
5070   - },
5071   - {
5072   - .name = "Matsushita MN10501",
5073   - .iu_version = 0x50000000,
5074   - .fpu_version = 0 << 17,
5075   - .mmu_version = 0x50000000,
5076   - .mmu_bm = 0x00004000,
5077   - .mmu_ctpr_mask = 0x007ffff0,
5078   - .mmu_cxr_mask = 0x0000003f,
5079   - .mmu_sfsr_mask = 0xffffffff,
5080   - .mmu_trcr_mask = 0xffffffff,
5081   - },
5082   - {
5083   - .name = "Weitek W8601",
5084   - .iu_version = 0x90 << 24, /* Impl 9, ver 0 */
5085   - .fpu_version = 3 << 17, /* FPU version 3 (Weitek WTL3170/2) */
5086   - .mmu_version = 0x10 << 24,
5087   - .mmu_bm = 0x00004000,
5088   - .mmu_ctpr_mask = 0x007ffff0,
5089   - .mmu_cxr_mask = 0x0000003f,
5090   - .mmu_sfsr_mask = 0xffffffff,
5091   - .mmu_trcr_mask = 0xffffffff,
5092   - },
5093   - {
5094   - .name = "LEON2",
5095   - .iu_version = 0xf2000000,
5096   - .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
5097   - .mmu_version = 0xf2000000,
5098   - .mmu_bm = 0x00004000,
5099   - .mmu_ctpr_mask = 0x007ffff0,
5100   - .mmu_cxr_mask = 0x0000003f,
5101   - .mmu_sfsr_mask = 0xffffffff,
5102   - .mmu_trcr_mask = 0xffffffff,
5103   - },
5104   - {
5105   - .name = "LEON3",
5106   - .iu_version = 0xf3000000,
5107   - .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
5108   - .mmu_version = 0xf3000000,
5109   - .mmu_bm = 0x00004000,
5110   - .mmu_ctpr_mask = 0x007ffff0,
5111   - .mmu_cxr_mask = 0x0000003f,
5112   - .mmu_sfsr_mask = 0xffffffff,
5113   - .mmu_trcr_mask = 0xffffffff,
5114   - },
5115   -#endif
5116   -};
5117   -
5118   -static const sparc_def_t *cpu_sparc_find_by_name(const unsigned char *name)
5119   -{
5120   - unsigned int i;
5121   -
5122   - for (i = 0; i < sizeof(sparc_defs) / sizeof(sparc_def_t); i++) {
5123   - if (strcasecmp(name, sparc_defs[i].name) == 0) {
5124   - return &sparc_defs[i];
5125   - }
5126   - }
5127   - return NULL;
5128   -}
5129   -
5130   -void sparc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
5131   -{
5132   - unsigned int i;
5133   -
5134   - for (i = 0; i < sizeof(sparc_defs) / sizeof(sparc_def_t); i++) {
5135   - (*cpu_fprintf)(f, "Sparc %16s IU " TARGET_FMT_lx " FPU %08x MMU %08x\n",
5136   - sparc_defs[i].name,
5137   - sparc_defs[i].iu_version,
5138   - sparc_defs[i].fpu_version,
5139   - sparc_defs[i].mmu_version);
5140   - }
5141   -}
5142   -
5143   -#define GET_FLAG(a,b) ((env->psr & a)?b:'-')
5144   -
5145   -void cpu_dump_state(CPUState *env, FILE *f,
5146   - int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
5147   - int flags)
5148   -{
5149   - int i, x;
5150   -
5151   - cpu_fprintf(f, "pc: " TARGET_FMT_lx " npc: " TARGET_FMT_lx "\n", env->pc, env->npc);
5152   - cpu_fprintf(f, "General Registers:\n");
5153   - for (i = 0; i < 4; i++)
5154   - cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
5155   - cpu_fprintf(f, "\n");
5156   - for (; i < 8; i++)
5157   - cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
5158   - cpu_fprintf(f, "\nCurrent Register Window:\n");
5159   - for (x = 0; x < 3; x++) {
5160   - for (i = 0; i < 4; i++)
5161   - cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
5162   - (x == 0 ? 'o' : (x == 1 ? 'l' : 'i')), i,
5163   - env->regwptr[i + x * 8]);
5164   - cpu_fprintf(f, "\n");
5165   - for (; i < 8; i++)
5166   - cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
5167   - (x == 0 ? 'o' : x == 1 ? 'l' : 'i'), i,
5168   - env->regwptr[i + x * 8]);
5169   - cpu_fprintf(f, "\n");
5170   - }
5171   - cpu_fprintf(f, "\nFloating Point Registers:\n");
5172   - for (i = 0; i < 32; i++) {
5173   - if ((i & 3) == 0)
5174   - cpu_fprintf(f, "%%f%02d:", i);
5175   - cpu_fprintf(f, " %016lf", env->fpr[i]);
5176   - if ((i & 3) == 3)
5177   - cpu_fprintf(f, "\n");
5178   - }
5179   -#ifdef TARGET_SPARC64
5180   - cpu_fprintf(f, "pstate: 0x%08x ccr: 0x%02x asi: 0x%02x tl: %d fprs: %d\n",
5181   - env->pstate, GET_CCR(env), env->asi, env->tl, env->fprs);
5182   - cpu_fprintf(f, "cansave: %d canrestore: %d otherwin: %d wstate %d cleanwin %d cwp %d\n",
5183   - env->cansave, env->canrestore, env->otherwin, env->wstate,
5184   - env->cleanwin, NWINDOWS - 1 - env->cwp);
5185   -#else
5186   - cpu_fprintf(f, "psr: 0x%08x -> %c%c%c%c %c%c%c wim: 0x%08x\n", GET_PSR(env),
5187   - GET_FLAG(PSR_ZERO, 'Z'), GET_FLAG(PSR_OVF, 'V'),
5188   - GET_FLAG(PSR_NEG, 'N'), GET_FLAG(PSR_CARRY, 'C'),
5189   - env->psrs?'S':'-', env->psrps?'P':'-',
5190   - env->psret?'E':'-', env->wim);
5191   -#endif
5192   - cpu_fprintf(f, "fsr: 0x%08x\n", GET_FSR32(env));
5193   -}
5194   -
5195   -#if defined(CONFIG_USER_ONLY)
5196   -target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
5197   -{
5198   - return addr;
5199   -}
5200   -
5201   -#else
5202   -extern int get_physical_address (CPUState *env, target_phys_addr_t *physical, int *prot,
5203   - int *access_index, target_ulong address, int rw,
5204   - int mmu_idx);
5205   -
5206   -target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
5207   -{
5208   - target_phys_addr_t phys_addr;
5209   - int prot, access_index;
5210   -
5211   - if (get_physical_address(env, &phys_addr, &prot, &access_index, addr, 2,
5212   - MMU_KERNEL_IDX) != 0)
5213   - if (get_physical_address(env, &phys_addr, &prot, &access_index, addr,
5214   - 0, MMU_KERNEL_IDX) != 0)
5215   - return -1;
5216   - if (cpu_get_physical_page_desc(phys_addr) == IO_MEM_UNASSIGNED)
5217   - return -1;
5218   - return phys_addr;
5219   -}
5220   -#endif
5221   -
5222   -void helper_flush(target_ulong addr)
5223   -{
5224   - addr &= ~7;
5225   - tb_invalidate_page_range(addr, addr + 8);
5226 4714 }
... ...