Commit c48fcb47518befb79b5cc75a2cad024c2d6e4bef
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
Showing
3 changed files
with
524 additions
and
520 deletions
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 | } | ... | ... |