From a40921ce322af90f0a738f3c508a8f4f2406635c Mon Sep 17 00:00:00 2001 From: xorstream Date: Mon, 23 Jan 2017 16:29:41 +1100 Subject: [PATCH] Sparc support added. (#734) * Fix for MIPS issue. * Sparc support added. --- .../sparc-softmmu/sparc-softmmu.vcxproj | 44 ++ .../sparc-softmmu.vcxproj.filters | 110 +++- .../sparc64-softmmu/sparc64-softmmu.vcxproj | 45 ++ .../sparc64-softmmu.vcxproj.filters | 113 +++- msvc/unicorn/unicorn/unicorn.vcxproj | 16 +- qemu/hw/sparc/leon3.c | 11 +- qemu/hw/sparc64/sun4u.c | 12 +- qemu/target-sparc/cc_helper.c | 48 +- qemu/target-sparc/cpu.c | 611 ++++++++++-------- qemu/target-sparc/int64_helper.c | 6 +- qemu/target-sparc/ldst_helper.c | 31 +- qemu/target-sparc/translate.c | 31 +- 12 files changed, 722 insertions(+), 356 deletions(-) diff --git a/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj b/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj index 02be713f..2e8dbc0b 100644 --- a/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj +++ b/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj @@ -18,6 +18,50 @@ x64 + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + + + + + + + + + + + + + + + + + + + {698C2D54-475C-446F-B879-F629BBEF75FE} Win32Proj diff --git a/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj.filters b/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj.filters index 9cd85105..de4c9bfc 100644 --- a/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj.filters +++ b/msvc/unicorn/sparc-softmmu/sparc-softmmu.vcxproj.filters @@ -1,2 +1,110 @@  - \ No newline at end of file + + + + {d424a094-0a26-4db6-85e9-e75f81c6e142} + + + {dec3e9f1-0fc3-454e-ae70-78d866b5c3f8} + + + {b229bf2b-cc40-4135-b3b7-40c73bd9f597} + + + {133a0d6a-6f71-4d4b-be6d-f90636aa02a2} + + + {0a04b798-735c-4115-ab62-b6cfc772efed} + + + {10f0c533-e16b-4e31-b979-812af068bb36} + + + + + fpu + + + tcg + + + tcg + + + tcg\i386 + + + + + + + + + + + hw\sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + + + fpu + + + fpu + + + tcg + + + tcg + + + tcg + + + tcg + + + tcg + + + tcg + + + tcg\i386 + + + + + + \ No newline at end of file diff --git a/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj b/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj index 8d68a3b2..8bc2c504 100644 --- a/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj +++ b/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj @@ -18,6 +18,51 @@ x64 + + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + + + + + + + + + + + + + + + + + + + {8804AD29-E398-480C-AC0F-98EC1B7A51CB} Win32Proj diff --git a/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj.filters b/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj.filters index 9cd85105..0e5b0c35 100644 --- a/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj.filters +++ b/msvc/unicorn/sparc64-softmmu/sparc64-softmmu.vcxproj.filters @@ -1,2 +1,113 @@  - \ No newline at end of file + + + + {1f15e2b2-fae3-41e5-b787-70c44beb828c} + + + {ee6a3abf-6f14-47ab-8b40-f859d030230a} + + + {4a271b0a-7736-4457-98f8-8c21ad4d2601} + + + {7c7b0370-fe65-4c21-94e6-f4561470087d} + + + {51a4ddc6-4078-4db0-9b29-c68c558b2f93} + + + {46e355ab-da0b-431b-929b-8d77b3ab90bc} + + + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + target-sparc + + + fpu + + + tcg + + + tcg + + + tcg\i386 + + + + + + + + + + + hw\sparc64 + + + + + fpu + + + fpu + + + tcg + + + tcg + + + tcg + + + tcg + + + tcg + + + tcg + + + tcg\i386 + + + + + + \ No newline at end of file diff --git a/msvc/unicorn/unicorn/unicorn.vcxproj b/msvc/unicorn/unicorn/unicorn.vcxproj index a501538b..cb955f45 100644 --- a/msvc/unicorn/unicorn/unicorn.vcxproj +++ b/msvc/unicorn/unicorn/unicorn.vcxproj @@ -237,7 +237,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__i386__;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_X86 + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__i386__;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86 MultiThreadedDebug .;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg /wd4018 /wd4244 /wd4267 %(AdditionalOptions) @@ -249,7 +249,7 @@ $(SolutionDir)$(Platform)\$(Configuration)\ - ws2_32.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;x86_64-softmmu.lib + ws2_32.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib ..\prebuild_script.bat @@ -261,7 +261,7 @@ Level3 Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__x86_64__;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_X86 + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__x86_64__;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86 MultiThreadedDebug .;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg /wd4018 /wd4244 /wd4267 %(AdditionalOptions) @@ -273,7 +273,7 @@ $(SolutionDir)$(Platform)\$(Configuration)\ - ws2_32.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;x86_64-softmmu.lib + ws2_32.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib ..\prebuild_script.bat @@ -287,7 +287,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__i386__;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_X86 + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__i386__;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86 MultiThreaded .;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg /wd4018 /wd4244 /wd4267 %(AdditionalOptions) @@ -301,7 +301,7 @@ $(SolutionDir)$(Platform)\$(Configuration)\ - ws2_32.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;x86_64-softmmu.lib + ws2_32.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib ..\prebuild_script.bat @@ -315,7 +315,7 @@ MaxSpeed true true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__x86_64__;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_X86 + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;inline=__inline;__func__=__FUNCTION__;__x86_64__;UNICORN_HAS_MIPS;UNICORN_HAS_MIPS64;UNICORN_HAS_MIPSEL;UNICORN_HAS_MIPS64EL;UNICORN_HAS_SPARC;UNICORN_HAS_X86 MultiThreaded .;..;../../../include;../../../qemu;../../../qemu/include;../../../qemu/tcg /wd4018 /wd4244 /wd4267 %(AdditionalOptions) @@ -329,7 +329,7 @@ $(SolutionDir)$(Platform)\$(Configuration)\ - ws2_32.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;x86_64-softmmu.lib + ws2_32.lib;mips-softmmu.lib;mips64-softmmu.lib;mipsel-softmmu.lib;mips64el-softmmu.lib;sparc-softmmu.lib;sparc64-softmmu.lib;x86_64-softmmu.lib ..\prebuild_script.bat diff --git a/qemu/hw/sparc/leon3.c b/qemu/hw/sparc/leon3.c index d0e359aa..150aaed1 100644 --- a/qemu/hw/sparc/leon3.c +++ b/qemu/hw/sparc/leon3.c @@ -58,10 +58,13 @@ static int leon3_generic_hw_init(struct uc_struct *uc, MachineState *machine) void leon3_machine_init(struct uc_struct *uc) { static QEMUMachine leon3_generic_machine = { - .name = "leon3_generic", - .init = leon3_generic_hw_init, - .is_default = 1, - .arch = UC_ARCH_SPARC, + NULL, + "leon3_generic", + leon3_generic_hw_init, + NULL, + 0, + 1, + UC_ARCH_SPARC, }; //printf(">>> leon3_machine_init\n"); diff --git a/qemu/hw/sparc64/sun4u.c b/qemu/hw/sparc64/sun4u.c index 7e85a4a4..1995d311 100644 --- a/qemu/hw/sparc64/sun4u.c +++ b/qemu/hw/sparc64/sun4u.c @@ -50,11 +50,13 @@ static int sun4u_init(struct uc_struct *uc, MachineState *machine) void sun4u_machine_init(struct uc_struct *uc) { static QEMUMachine sun4u_machine = { - .name = "sun4u", - .init = sun4u_init, - .max_cpus = 1, // XXX for now - .is_default = 1, - .arch = UC_ARCH_SPARC, + NULL, + "sun4u", + sun4u_init, + NULL, + 1, // XXX for now + 1, + UC_ARCH_SPARC, }; qemu_register_machine(uc, &sun4u_machine, TYPE_MACHINE, NULL); diff --git a/qemu/target-sparc/cc_helper.c b/qemu/target-sparc/cc_helper.c index 66ec0e61..69823b70 100644 --- a/qemu/target-sparc/cc_helper.c +++ b/qemu/target-sparc/cc_helper.c @@ -438,35 +438,35 @@ typedef struct CCTable { static const CCTable icc_table[CC_OP_NB] = { /* CC_OP_DYNAMIC should never happen */ - [CC_OP_DYNAMIC] = { compute_null, compute_null }, - [CC_OP_FLAGS] = { compute_all_flags, compute_C_flags }, - [CC_OP_DIV] = { compute_all_div, compute_C_div }, - [CC_OP_ADD] = { compute_all_add, compute_C_add }, - [CC_OP_ADDX] = { compute_all_addx, compute_C_addx }, - [CC_OP_TADD] = { compute_all_tadd, compute_C_add }, - [CC_OP_TADDTV] = { compute_all_taddtv, compute_C_add }, - [CC_OP_SUB] = { compute_all_sub, compute_C_sub }, - [CC_OP_SUBX] = { compute_all_subx, compute_C_subx }, - [CC_OP_TSUB] = { compute_all_tsub, compute_C_sub }, - [CC_OP_TSUBTV] = { compute_all_tsubtv, compute_C_sub }, - [CC_OP_LOGIC] = { compute_all_logic, compute_C_logic }, + { compute_null, compute_null }, + { compute_all_flags, compute_C_flags }, + { compute_all_div, compute_C_div }, + { compute_all_add, compute_C_add }, + { compute_all_addx, compute_C_addx }, + { compute_all_tadd, compute_C_add }, + { compute_all_taddtv, compute_C_add }, + { compute_all_sub, compute_C_sub }, + { compute_all_subx, compute_C_subx }, + { compute_all_tsub, compute_C_sub }, + { compute_all_tsubtv, compute_C_sub }, + { compute_all_logic, compute_C_logic }, }; #ifdef TARGET_SPARC64 static const CCTable xcc_table[CC_OP_NB] = { /* CC_OP_DYNAMIC should never happen */ - [CC_OP_DYNAMIC] = { compute_null, compute_null }, - [CC_OP_FLAGS] = { compute_all_flags_xcc, compute_C_flags_xcc }, - [CC_OP_DIV] = { compute_all_logic_xcc, compute_C_logic }, - [CC_OP_ADD] = { compute_all_add_xcc, compute_C_add_xcc }, - [CC_OP_ADDX] = { compute_all_addx_xcc, compute_C_addx_xcc }, - [CC_OP_TADD] = { compute_all_add_xcc, compute_C_add_xcc }, - [CC_OP_TADDTV] = { compute_all_add_xcc, compute_C_add_xcc }, - [CC_OP_SUB] = { compute_all_sub_xcc, compute_C_sub_xcc }, - [CC_OP_SUBX] = { compute_all_subx_xcc, compute_C_subx_xcc }, - [CC_OP_TSUB] = { compute_all_sub_xcc, compute_C_sub_xcc }, - [CC_OP_TSUBTV] = { compute_all_sub_xcc, compute_C_sub_xcc }, - [CC_OP_LOGIC] = { compute_all_logic_xcc, compute_C_logic }, + { compute_null, compute_null }, + { compute_all_flags_xcc, compute_C_flags_xcc }, + { compute_all_logic_xcc, compute_C_logic }, + { compute_all_add_xcc, compute_C_add_xcc }, + { compute_all_addx_xcc, compute_C_addx_xcc }, + { compute_all_add_xcc, compute_C_add_xcc }, + { compute_all_add_xcc, compute_C_add_xcc }, + { compute_all_sub_xcc, compute_C_sub_xcc }, + { compute_all_subx_xcc, compute_C_subx_xcc }, + { compute_all_sub_xcc, compute_C_sub_xcc }, + { compute_all_sub_xcc, compute_C_sub_xcc }, + { compute_all_logic_xcc, compute_C_logic }, }; #endif diff --git a/qemu/target-sparc/cpu.c b/qemu/target-sparc/cpu.c index c3f779b7..9c9c5ead 100644 --- a/qemu/target-sparc/cpu.c +++ b/qemu/target-sparc/cpu.c @@ -158,338 +158,378 @@ void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu) static const sparc_def_t sparc_defs[] = { #ifdef TARGET_SPARC64 { - .name = "Fujitsu Sparc64", - .iu_version = ((0x04ULL << 48) | (0x02ULL << 32) | (0ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 4, - .maxtl = 4, - .features = CPU_DEFAULT_FEATURES, + "Fujitsu Sparc64", + ((0x04ULL << 48) | (0x02ULL << 32) | (0ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 4, + 4, }, { - .name = "Fujitsu Sparc64 III", - .iu_version = ((0x04ULL << 48) | (0x03ULL << 32) | (0ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 5, - .maxtl = 4, - .features = CPU_DEFAULT_FEATURES, + "Fujitsu Sparc64 III", + ((0x04ULL << 48) | (0x03ULL << 32) | (0ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 5, + 4, }, { - .name = "Fujitsu Sparc64 IV", - .iu_version = ((0x04ULL << 48) | (0x04ULL << 32) | (0ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "Fujitsu Sparc64 IV", + ((0x04ULL << 48) | (0x04ULL << 32) | (0ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, { - .name = "Fujitsu Sparc64 V", - .iu_version = ((0x04ULL << 48) | (0x05ULL << 32) | (0x51ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "Fujitsu Sparc64 V", + ((0x04ULL << 48) | (0x05ULL << 32) | (0x51ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, { - .name = "TI UltraSparc I", - .iu_version = ((0x17ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "TI UltraSparc I", + ((0x17ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, { - .name = "TI UltraSparc II", - .iu_version = ((0x17ULL << 48) | (0x11ULL << 32) | (0x20ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "TI UltraSparc II", + ((0x17ULL << 48) | (0x11ULL << 32) | (0x20ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, { - .name = "TI UltraSparc IIi", - .iu_version = ((0x17ULL << 48) | (0x12ULL << 32) | (0x91ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "TI UltraSparc IIi", + ((0x17ULL << 48) | (0x12ULL << 32) | (0x91ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, { - .name = "TI UltraSparc IIe", - .iu_version = ((0x17ULL << 48) | (0x13ULL << 32) | (0x14ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "TI UltraSparc IIe", + ((0x17ULL << 48) | (0x13ULL << 32) | (0x14ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, { - .name = "Sun UltraSparc III", - .iu_version = ((0x3eULL << 48) | (0x14ULL << 32) | (0x34ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "Sun UltraSparc III", + ((0x3eULL << 48) | (0x14ULL << 32) | (0x34ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, { - .name = "Sun UltraSparc III Cu", - .iu_version = ((0x3eULL << 48) | (0x15ULL << 32) | (0x41ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_3, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "Sun UltraSparc III Cu", + ((0x3eULL << 48) | (0x15ULL << 32) | (0x41ULL << 24)), + 0x00000000, + mmu_us_3, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, { - .name = "Sun UltraSparc IIIi", - .iu_version = ((0x3eULL << 48) | (0x16ULL << 32) | (0x34ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "Sun UltraSparc IIIi", + ((0x3eULL << 48) | (0x16ULL << 32) | (0x34ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, { - .name = "Sun UltraSparc IV", - .iu_version = ((0x3eULL << 48) | (0x18ULL << 32) | (0x31ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_4, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "Sun UltraSparc IV", + ((0x3eULL << 48) | (0x18ULL << 32) | (0x31ULL << 24)), + 0x00000000, + mmu_us_4, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, { - .name = "Sun UltraSparc IV+", - .iu_version = ((0x3eULL << 48) | (0x19ULL << 32) | (0x22ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_CMT, + "Sun UltraSparc IV+", + ((0x3eULL << 48) | (0x19ULL << 32) | (0x22ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES | CPU_FEATURE_CMT, + 8, + 5, }, { - .name = "Sun UltraSparc IIIi+", - .iu_version = ((0x3eULL << 48) | (0x22ULL << 32) | (0ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_3, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "Sun UltraSparc IIIi+", + ((0x3eULL << 48) | (0x22ULL << 32) | (0ULL << 24)), + 0x00000000, + mmu_us_3, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, { - .name = "Sun UltraSparc T1", + "Sun UltraSparc T1", /* defined in sparc_ifu_fdp.v and ctu.h */ - .iu_version = ((0x3eULL << 48) | (0x23ULL << 32) | (0x02ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_sun4v, - .nwindows = 8, - .maxtl = 6, - .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_HYPV | CPU_FEATURE_CMT - | CPU_FEATURE_GL, + ((0x3eULL << 48) | (0x23ULL << 32) | (0x02ULL << 24)), + 0x00000000, + mmu_sun4v, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES | CPU_FEATURE_HYPV | CPU_FEATURE_CMT + | CPU_FEATURE_GL, + 8, + 6, }, { - .name = "Sun UltraSparc T2", + "Sun UltraSparc T2", /* defined in tlu_asi_ctl.v and n2_revid_cust.v */ - .iu_version = ((0x3eULL << 48) | (0x24ULL << 32) | (0x02ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_sun4v, - .nwindows = 8, - .maxtl = 6, - .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_HYPV | CPU_FEATURE_CMT - | CPU_FEATURE_GL, + ((0x3eULL << 48) | (0x24ULL << 32) | (0x02ULL << 24)), + 0x00000000, + mmu_sun4v, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES | CPU_FEATURE_HYPV | CPU_FEATURE_CMT + | CPU_FEATURE_GL, + 8, + 6, }, { - .name = "NEC UltraSparc I", - .iu_version = ((0x22ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)), - .fpu_version = 0x00000000, - .mmu_version = mmu_us_12, - .nwindows = 8, - .maxtl = 5, - .features = CPU_DEFAULT_FEATURES, + "NEC UltraSparc I", + ((0x22ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)), + 0x00000000, + mmu_us_12, + 0,0,0,0,0,0, + CPU_DEFAULT_FEATURES, + 8, + 5, }, #else { - .name = "Fujitsu MB86904", - .iu_version = 0x04 << 24, /* Impl 0, ver 4 */ - .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ - .mmu_version = 0x04 << 24, /* Impl 0, ver 4 */ - .mmu_bm = 0x00004000, - .mmu_ctpr_mask = 0x00ffffc0, - .mmu_cxr_mask = 0x000000ff, - .mmu_sfsr_mask = 0x00016fff, - .mmu_trcr_mask = 0x00ffffff, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES, + "Fujitsu MB86904", + 0x04 << 24, /* Impl 0, ver 4 */ + 4 << 17, /* FPU version 4 (Meiko) */ + 0x04 << 24, /* Impl 0, ver 4 */ + 0x00004000, + 0x00ffffc0, + 0x000000ff, + 0x00016fff, + 0x00ffffff, + 0, + CPU_DEFAULT_FEATURES, + 8, + 0, }, { - .name = "Fujitsu MB86907", - .iu_version = 0x05 << 24, /* Impl 0, ver 5 */ - .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ - .mmu_version = 0x05 << 24, /* Impl 0, ver 5 */ - .mmu_bm = 0x00004000, - .mmu_ctpr_mask = 0xffffffc0, - .mmu_cxr_mask = 0x000000ff, - .mmu_sfsr_mask = 0x00016fff, - .mmu_trcr_mask = 0xffffffff, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES, + "Fujitsu MB86907", + 0x05 << 24, /* Impl 0, ver 5 */ + 4 << 17, /* FPU version 4 (Meiko) */ + 0x05 << 24, /* Impl 0, ver 5 */ + 0x00004000, + 0xffffffc0, + 0x000000ff, + 0x00016fff, + 0xffffffff, + 0, + CPU_DEFAULT_FEATURES, + 8, + 0, }, { - .name = "TI MicroSparc I", - .iu_version = 0x41000000, - .fpu_version = 4 << 17, - .mmu_version = 0x41000000, - .mmu_bm = 0x00004000, - .mmu_ctpr_mask = 0x007ffff0, - .mmu_cxr_mask = 0x0000003f, - .mmu_sfsr_mask = 0x00016fff, - .mmu_trcr_mask = 0x0000003f, - .nwindows = 7, - .features = CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_MUL | - CPU_FEATURE_DIV | CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT | - CPU_FEATURE_FMUL, + "TI MicroSparc I", + 0x41000000, + 4 << 17, + 0x41000000, + 0x00004000, + 0x007ffff0, + 0x0000003f, + 0x00016fff, + 0x0000003f, + 0, + CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | CPU_FEATURE_MUL | + CPU_FEATURE_DIV | CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT | + CPU_FEATURE_FMUL, + 7, + 0, }, { - .name = "TI MicroSparc II", - .iu_version = 0x42000000, - .fpu_version = 4 << 17, - .mmu_version = 0x02000000, - .mmu_bm = 0x00004000, - .mmu_ctpr_mask = 0x00ffffc0, - .mmu_cxr_mask = 0x000000ff, - .mmu_sfsr_mask = 0x00016fff, - .mmu_trcr_mask = 0x00ffffff, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES, + "TI MicroSparc II", + 0x42000000, + 4 << 17, + 0x02000000, + 0x00004000, + 0x00ffffc0, + 0x000000ff, + 0x00016fff, + 0x00ffffff, + 0, + CPU_DEFAULT_FEATURES, + 8, + 0, }, { - .name = "TI MicroSparc IIep", - .iu_version = 0x42000000, - .fpu_version = 4 << 17, - .mmu_version = 0x04000000, - .mmu_bm = 0x00004000, - .mmu_ctpr_mask = 0x00ffffc0, - .mmu_cxr_mask = 0x000000ff, - .mmu_sfsr_mask = 0x00016bff, - .mmu_trcr_mask = 0x00ffffff, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES, + "TI MicroSparc IIep", + 0x42000000, + 4 << 17, + 0x04000000, + 0x00004000, + 0x00ffffc0, + 0x000000ff, + 0x00016bff, + 0x00ffffff, + 0, + CPU_DEFAULT_FEATURES, + 8, + 0, }, { - .name = "TI SuperSparc 40", /* STP1020NPGA */ - .iu_version = 0x41000000, /* SuperSPARC 2.x */ - .fpu_version = 0 << 17, - .mmu_version = 0x00000800, /* SuperSPARC 2.x, no MXCC */ - .mmu_bm = 0x00002000, - .mmu_ctpr_mask = 0xffffffc0, - .mmu_cxr_mask = 0x0000ffff, - .mmu_sfsr_mask = 0xffffffff, - .mmu_trcr_mask = 0xffffffff, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES, + "TI SuperSparc 40", /* STP1020NPGA */ + 0x41000000, /* SuperSPARC 2.x */ + 0 << 17, + 0x00000800, /* SuperSPARC 2.x, no MXCC */ + 0x00002000, + 0xffffffc0, + 0x0000ffff, + 0xffffffff, + 0xffffffff, + 0, + CPU_DEFAULT_FEATURES, + 8, + 0, }, { - .name = "TI SuperSparc 50", /* STP1020PGA */ - .iu_version = 0x40000000, /* SuperSPARC 3.x */ - .fpu_version = 0 << 17, - .mmu_version = 0x01000800, /* SuperSPARC 3.x, no MXCC */ - .mmu_bm = 0x00002000, - .mmu_ctpr_mask = 0xffffffc0, - .mmu_cxr_mask = 0x0000ffff, - .mmu_sfsr_mask = 0xffffffff, - .mmu_trcr_mask = 0xffffffff, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES, + "TI SuperSparc 50", /* STP1020PGA */ + 0x40000000, /* SuperSPARC 3.x */ + 0 << 17, + 0x01000800, /* SuperSPARC 3.x, no MXCC */ + 0x00002000, + 0xffffffc0, + 0x0000ffff, + 0xffffffff, + 0xffffffff, + 0, + CPU_DEFAULT_FEATURES, + 8, + 0, }, { - .name = "TI SuperSparc 51", - .iu_version = 0x40000000, /* SuperSPARC 3.x */ - .fpu_version = 0 << 17, - .mmu_version = 0x01000000, /* SuperSPARC 3.x, MXCC */ - .mmu_bm = 0x00002000, - .mmu_ctpr_mask = 0xffffffc0, - .mmu_cxr_mask = 0x0000ffff, - .mmu_sfsr_mask = 0xffffffff, - .mmu_trcr_mask = 0xffffffff, - .mxcc_version = 0x00000104, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES, + "TI SuperSparc 51", + 0x40000000, /* SuperSPARC 3.x */ + 0 << 17, + 0x01000000, /* SuperSPARC 3.x, MXCC */ + 0x00002000, + 0xffffffc0, + 0x0000ffff, + 0xffffffff, + 0xffffffff, + 0x00000104, + CPU_DEFAULT_FEATURES, + 8, + 0, }, { - .name = "TI SuperSparc 60", /* STP1020APGA */ - .iu_version = 0x40000000, /* SuperSPARC 3.x */ - .fpu_version = 0 << 17, - .mmu_version = 0x01000800, /* SuperSPARC 3.x, no MXCC */ - .mmu_bm = 0x00002000, - .mmu_ctpr_mask = 0xffffffc0, - .mmu_cxr_mask = 0x0000ffff, - .mmu_sfsr_mask = 0xffffffff, - .mmu_trcr_mask = 0xffffffff, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES, + "TI SuperSparc 60", /* STP1020APGA */ + 0x40000000, /* SuperSPARC 3.x */ + 0 << 17, + 0x01000800, /* SuperSPARC 3.x, no MXCC */ + 0x00002000, + 0xffffffc0, + 0x0000ffff, + 0xffffffff, + 0xffffffff, + 0, + CPU_DEFAULT_FEATURES, + 8, + 0, }, { - .name = "TI SuperSparc 61", - .iu_version = 0x44000000, /* SuperSPARC 3.x */ - .fpu_version = 0 << 17, - .mmu_version = 0x01000000, /* SuperSPARC 3.x, MXCC */ - .mmu_bm = 0x00002000, - .mmu_ctpr_mask = 0xffffffc0, - .mmu_cxr_mask = 0x0000ffff, - .mmu_sfsr_mask = 0xffffffff, - .mmu_trcr_mask = 0xffffffff, - .mxcc_version = 0x00000104, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES, + "TI SuperSparc 61", + 0x44000000, /* SuperSPARC 3.x */ + 0 << 17, + 0x01000000, /* SuperSPARC 3.x, MXCC */ + 0x00002000, + 0xffffffc0, + 0x0000ffff, + 0xffffffff, + 0xffffffff, + 0x00000104, + CPU_DEFAULT_FEATURES, + 8, + 0, }, { - .name = "TI SuperSparc II", - .iu_version = 0x40000000, /* SuperSPARC II 1.x */ - .fpu_version = 0 << 17, - .mmu_version = 0x08000000, /* SuperSPARC II 1.x, MXCC */ - .mmu_bm = 0x00002000, - .mmu_ctpr_mask = 0xffffffc0, - .mmu_cxr_mask = 0x0000ffff, - .mmu_sfsr_mask = 0xffffffff, - .mmu_trcr_mask = 0xffffffff, - .mxcc_version = 0x00000104, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES, + "TI SuperSparc II", + 0x40000000, /* SuperSPARC II 1.x */ + 0 << 17, + 0x08000000, /* SuperSPARC II 1.x, MXCC */ + 0x00002000, + 0xffffffc0, + 0x0000ffff, + 0xffffffff, + 0xffffffff, + 0x00000104, + CPU_DEFAULT_FEATURES, + 8, + 0, }, { - .name = "LEON2", - .iu_version = 0xf2000000, - .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ - .mmu_version = 0xf2000000, - .mmu_bm = 0x00004000, - .mmu_ctpr_mask = 0x007ffff0, - .mmu_cxr_mask = 0x0000003f, - .mmu_sfsr_mask = 0xffffffff, - .mmu_trcr_mask = 0xffffffff, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_TA0_SHUTDOWN, + "LEON2", + 0xf2000000, + 4 << 17, /* FPU version 4 (Meiko) */ + 0xf2000000, + 0x00004000, + 0x007ffff0, + 0x0000003f, + 0xffffffff, + 0xffffffff, + 0, + CPU_DEFAULT_FEATURES | CPU_FEATURE_TA0_SHUTDOWN, + 8, + 0, }, { - .name = "LEON3", - .iu_version = 0xf3000000, - .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ - .mmu_version = 0xf3000000, - .mmu_bm = 0x00000000, - .mmu_ctpr_mask = 0xfffffffc, - .mmu_cxr_mask = 0x000000ff, - .mmu_sfsr_mask = 0xffffffff, - .mmu_trcr_mask = 0xffffffff, - .nwindows = 8, - .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_TA0_SHUTDOWN | - CPU_FEATURE_ASR17 | CPU_FEATURE_CACHE_CTRL | CPU_FEATURE_POWERDOWN | - CPU_FEATURE_CASA, + "LEON3", + 0xf3000000, + 4 << 17, /* FPU version 4 (Meiko) */ + 0xf3000000, + 0x00000000, + 0xfffffffc, + 0x000000ff, + 0xffffffff, + 0xffffffff, + 0, + CPU_DEFAULT_FEATURES | CPU_FEATURE_TA0_SHUTDOWN | + CPU_FEATURE_ASR17 | CPU_FEATURE_CACHE_CTRL | CPU_FEATURE_POWERDOWN | + CPU_FEATURE_CASA, + 8, + 0, }, #endif }; @@ -857,16 +897,25 @@ static void sparc_cpu_class_init(struct uc_struct *uc, ObjectClass *oc, void *da void sparc_cpu_register_types(void *opaque) { - TypeInfo sparc_cpu_type_info = { - .name = TYPE_SPARC_CPU, - .parent = TYPE_CPU, - .instance_userdata = opaque, - .instance_size = sizeof(SPARCCPU), - .instance_init = sparc_cpu_initfn, - .instance_finalize = sparc_cpu_uninitfn, - .abstract = false, - .class_size = sizeof(SPARCCPUClass), - .class_init = sparc_cpu_class_init, + const TypeInfo sparc_cpu_type_info = { + TYPE_SPARC_CPU, + TYPE_CPU, + + sizeof(SPARCCPUClass), + sizeof(SPARCCPU), + opaque, + + sparc_cpu_initfn, + NULL, + sparc_cpu_uninitfn, + + NULL, + + sparc_cpu_class_init, + NULL, + NULL, + + false, }; //printf(">>> sparc_cpu_register_types\n"); diff --git a/qemu/target-sparc/int64_helper.c b/qemu/target-sparc/int64_helper.c index 9421f0a0..7eba49c3 100644 --- a/qemu/target-sparc/int64_helper.c +++ b/qemu/target-sparc/int64_helper.c @@ -63,9 +63,9 @@ void sparc_cpu_do_interrupt(CPUState *cs) break; case TT_TFAULT: case TT_DFAULT: - case TT_TMISS ... TT_TMISS + 3: - case TT_DMISS ... TT_DMISS + 3: - case TT_DPROT ... TT_DPROT + 3: + case TT_TMISS: case TT_TMISS+1: case TT_TMISS+2: case TT_TMISS+3: + case TT_DMISS: case TT_DMISS+1: case TT_DMISS+2: case TT_DMISS+3: + case TT_DPROT: case TT_DPROT+1: case TT_DPROT+2: case TT_DPROT+3: cpu_change_pstate(env, PS_PEF | PS_PRIV | PS_MG); break; default: diff --git a/qemu/target-sparc/ldst_helper.c b/qemu/target-sparc/ldst_helper.c index 95bf42e1..94f75d02 100644 --- a/qemu/target-sparc/ldst_helper.c +++ b/qemu/target-sparc/ldst_helper.c @@ -558,7 +558,9 @@ uint64_t helper_ld_asi(CPUSPARCState *env, target_ulong addr, int asi, int size, break; } break; - case 0x21 ... 0x2f: /* MMU passthrough, 0x100000000 to 0xfffffffff */ + /* MMU passthrough, 0x100000000 to 0xfffffffff */ + case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: + case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: switch (size) { case 1: ret = ldub_phys(cs->as, (hwaddr)addr @@ -964,7 +966,9 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr, uint64_t val, int asi, } } break; - case 0x21 ... 0x2f: /* MMU passthrough, 0x100000000 to 0xfffffffff */ + /* MMU passthrough, 0x100000000 to 0xfffffffff */ + case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: + case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: { switch (size) { case 1: @@ -1052,17 +1056,18 @@ static inline int is_translating_asi(int asi) /* Ultrasparc IIi translating asi - note this list is defined by cpu implementation */ - switch (asi) { - case 0x04 ... 0x11: - case 0x16 ... 0x19: - case 0x1E ... 0x1F: - case 0x24 ... 0x2C: - case 0x70 ... 0x73: - case 0x78 ... 0x79: - case 0x80 ... 0xFF: + if( (asi >= 0x04 && asi <= 0x11) || + (asi >= 0x16 && asi <= 0x19) || + (asi >= 0x1E && asi <= 0x1F) || + (asi >= 0x24 && asi <= 0x2C) || + (asi >= 0x70 && asi <= 0x73) || + (asi >= 0x78 && asi <= 0x79) || + (asi >= 0x80 && asi <= 0xFF) ) + { return 1; - - default: + } + else + { return 0; } #else @@ -1303,7 +1308,7 @@ uint64_t helper_ld_asi(CPUSPARCState *env, target_ulong addr, int asi, int size, mmu_idx = (asi & 1) ? MMU_USER_SECONDARY_IDX : MMU_USER_IDX; } - if (cpu_get_phys_page_nofault(env, addr, mmu_idx) == -1ULL) { + if (cpu_get_phys_page_nofault(env, addr, mmu_idx) == (0-1ULL)) { #ifdef DEBUG_ASI dump_asi("read ", last_addr, asi, size, ret); #endif diff --git a/qemu/target-sparc/translate.c b/qemu/target-sparc/translate.c index 4a6fabe7..56df1845 100644 --- a/qemu/target-sparc/translate.c +++ b/qemu/target-sparc/translate.c @@ -2833,14 +2833,14 @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn, bool hook_ins switch(rs1) { case 0: /* rdy */ #ifndef TARGET_SPARC64 - case 0x01 ... 0x0e: /* undefined in the SPARCv8 - manual, rdy on the microSPARC - II */ - case 0x0f: /* stbar in the SPARCv8 manual, - rdy on the microSPARC II */ - case 0x10 ... 0x1f: /* implementation-dependent in the - SPARCv8 manual, rdy on the - microSPARC II */ + /* undefined in the SPARCv8 manual, rdy on the microSPARC II */ + case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: + case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: + /* stbar in the SPARCv8 manual, rdy on the microSPARC II */ + case 0x0f: + /* implementation-dependent in the SPARCv8 manual, rdy on the microSPARC II */ + case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: + case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: /* Read Asr17 */ if (rs1 == 0x11 && dc->def->features & CPU_FEATURE_ASR17) { TCGv t = gen_dest_gpr(dc, rd); @@ -3747,14 +3747,13 @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn, bool hook_ins tcg_gen_andi_tl(tcg_ctx, *(TCGv *)tcg_ctx->cpu_y, cpu_tmp0, 0xffffffff); break; #ifndef TARGET_SPARC64 - case 0x01 ... 0x0f: /* undefined in the - SPARCv8 manual, nop - on the microSPARC - II */ - case 0x10 ... 0x1f: /* implementation-dependent - in the SPARCv8 - manual, nop on the - microSPARC II */ + /* undefined in the SPARCv8 manual, nop on the microSPARC II */ + case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: + case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: + + /* implementation-dependent in the SPARCv8 manual, nop on the microSPARC II */ + case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: + case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: if ((rd == 0x13) && (dc->def->features & CPU_FEATURE_POWERDOWN)) { /* LEON3 power-down */